]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/2225'
[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                         return true;
287                 } catch (e) {
288                         return false;
289                 }
290         };
291
292         var keys = Object.keys;
293
294         var shim$4 = function (object) { return keys(isValue(object) ? Object(object) : object); };
295
296         var keys$1 = isImplemented$5() ? Object.keys : shim$4;
297
298         var max$1   = Math.max;
299
300         var shim$5 = function (dest, src /*, …srcn*/) {
301                 var error, i, length = max$1(arguments.length, 2), assign;
302                 dest = Object(validValue(dest));
303                 assign = function (key) {
304                         try {
305                                 dest[key] = src[key];
306                         } catch (e) {
307                                 if (!error) error = e;
308                         }
309                 };
310                 for (i = 1; i < length; ++i) {
311                         src = arguments[i];
312                         keys$1(src).forEach(assign);
313                 }
314                 if (error !== undefined) throw error;
315                 return dest;
316         };
317
318         var assign = isImplemented$4()
319                 ? Object.assign
320                 : shim$5;
321
322         var forEach = Array.prototype.forEach, create$2 = Object.create;
323
324         var process$1 = function (src, obj) {
325                 var key;
326                 for (key in src) obj[key] = src[key];
327         };
328
329         // eslint-disable-next-line no-unused-vars
330         var normalizeOptions = function (opts1 /*, …options*/) {
331                 var result = create$2(null);
332                 forEach.call(arguments, function (options) {
333                         if (!isValue(options)) return;
334                         process$1(Object(options), result);
335                 });
336                 return result;
337         };
338
339         // Deprecated
340
341         var isCallable = function (obj) {
342          return typeof obj === "function";
343         };
344
345         var str = "razdwatrzy";
346
347         var isImplemented$6 = function () {
348                 if (typeof str.contains !== "function") return false;
349                 return (str.contains("dwa") === true) && (str.contains("foo") === false);
350         };
351
352         var indexOf$1 = String.prototype.indexOf;
353
354         var shim$6 = function (searchString/*, position*/) {
355                 return indexOf$1.call(this, searchString, arguments[1]) > -1;
356         };
357
358         var contains = isImplemented$6()
359                 ? String.prototype.contains
360                 : shim$6;
361
362         var d_1 = createCommonjsModule(function (module) {
363
364         var d;
365
366         d = module.exports = function (dscr, value/*, options*/) {
367                 var c, e, w, options, desc;
368                 if ((arguments.length < 2) || (typeof dscr !== 'string')) {
369                         options = value;
370                         value = dscr;
371                         dscr = null;
372                 } else {
373                         options = arguments[2];
374                 }
375                 if (dscr == null) {
376                         c = w = true;
377                         e = false;
378                 } else {
379                         c = contains.call(dscr, 'c');
380                         e = contains.call(dscr, 'e');
381                         w = contains.call(dscr, 'w');
382                 }
383
384                 desc = { value: value, configurable: c, enumerable: e, writable: w };
385                 return !options ? desc : assign(normalizeOptions(options), desc);
386         };
387
388         d.gs = function (dscr, get, set/*, options*/) {
389                 var c, e, options, desc;
390                 if (typeof dscr !== 'string') {
391                         options = set;
392                         set = get;
393                         get = dscr;
394                         dscr = null;
395                 } else {
396                         options = arguments[3];
397                 }
398                 if (get == null) {
399                         get = undefined;
400                 } else if (!isCallable(get)) {
401                         options = get;
402                         get = set = undefined;
403                 } else if (set == null) {
404                         set = undefined;
405                 } else if (!isCallable(set)) {
406                         options = set;
407                         set = undefined;
408                 }
409                 if (dscr == null) {
410                         c = true;
411                         e = false;
412                 } else {
413                         c = contains.call(dscr, 'c');
414                         e = contains.call(dscr, 'e');
415                 }
416
417                 desc = { get: get, set: set, configurable: c, enumerable: e };
418                 return !options ? desc : assign(normalizeOptions(options), desc);
419         };
420         });
421
422         var eventEmitter = createCommonjsModule(function (module, exports) {
423
424         var apply = Function.prototype.apply, call = Function.prototype.call
425           , create = Object.create, defineProperty = Object.defineProperty
426           , defineProperties = Object.defineProperties
427           , hasOwnProperty = Object.prototype.hasOwnProperty
428           , descriptor = { configurable: true, enumerable: false, writable: true }
429
430           , on, once, off, emit, methods, descriptors, base;
431
432         on = function (type, listener) {
433                 var data;
434
435                 validCallable(listener);
436
437                 if (!hasOwnProperty.call(this, '__ee__')) {
438                         data = descriptor.value = create(null);
439                         defineProperty(this, '__ee__', descriptor);
440                         descriptor.value = null;
441                 } else {
442                         data = this.__ee__;
443                 }
444                 if (!data[type]) data[type] = listener;
445                 else if (typeof data[type] === 'object') data[type].push(listener);
446                 else data[type] = [data[type], listener];
447
448                 return this;
449         };
450
451         once = function (type, listener) {
452                 var once, self;
453
454                 validCallable(listener);
455                 self = this;
456                 on.call(this, type, once = function () {
457                         off.call(self, type, once);
458                         apply.call(listener, this, arguments);
459                 });
460
461                 once.__eeOnceListener__ = listener;
462                 return this;
463         };
464
465         off = function (type, listener) {
466                 var data, listeners, candidate, i;
467
468                 validCallable(listener);
469
470                 if (!hasOwnProperty.call(this, '__ee__')) return this;
471                 data = this.__ee__;
472                 if (!data[type]) return this;
473                 listeners = data[type];
474
475                 if (typeof listeners === 'object') {
476                         for (i = 0; (candidate = listeners[i]); ++i) {
477                                 if ((candidate === listener) ||
478                                                 (candidate.__eeOnceListener__ === listener)) {
479                                         if (listeners.length === 2) data[type] = listeners[i ? 0 : 1];
480                                         else listeners.splice(i, 1);
481                                 }
482                         }
483                 } else {
484                         if ((listeners === listener) ||
485                                         (listeners.__eeOnceListener__ === listener)) {
486                                 delete data[type];
487                         }
488                 }
489
490                 return this;
491         };
492
493         emit = function (type) {
494                 var i, l, listener, listeners, args;
495
496                 if (!hasOwnProperty.call(this, '__ee__')) return;
497                 listeners = this.__ee__[type];
498                 if (!listeners) return;
499
500                 if (typeof listeners === 'object') {
501                         l = arguments.length;
502                         args = new Array(l - 1);
503                         for (i = 1; i < l; ++i) args[i - 1] = arguments[i];
504
505                         listeners = listeners.slice();
506                         for (i = 0; (listener = listeners[i]); ++i) {
507                                 apply.call(listener, this, args);
508                         }
509                 } else {
510                         switch (arguments.length) {
511                         case 1:
512                                 call.call(listeners, this);
513                                 break;
514                         case 2:
515                                 call.call(listeners, this, arguments[1]);
516                                 break;
517                         case 3:
518                                 call.call(listeners, this, arguments[1], arguments[2]);
519                                 break;
520                         default:
521                                 l = arguments.length;
522                                 args = new Array(l - 1);
523                                 for (i = 1; i < l; ++i) {
524                                         args[i - 1] = arguments[i];
525                                 }
526                                 apply.call(listeners, this, args);
527                         }
528                 }
529         };
530
531         methods = {
532                 on: on,
533                 once: once,
534                 off: off,
535                 emit: emit
536         };
537
538         descriptors = {
539                 on: d_1(on),
540                 once: d_1(once),
541                 off: d_1(off),
542                 emit: d_1(emit)
543         };
544
545         base = defineProperties({}, descriptors);
546
547         module.exports = exports = function (o) {
548                 return (o == null) ? create(base) : defineProperties(Object(o), descriptors);
549         };
550         exports.methods = methods;
551         });
552         var eventEmitter_1 = eventEmitter.methods;
553
554         var validTypes = { object: true, symbol: true };
555
556         var isImplemented$7 = function () {
557                 if (typeof Symbol !== 'function') return false;
558                 try { } catch (e) { return false; }
559
560                 // Return 'true' also for polyfills
561                 if (!validTypes[typeof Symbol.iterator]) return false;
562                 if (!validTypes[typeof Symbol.toPrimitive]) return false;
563                 if (!validTypes[typeof Symbol.toStringTag]) return false;
564
565                 return true;
566         };
567
568         var isSymbol = function (x) {
569                 if (!x) return false;
570                 if (typeof x === 'symbol') return true;
571                 if (!x.constructor) return false;
572                 if (x.constructor.name !== 'Symbol') return false;
573                 return (x[x.constructor.toStringTag] === 'Symbol');
574         };
575
576         var validateSymbol = function (value) {
577                 if (!isSymbol(value)) throw new TypeError(value + " is not a symbol");
578                 return value;
579         };
580
581         var create$3 = Object.create, defineProperties = Object.defineProperties
582           , defineProperty$1 = Object.defineProperty, objPrototype = Object.prototype
583           , NativeSymbol, SymbolPolyfill, HiddenSymbol, globalSymbols = create$3(null)
584           , isNativeSafe;
585
586         if (typeof Symbol === 'function') {
587                 NativeSymbol = Symbol;
588                 try {
589                         String(NativeSymbol());
590                         isNativeSafe = true;
591                 } catch (ignore) {}
592         }
593
594         var generateName = (function () {
595                 var created = create$3(null);
596                 return function (desc) {
597                         var postfix = 0, name, ie11BugWorkaround;
598                         while (created[desc + (postfix || '')]) ++postfix;
599                         desc += (postfix || '');
600                         created[desc] = true;
601                         name = '@@' + desc;
602                         defineProperty$1(objPrototype, name, d_1.gs(null, function (value) {
603                                 // For IE11 issue see:
604                                 // https://connect.microsoft.com/IE/feedbackdetail/view/1928508/
605                                 //    ie11-broken-getters-on-dom-objects
606                                 // https://github.com/medikoo/es6-symbol/issues/12
607                                 if (ie11BugWorkaround) return;
608                                 ie11BugWorkaround = true;
609                                 defineProperty$1(this, name, d_1(value));
610                                 ie11BugWorkaround = false;
611                         }));
612                         return name;
613                 };
614         }());
615
616         // Internal constructor (not one exposed) for creating Symbol instances.
617         // This one is used to ensure that `someSymbol instanceof Symbol` always return false
618         HiddenSymbol = function Symbol(description) {
619                 if (this instanceof HiddenSymbol) throw new TypeError('Symbol is not a constructor');
620                 return SymbolPolyfill(description);
621         };
622
623         // Exposed `Symbol` constructor
624         // (returns instances of HiddenSymbol)
625         var polyfill = SymbolPolyfill = function Symbol(description) {
626                 var symbol;
627                 if (this instanceof Symbol) throw new TypeError('Symbol is not a constructor');
628                 if (isNativeSafe) return NativeSymbol(description);
629                 symbol = create$3(HiddenSymbol.prototype);
630                 description = (description === undefined ? '' : String(description));
631                 return defineProperties(symbol, {
632                         __description__: d_1('', description),
633                         __name__: d_1('', generateName(description))
634                 });
635         };
636         defineProperties(SymbolPolyfill, {
637                 for: d_1(function (key) {
638                         if (globalSymbols[key]) return globalSymbols[key];
639                         return (globalSymbols[key] = SymbolPolyfill(String(key)));
640                 }),
641                 keyFor: d_1(function (s) {
642                         var key;
643                         validateSymbol(s);
644                         for (key in globalSymbols) if (globalSymbols[key] === s) return key;
645                 }),
646
647                 // To ensure proper interoperability with other native functions (e.g. Array.from)
648                 // fallback to eventual native implementation of given symbol
649                 hasInstance: d_1('', (NativeSymbol && NativeSymbol.hasInstance) || SymbolPolyfill('hasInstance')),
650                 isConcatSpreadable: d_1('', (NativeSymbol && NativeSymbol.isConcatSpreadable) ||
651                         SymbolPolyfill('isConcatSpreadable')),
652                 iterator: d_1('', (NativeSymbol && NativeSymbol.iterator) || SymbolPolyfill('iterator')),
653                 match: d_1('', (NativeSymbol && NativeSymbol.match) || SymbolPolyfill('match')),
654                 replace: d_1('', (NativeSymbol && NativeSymbol.replace) || SymbolPolyfill('replace')),
655                 search: d_1('', (NativeSymbol && NativeSymbol.search) || SymbolPolyfill('search')),
656                 species: d_1('', (NativeSymbol && NativeSymbol.species) || SymbolPolyfill('species')),
657                 split: d_1('', (NativeSymbol && NativeSymbol.split) || SymbolPolyfill('split')),
658                 toPrimitive: d_1('', (NativeSymbol && NativeSymbol.toPrimitive) || SymbolPolyfill('toPrimitive')),
659                 toStringTag: d_1('', (NativeSymbol && NativeSymbol.toStringTag) || SymbolPolyfill('toStringTag')),
660                 unscopables: d_1('', (NativeSymbol && NativeSymbol.unscopables) || SymbolPolyfill('unscopables'))
661         });
662
663         // Internal tweaks for real symbol producer
664         defineProperties(HiddenSymbol.prototype, {
665                 constructor: d_1(SymbolPolyfill),
666                 toString: d_1('', function () { return this.__name__; })
667         });
668
669         // Proper implementation of methods exposed on Symbol.prototype
670         // They won't be accessible on produced symbol instances as they derive from HiddenSymbol.prototype
671         defineProperties(SymbolPolyfill.prototype, {
672                 toString: d_1(function () { return 'Symbol (' + validateSymbol(this).__description__ + ')'; }),
673                 valueOf: d_1(function () { return validateSymbol(this); })
674         });
675         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toPrimitive, d_1('', function () {
676                 var symbol = validateSymbol(this);
677                 if (typeof symbol === 'symbol') return symbol;
678                 return symbol.toString();
679         }));
680         defineProperty$1(SymbolPolyfill.prototype, SymbolPolyfill.toStringTag, d_1('c', 'Symbol'));
681
682         // Proper implementaton of toPrimitive and toStringTag for returned symbol instances
683         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toStringTag,
684                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toStringTag]));
685
686         // Note: It's important to define `toPrimitive` as last one, as some implementations
687         // implement `toPrimitive` natively without implementing `toStringTag` (or other specified symbols)
688         // And that may invoke error in definition flow:
689         // See: https://github.com/medikoo/es6-symbol/issues/13#issuecomment-164146149
690         defineProperty$1(HiddenSymbol.prototype, SymbolPolyfill.toPrimitive,
691                 d_1('c', SymbolPolyfill.prototype[SymbolPolyfill.toPrimitive]));
692
693         var es6Symbol = isImplemented$7() ? Symbol : polyfill;
694
695         var objToString = Object.prototype.toString
696           , id = objToString.call(
697                 (function () {
698                         return arguments;
699                 })()
700         );
701
702         var isArguments = function (value) {
703                 return objToString.call(value) === id;
704         };
705
706         var objToString$1 = Object.prototype.toString, id$1 = objToString$1.call("");
707
708         var isString = function (value) {
709                 return (
710                         typeof value === "string" ||
711                         (value &&
712                                 typeof value === "object" &&
713                                 (value instanceof String || objToString$1.call(value) === id$1)) ||
714                         false
715                 );
716         };
717
718         var iteratorSymbol = es6Symbol.iterator
719           , isArray        = Array.isArray;
720
721         var isIterable = function (value) {
722                 if (!isValue(value)) return false;
723                 if (isArray(value)) return true;
724                 if (isString(value)) return true;
725                 if (isArguments(value)) return true;
726                 return typeof value[iteratorSymbol] === "function";
727         };
728
729         var validIterable = function (value) {
730                 if (!isIterable(value)) throw new TypeError(value + " is not iterable");
731                 return value;
732         };
733
734         var isImplemented$8 = function () {
735                 var from = Array.from, arr, result;
736                 if (typeof from !== "function") return false;
737                 arr = ["raz", "dwa"];
738                 result = from(arr);
739                 return Boolean(result && (result !== arr) && (result[1] === "dwa"));
740         };
741
742         var objToString$2 = Object.prototype.toString, id$2 = objToString$2.call(noop);
743
744         var isFunction = function (value) {
745                 return typeof value === "function" && objToString$2.call(value) === id$2;
746         };
747
748         var iteratorSymbol$1 = es6Symbol.iterator
749           , isArray$1        = Array.isArray
750           , call           = Function.prototype.call
751           , desc           = { configurable: true, enumerable: true, writable: true, value: null }
752           , defineProperty$2 = Object.defineProperty;
753
754         // eslint-disable-next-line complexity, max-lines-per-function
755         var shim$7 = function (arrayLike /*, mapFn, thisArg*/) {
756                 var mapFn = arguments[1]
757                   , thisArg = arguments[2]
758                   , Context
759                   , i
760                   , j
761                   , arr
762                   , length
763                   , code
764                   , iterator
765                   , result
766                   , getIterator
767                   , value;
768
769                 arrayLike = Object(validValue(arrayLike));
770
771                 if (isValue(mapFn)) validCallable(mapFn);
772                 if (!this || this === Array || !isFunction(this)) {
773                         // Result: Plain array
774                         if (!mapFn) {
775                                 if (isArguments(arrayLike)) {
776                                         // Source: Arguments
777                                         length = arrayLike.length;
778                                         if (length !== 1) return Array.apply(null, arrayLike);
779                                         arr = new Array(1);
780                                         arr[0] = arrayLike[0];
781                                         return arr;
782                                 }
783                                 if (isArray$1(arrayLike)) {
784                                         // Source: Array
785                                         arr = new Array(length = arrayLike.length);
786                                         for (i = 0; i < length; ++i) arr[i] = arrayLike[i];
787                                         return arr;
788                                 }
789                         }
790                         arr = [];
791                 } else {
792                         // Result: Non plain array
793                         Context = this;
794                 }
795
796                 if (!isArray$1(arrayLike)) {
797                         if ((getIterator = arrayLike[iteratorSymbol$1]) !== undefined) {
798                                 // Source: Iterator
799                                 iterator = validCallable(getIterator).call(arrayLike);
800                                 if (Context) arr = new Context();
801                                 result = iterator.next();
802                                 i = 0;
803                                 while (!result.done) {
804                                         value = mapFn ? call.call(mapFn, thisArg, result.value, i) : result.value;
805                                         if (Context) {
806                                                 desc.value = value;
807                                                 defineProperty$2(arr, i, desc);
808                                         } else {
809                                                 arr[i] = value;
810                                         }
811                                         result = iterator.next();
812                                         ++i;
813                                 }
814                                 length = i;
815                         } else if (isString(arrayLike)) {
816                                 // Source: String
817                                 length = arrayLike.length;
818                                 if (Context) arr = new Context();
819                                 for (i = 0, j = 0; i < length; ++i) {
820                                         value = arrayLike[i];
821                                         if (i + 1 < length) {
822                                                 code = value.charCodeAt(0);
823                                                 // eslint-disable-next-line max-depth
824                                                 if (code >= 0xd800 && code <= 0xdbff) value += arrayLike[++i];
825                                         }
826                                         value = mapFn ? call.call(mapFn, thisArg, value, j) : value;
827                                         if (Context) {
828                                                 desc.value = value;
829                                                 defineProperty$2(arr, j, desc);
830                                         } else {
831                                                 arr[j] = value;
832                                         }
833                                         ++j;
834                                 }
835                                 length = j;
836                         }
837                 }
838                 if (length === undefined) {
839                         // Source: array or array-like
840                         length = toPosInteger(arrayLike.length);
841                         if (Context) arr = new Context(length);
842                         for (i = 0; i < length; ++i) {
843                                 value = mapFn ? call.call(mapFn, thisArg, arrayLike[i], i) : arrayLike[i];
844                                 if (Context) {
845                                         desc.value = value;
846                                         defineProperty$2(arr, i, desc);
847                                 } else {
848                                         arr[i] = value;
849                                 }
850                         }
851                 }
852                 if (Context) {
853                         desc.value = null;
854                         arr.length = length;
855                 }
856                 return arr;
857         };
858
859         var from_1 = isImplemented$8()
860                 ? Array.from
861                 : shim$7;
862
863         var copy = function (obj/*, propertyNames, options*/) {
864                 var copy = Object(validValue(obj)), propertyNames = arguments[1], options = Object(arguments[2]);
865                 if (copy !== obj && !propertyNames) return copy;
866                 var result = {};
867                 if (propertyNames) {
868                         from_1(propertyNames, function (propertyName) {
869                                 if (options.ensure || propertyName in obj) result[propertyName] = obj[propertyName];
870                         });
871                 } else {
872                         assign(result, obj);
873                 }
874                 return result;
875         };
876
877         var bind                    = Function.prototype.bind
878           , call$1                    = Function.prototype.call
879           , keys$2                    = Object.keys
880           , objPropertyIsEnumerable = Object.prototype.propertyIsEnumerable;
881
882         var _iterate = function (method, defVal) {
883                 return function (obj, cb /*, thisArg, compareFn*/) {
884                         var list, thisArg = arguments[2], compareFn = arguments[3];
885                         obj = Object(validValue(obj));
886                         validCallable(cb);
887
888                         list = keys$2(obj);
889                         if (compareFn) {
890                                 list.sort(typeof compareFn === "function" ? bind.call(compareFn, obj) : undefined);
891                         }
892                         if (typeof method !== "function") method = list[method];
893                         return call$1.call(method, list, function (key, index) {
894                                 if (!objPropertyIsEnumerable.call(obj, key)) return defVal;
895                                 return call$1.call(cb, thisArg, obj[key], key, obj, index);
896                         });
897                 };
898         };
899
900         var forEach$1 = _iterate("forEach");
901
902         var call$2     = Function.prototype.call;
903
904         var map$1 = function (obj, cb /*, thisArg*/) {
905                 var result = {}, thisArg = arguments[2];
906                 validCallable(cb);
907                 forEach$1(obj, function (value, key, targetObj, index) {
908                         result[key] = call$2.call(cb, thisArg, value, key, targetObj, index);
909                 });
910                 return result;
911         };
912
913         var callable         = validCallable
914
915           , bind$1 = Function.prototype.bind, defineProperty$3 = Object.defineProperty
916           , hasOwnProperty = Object.prototype.hasOwnProperty
917           , define;
918
919         define = function (name, desc, options) {
920                 var value = validValue(desc) && callable(desc.value), dgs;
921                 dgs = copy(desc);
922                 delete dgs.writable;
923                 delete dgs.value;
924                 dgs.get = function () {
925                         if (!options.overwriteDefinition && hasOwnProperty.call(this, name)) return value;
926                         desc.value = bind$1.call(value, options.resolveContext ? options.resolveContext(this) : this);
927                         defineProperty$3(this, name, desc);
928                         return this[name];
929                 };
930                 return dgs;
931         };
932
933         var autoBind = function (props/*, options*/) {
934                 var options = normalizeOptions(arguments[1]);
935                 if (options.resolveContext != null) validCallable(options.resolveContext);
936                 return map$1(props, function (desc, name) { return define(name, desc, options); });
937         };
938
939         var defineProperty$4 = Object.defineProperty, defineProperties$1 = Object.defineProperties, Iterator;
940
941         var es6Iterator = Iterator = function (list, context) {
942                 if (!(this instanceof Iterator)) throw new TypeError("Constructor requires 'new'");
943                 defineProperties$1(this, {
944                         __list__: d_1("w", validValue(list)),
945                         __context__: d_1("w", context),
946                         __nextIndex__: d_1("w", 0)
947                 });
948                 if (!context) return;
949                 validCallable(context.on);
950                 context.on("_add", this._onAdd);
951                 context.on("_delete", this._onDelete);
952                 context.on("_clear", this._onClear);
953         };
954
955         // Internal %IteratorPrototype% doesn't expose its constructor
956         delete Iterator.prototype.constructor;
957
958         defineProperties$1(
959                 Iterator.prototype,
960                 assign(
961                         {
962                                 _next: d_1(function () {
963                                         var i;
964                                         if (!this.__list__) return undefined;
965                                         if (this.__redo__) {
966                                                 i = this.__redo__.shift();
967                                                 if (i !== undefined) return i;
968                                         }
969                                         if (this.__nextIndex__ < this.__list__.length) return this.__nextIndex__++;
970                                         this._unBind();
971                                         return undefined;
972                                 }),
973                                 next: d_1(function () {
974                                         return this._createResult(this._next());
975                                 }),
976                                 _createResult: d_1(function (i) {
977                                         if (i === undefined) return { done: true, value: undefined };
978                                         return { done: false, value: this._resolve(i) };
979                                 }),
980                                 _resolve: d_1(function (i) {
981                                         return this.__list__[i];
982                                 }),
983                                 _unBind: d_1(function () {
984                                         this.__list__ = null;
985                                         delete this.__redo__;
986                                         if (!this.__context__) return;
987                                         this.__context__.off("_add", this._onAdd);
988                                         this.__context__.off("_delete", this._onDelete);
989                                         this.__context__.off("_clear", this._onClear);
990                                         this.__context__ = null;
991                                 }),
992                                 toString: d_1(function () {
993                                         return "[object " + (this[es6Symbol.toStringTag] || "Object") + "]";
994                                 })
995                         },
996                         autoBind({
997                                 _onAdd: d_1(function (index) {
998                                         if (index >= this.__nextIndex__) return;
999                                         ++this.__nextIndex__;
1000                                         if (!this.__redo__) {
1001                                                 defineProperty$4(this, "__redo__", d_1("c", [index]));
1002                                                 return;
1003                                         }
1004                                         this.__redo__.forEach(function (redo, i) {
1005                                                 if (redo >= index) this.__redo__[i] = ++redo;
1006                                         }, this);
1007                                         this.__redo__.push(index);
1008                                 }),
1009                                 _onDelete: d_1(function (index) {
1010                                         var i;
1011                                         if (index >= this.__nextIndex__) return;
1012                                         --this.__nextIndex__;
1013                                         if (!this.__redo__) return;
1014                                         i = this.__redo__.indexOf(index);
1015                                         if (i !== -1) this.__redo__.splice(i, 1);
1016                                         this.__redo__.forEach(function (redo, j) {
1017                                                 if (redo > index) this.__redo__[j] = --redo;
1018                                         }, this);
1019                                 }),
1020                                 _onClear: d_1(function () {
1021                                         if (this.__redo__) clear.call(this.__redo__);
1022                                         this.__nextIndex__ = 0;
1023                                 })
1024                         })
1025                 )
1026         );
1027
1028         defineProperty$4(
1029                 Iterator.prototype,
1030                 es6Symbol.iterator,
1031                 d_1(function () {
1032                         return this;
1033                 })
1034         );
1035
1036         var array = createCommonjsModule(function (module) {
1037
1038
1039
1040         var defineProperty = Object.defineProperty, ArrayIterator;
1041
1042         ArrayIterator = module.exports = function (arr, kind) {
1043                 if (!(this instanceof ArrayIterator)) throw new TypeError("Constructor requires 'new'");
1044                 es6Iterator.call(this, arr);
1045                 if (!kind) kind = "value";
1046                 else if (contains.call(kind, "key+value")) kind = "key+value";
1047                 else if (contains.call(kind, "key")) kind = "key";
1048                 else kind = "value";
1049                 defineProperty(this, "__kind__", d_1("", kind));
1050         };
1051         if (setPrototypeOf) setPrototypeOf(ArrayIterator, es6Iterator);
1052
1053         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1054         delete ArrayIterator.prototype.constructor;
1055
1056         ArrayIterator.prototype = Object.create(es6Iterator.prototype, {
1057                 _resolve: d_1(function (i) {
1058                         if (this.__kind__ === "value") return this.__list__[i];
1059                         if (this.__kind__ === "key+value") return [i, this.__list__[i]];
1060                         return i;
1061                 })
1062         });
1063         defineProperty(ArrayIterator.prototype, es6Symbol.toStringTag, d_1("c", "Array Iterator"));
1064         });
1065
1066         var string = createCommonjsModule(function (module) {
1067
1068
1069
1070         var defineProperty = Object.defineProperty, StringIterator;
1071
1072         StringIterator = module.exports = function (str) {
1073                 if (!(this instanceof StringIterator)) throw new TypeError("Constructor requires 'new'");
1074                 str = String(str);
1075                 es6Iterator.call(this, str);
1076                 defineProperty(this, "__length__", d_1("", str.length));
1077         };
1078         if (setPrototypeOf) setPrototypeOf(StringIterator, es6Iterator);
1079
1080         // Internal %ArrayIteratorPrototype% doesn't expose its constructor
1081         delete StringIterator.prototype.constructor;
1082
1083         StringIterator.prototype = Object.create(es6Iterator.prototype, {
1084                 _next: d_1(function () {
1085                         if (!this.__list__) return undefined;
1086                         if (this.__nextIndex__ < this.__length__) return this.__nextIndex__++;
1087                         this._unBind();
1088                         return undefined;
1089                 }),
1090                 _resolve: d_1(function (i) {
1091                         var char = this.__list__[i], code;
1092                         if (this.__nextIndex__ === this.__length__) return char;
1093                         code = char.charCodeAt(0);
1094                         if (code >= 0xd800 && code <= 0xdbff) return char + this.__list__[this.__nextIndex__++];
1095                         return char;
1096                 })
1097         });
1098         defineProperty(StringIterator.prototype, es6Symbol.toStringTag, d_1("c", "String Iterator"));
1099         });
1100
1101         var iteratorSymbol$2 = es6Symbol.iterator;
1102
1103         var get = function (obj) {
1104                 if (typeof validIterable(obj)[iteratorSymbol$2] === "function") return obj[iteratorSymbol$2]();
1105                 if (isArguments(obj)) return new array(obj);
1106                 if (isString(obj)) return new string(obj);
1107                 return new array(obj);
1108         };
1109
1110         var isArray$2 = Array.isArray, call$3 = Function.prototype.call, some = Array.prototype.some;
1111
1112         var forOf = function (iterable, cb /*, thisArg*/) {
1113                 var mode, thisArg = arguments[2], result, doBreak, broken, i, length, char, code;
1114                 if (isArray$2(iterable) || isArguments(iterable)) mode = "array";
1115                 else if (isString(iterable)) mode = "string";
1116                 else iterable = get(iterable);
1117
1118                 validCallable(cb);
1119                 doBreak = function () {
1120                         broken = true;
1121                 };
1122                 if (mode === "array") {
1123                         some.call(iterable, function (value) {
1124                                 call$3.call(cb, thisArg, value, doBreak);
1125                                 return broken;
1126                         });
1127                         return;
1128                 }
1129                 if (mode === "string") {
1130                         length = iterable.length;
1131                         for (i = 0; i < length; ++i) {
1132                                 char = iterable[i];
1133                                 if (i + 1 < length) {
1134                                         code = char.charCodeAt(0);
1135                                         if (code >= 0xd800 && code <= 0xdbff) char += iterable[++i];
1136                                 }
1137                                 call$3.call(cb, thisArg, char, doBreak);
1138                                 if (broken) break;
1139                         }
1140                         return;
1141                 }
1142                 result = iterable.next();
1143
1144                 while (!result.done) {
1145                         call$3.call(cb, thisArg, result.value, doBreak);
1146                         if (broken) return;
1147                         result = iterable.next();
1148                 }
1149         };
1150
1151         var iterator = createCommonjsModule(function (module) {
1152
1153         var toStringTagSymbol = es6Symbol.toStringTag
1154
1155           , defineProperty = Object.defineProperty
1156           , SetIterator;
1157
1158         SetIterator = module.exports = function (set, kind) {
1159                 if (!(this instanceof SetIterator)) return new SetIterator(set, kind);
1160                 es6Iterator.call(this, set.__setData__, set);
1161                 if (!kind) kind = 'value';
1162                 else if (contains.call(kind, 'key+value')) kind = 'key+value';
1163                 else kind = 'value';
1164                 defineProperty(this, '__kind__', d_1('', kind));
1165         };
1166         if (setPrototypeOf) setPrototypeOf(SetIterator, es6Iterator);
1167
1168         SetIterator.prototype = Object.create(es6Iterator.prototype, {
1169                 constructor: d_1(SetIterator),
1170                 _resolve: d_1(function (i) {
1171                         if (this.__kind__ === 'value') return this.__list__[i];
1172                         return [this.__list__[i], this.__list__[i]];
1173                 }),
1174                 toString: d_1(function () { return '[object Set Iterator]'; })
1175         });
1176         defineProperty(SetIterator.prototype, toStringTagSymbol, d_1('c', 'Set Iterator'));
1177         });
1178
1179         // Exports true if environment provides native `Set` implementation,
1180
1181         var isNativeImplemented = (function () {
1182                 if (typeof Set === 'undefined') return false;
1183                 return (Object.prototype.toString.call(Set.prototype) === '[object Set]');
1184         }());
1185
1186         var iterator$1       = validIterable
1187
1188           , call$4 = Function.prototype.call
1189           , defineProperty$5 = Object.defineProperty, getPrototypeOf$1 = Object.getPrototypeOf
1190           , SetPoly, getValues, NativeSet;
1191
1192         if (isNativeImplemented) NativeSet = Set;
1193
1194         var polyfill$1 = SetPoly = function Set(/*iterable*/) {
1195                 var iterable = arguments[0], self;
1196                 if (!(this instanceof SetPoly)) throw new TypeError('Constructor requires \'new\'');
1197                 if (isNativeImplemented && setPrototypeOf) self = setPrototypeOf(new NativeSet(), getPrototypeOf$1(this));
1198                 else self = this;
1199                 if (iterable != null) iterator$1(iterable);
1200                 defineProperty$5(self, '__setData__', d_1('c', []));
1201                 if (!iterable) return self;
1202                 forOf(iterable, function (value) {
1203                         if (eIndexOf.call(this, value) !== -1) return;
1204                         this.push(value);
1205                 }, self.__setData__);
1206                 return self;
1207         };
1208
1209         if (isNativeImplemented) {
1210                 if (setPrototypeOf) setPrototypeOf(SetPoly, NativeSet);
1211                 SetPoly.prototype = Object.create(NativeSet.prototype, { constructor: d_1(SetPoly) });
1212         }
1213
1214         eventEmitter(Object.defineProperties(SetPoly.prototype, {
1215                 add: d_1(function (value) {
1216                         if (this.has(value)) return this;
1217                         this.emit('_add', this.__setData__.push(value) - 1, value);
1218                         return this;
1219                 }),
1220                 clear: d_1(function () {
1221                         if (!this.__setData__.length) return;
1222                         clear.call(this.__setData__);
1223                         this.emit('_clear');
1224                 }),
1225                 delete: d_1(function (value) {
1226                         var index = eIndexOf.call(this.__setData__, value);
1227                         if (index === -1) return false;
1228                         this.__setData__.splice(index, 1);
1229                         this.emit('_delete', index, value);
1230                         return true;
1231                 }),
1232                 entries: d_1(function () { return new iterator(this, 'key+value'); }),
1233                 forEach: d_1(function (cb/*, thisArg*/) {
1234                         var thisArg = arguments[1], iterator, result, value;
1235                         validCallable(cb);
1236                         iterator = this.values();
1237                         result = iterator._next();
1238                         while (result !== undefined) {
1239                                 value = iterator._resolve(result);
1240                                 call$4.call(cb, thisArg, value, value, this);
1241                                 result = iterator._next();
1242                         }
1243                 }),
1244                 has: d_1(function (value) {
1245                         return (eIndexOf.call(this.__setData__, value) !== -1);
1246                 }),
1247                 keys: d_1(getValues = function () { return this.values(); }),
1248                 size: d_1.gs(function () { return this.__setData__.length; }),
1249                 values: d_1(function () { return new iterator(this); }),
1250                 toString: d_1(function () { return '[object Set]'; })
1251         }));
1252         defineProperty$5(SetPoly.prototype, es6Symbol.iterator, d_1(getValues));
1253         defineProperty$5(SetPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Set'));
1254
1255         var es6Set = isImplemented() ? Set : polyfill$1;
1256
1257         var isImplemented$9 = function () {
1258                 var map, iterator, result;
1259                 if (typeof Map !== 'function') return false;
1260                 try {
1261                         // WebKit doesn't support arguments and crashes
1262                         map = new Map([['raz', 'one'], ['dwa', 'two'], ['trzy', 'three']]);
1263                 } catch (e) {
1264                         return false;
1265                 }
1266                 if (String(map) !== '[object Map]') return false;
1267                 if (map.size !== 3) return false;
1268                 if (typeof map.clear !== 'function') return false;
1269                 if (typeof map.delete !== 'function') return false;
1270                 if (typeof map.entries !== 'function') return false;
1271                 if (typeof map.forEach !== 'function') return false;
1272                 if (typeof map.get !== 'function') return false;
1273                 if (typeof map.has !== 'function') return false;
1274                 if (typeof map.keys !== 'function') return false;
1275                 if (typeof map.set !== 'function') return false;
1276                 if (typeof map.values !== 'function') return false;
1277
1278                 iterator = map.entries();
1279                 result = iterator.next();
1280                 if (result.done !== false) return false;
1281                 if (!result.value) return false;
1282                 if (result.value[0] !== 'raz') return false;
1283                 if (result.value[1] !== 'one') return false;
1284
1285                 return true;
1286         };
1287
1288         var forEach$2 = Array.prototype.forEach, create$4 = Object.create;
1289
1290         // eslint-disable-next-line no-unused-vars
1291         var primitiveSet = function (arg /*, …args*/) {
1292                 var set = create$4(null);
1293                 forEach$2.call(arguments, function (name) {
1294                         set[name] = true;
1295                 });
1296                 return set;
1297         };
1298
1299         var iteratorKinds = primitiveSet('key',
1300                 'value', 'key+value');
1301
1302         var iterator$2 = createCommonjsModule(function (module) {
1303
1304         var toStringTagSymbol = es6Symbol.toStringTag
1305
1306           , defineProperties = Object.defineProperties
1307           , unBind = es6Iterator.prototype._unBind
1308           , MapIterator;
1309
1310         MapIterator = module.exports = function (map, kind) {
1311                 if (!(this instanceof MapIterator)) return new MapIterator(map, kind);
1312                 es6Iterator.call(this, map.__mapKeysData__, map);
1313                 if (!kind || !iteratorKinds[kind]) kind = 'key+value';
1314                 defineProperties(this, {
1315                         __kind__: d_1('', kind),
1316                         __values__: d_1('w', map.__mapValuesData__)
1317                 });
1318         };
1319         if (setPrototypeOf) setPrototypeOf(MapIterator, es6Iterator);
1320
1321         MapIterator.prototype = Object.create(es6Iterator.prototype, {
1322                 constructor: d_1(MapIterator),
1323                 _resolve: d_1(function (i) {
1324                         if (this.__kind__ === 'value') return this.__values__[i];
1325                         if (this.__kind__ === 'key') return this.__list__[i];
1326                         return [this.__list__[i], this.__values__[i]];
1327                 }),
1328                 _unBind: d_1(function () {
1329                         this.__values__ = null;
1330                         unBind.call(this);
1331                 }),
1332                 toString: d_1(function () { return '[object Map Iterator]'; })
1333         });
1334         Object.defineProperty(MapIterator.prototype, toStringTagSymbol,
1335                 d_1('c', 'Map Iterator'));
1336         });
1337
1338         // Exports true if environment provides native `Map` implementation,
1339
1340         var isNativeImplemented$1 = (function () {
1341                 if (typeof Map === 'undefined') return false;
1342                 return (Object.prototype.toString.call(new Map()) === '[object Map]');
1343         }());
1344
1345         var iterator$3       = validIterable
1346
1347           , call$5 = Function.prototype.call
1348           , defineProperties$2 = Object.defineProperties, getPrototypeOf$2 = Object.getPrototypeOf
1349           , MapPoly;
1350
1351         var polyfill$2 = MapPoly = function (/*iterable*/) {
1352                 var iterable = arguments[0], keys, values, self;
1353                 if (!(this instanceof MapPoly)) throw new TypeError('Constructor requires \'new\'');
1354                 if (isNativeImplemented$1 && setPrototypeOf && (Map !== MapPoly)) {
1355                         self = setPrototypeOf(new Map(), getPrototypeOf$2(this));
1356                 } else {
1357                         self = this;
1358                 }
1359                 if (iterable != null) iterator$3(iterable);
1360                 defineProperties$2(self, {
1361                         __mapKeysData__: d_1('c', keys = []),
1362                         __mapValuesData__: d_1('c', values = [])
1363                 });
1364                 if (!iterable) return self;
1365                 forOf(iterable, function (value) {
1366                         var key = validValue(value)[0];
1367                         value = value[1];
1368                         if (eIndexOf.call(keys, key) !== -1) return;
1369                         keys.push(key);
1370                         values.push(value);
1371                 }, self);
1372                 return self;
1373         };
1374
1375         if (isNativeImplemented$1) {
1376                 if (setPrototypeOf) setPrototypeOf(MapPoly, Map);
1377                 MapPoly.prototype = Object.create(Map.prototype, {
1378                         constructor: d_1(MapPoly)
1379                 });
1380         }
1381
1382         eventEmitter(defineProperties$2(MapPoly.prototype, {
1383                 clear: d_1(function () {
1384                         if (!this.__mapKeysData__.length) return;
1385                         clear.call(this.__mapKeysData__);
1386                         clear.call(this.__mapValuesData__);
1387                         this.emit('_clear');
1388                 }),
1389                 delete: d_1(function (key) {
1390                         var index = eIndexOf.call(this.__mapKeysData__, key);
1391                         if (index === -1) return false;
1392                         this.__mapKeysData__.splice(index, 1);
1393                         this.__mapValuesData__.splice(index, 1);
1394                         this.emit('_delete', index, key);
1395                         return true;
1396                 }),
1397                 entries: d_1(function () { return new iterator$2(this, 'key+value'); }),
1398                 forEach: d_1(function (cb/*, thisArg*/) {
1399                         var thisArg = arguments[1], iterator, result;
1400                         validCallable(cb);
1401                         iterator = this.entries();
1402                         result = iterator._next();
1403                         while (result !== undefined) {
1404                                 call$5.call(cb, thisArg, this.__mapValuesData__[result],
1405                                         this.__mapKeysData__[result], this);
1406                                 result = iterator._next();
1407                         }
1408                 }),
1409                 get: d_1(function (key) {
1410                         var index = eIndexOf.call(this.__mapKeysData__, key);
1411                         if (index === -1) return;
1412                         return this.__mapValuesData__[index];
1413                 }),
1414                 has: d_1(function (key) {
1415                         return (eIndexOf.call(this.__mapKeysData__, key) !== -1);
1416                 }),
1417                 keys: d_1(function () { return new iterator$2(this, 'key'); }),
1418                 set: d_1(function (key, value) {
1419                         var index = eIndexOf.call(this.__mapKeysData__, key), emit;
1420                         if (index === -1) {
1421                                 index = this.__mapKeysData__.push(key) - 1;
1422                                 emit = true;
1423                         }
1424                         this.__mapValuesData__[index] = value;
1425                         if (emit) this.emit('_add', index, key);
1426                         return this;
1427                 }),
1428                 size: d_1.gs(function () { return this.__mapKeysData__.length; }),
1429                 values: d_1(function () { return new iterator$2(this, 'value'); }),
1430                 toString: d_1(function () { return '[object Map]'; })
1431         }));
1432         Object.defineProperty(MapPoly.prototype, es6Symbol.iterator, d_1(function () {
1433                 return this.entries();
1434         }));
1435         Object.defineProperty(MapPoly.prototype, es6Symbol.toStringTag, d_1('c', 'Map'));
1436
1437         var es6Map = isImplemented$9() ? Map : polyfill$2;
1438
1439         var toStr = Object.prototype.toString;
1440
1441         var isArguments$1 = function isArguments(value) {
1442                 var str = toStr.call(value);
1443                 var isArgs = str === '[object Arguments]';
1444                 if (!isArgs) {
1445                         isArgs = str !== '[object Array]' &&
1446                                 value !== null &&
1447                                 typeof value === 'object' &&
1448                                 typeof value.length === 'number' &&
1449                                 value.length >= 0 &&
1450                                 toStr.call(value.callee) === '[object Function]';
1451                 }
1452                 return isArgs;
1453         };
1454
1455         var keysShim;
1456         if (!Object.keys) {
1457                 // modified from https://github.com/es-shims/es5-shim
1458                 var has = Object.prototype.hasOwnProperty;
1459                 var toStr$1 = Object.prototype.toString;
1460                 var isArgs = isArguments$1; // eslint-disable-line global-require
1461                 var isEnumerable = Object.prototype.propertyIsEnumerable;
1462                 var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
1463                 var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
1464                 var dontEnums = [
1465                         'toString',
1466                         'toLocaleString',
1467                         'valueOf',
1468                         'hasOwnProperty',
1469                         'isPrototypeOf',
1470                         'propertyIsEnumerable',
1471                         'constructor'
1472                 ];
1473                 var equalsConstructorPrototype = function (o) {
1474                         var ctor = o.constructor;
1475                         return ctor && ctor.prototype === o;
1476                 };
1477                 var excludedKeys = {
1478                         $applicationCache: true,
1479                         $console: true,
1480                         $external: true,
1481                         $frame: true,
1482                         $frameElement: true,
1483                         $frames: true,
1484                         $innerHeight: true,
1485                         $innerWidth: true,
1486                         $outerHeight: true,
1487                         $outerWidth: true,
1488                         $pageXOffset: true,
1489                         $pageYOffset: true,
1490                         $parent: true,
1491                         $scrollLeft: true,
1492                         $scrollTop: true,
1493                         $scrollX: true,
1494                         $scrollY: true,
1495                         $self: true,
1496                         $webkitIndexedDB: true,
1497                         $webkitStorageInfo: true,
1498                         $window: true
1499                 };
1500                 var hasAutomationEqualityBug = (function () {
1501                         /* global window */
1502                         if (typeof window === 'undefined') { return false; }
1503                         for (var k in window) {
1504                                 try {
1505                                         if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
1506                                                 try {
1507                                                         equalsConstructorPrototype(window[k]);
1508                                                 } catch (e) {
1509                                                         return true;
1510                                                 }
1511                                         }
1512                                 } catch (e) {
1513                                         return true;
1514                                 }
1515                         }
1516                         return false;
1517                 }());
1518                 var equalsConstructorPrototypeIfNotBuggy = function (o) {
1519                         /* global window */
1520                         if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
1521                                 return equalsConstructorPrototype(o);
1522                         }
1523                         try {
1524                                 return equalsConstructorPrototype(o);
1525                         } catch (e) {
1526                                 return false;
1527                         }
1528                 };
1529
1530                 keysShim = function keys(object) {
1531                         var isObject = object !== null && typeof object === 'object';
1532                         var isFunction = toStr$1.call(object) === '[object Function]';
1533                         var isArguments = isArgs(object);
1534                         var isString = isObject && toStr$1.call(object) === '[object String]';
1535                         var theKeys = [];
1536
1537                         if (!isObject && !isFunction && !isArguments) {
1538                                 throw new TypeError('Object.keys called on a non-object');
1539                         }
1540
1541                         var skipProto = hasProtoEnumBug && isFunction;
1542                         if (isString && object.length > 0 && !has.call(object, 0)) {
1543                                 for (var i = 0; i < object.length; ++i) {
1544                                         theKeys.push(String(i));
1545                                 }
1546                         }
1547
1548                         if (isArguments && object.length > 0) {
1549                                 for (var j = 0; j < object.length; ++j) {
1550                                         theKeys.push(String(j));
1551                                 }
1552                         } else {
1553                                 for (var name in object) {
1554                                         if (!(skipProto && name === 'prototype') && has.call(object, name)) {
1555                                                 theKeys.push(String(name));
1556                                         }
1557                                 }
1558                         }
1559
1560                         if (hasDontEnumBug) {
1561                                 var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
1562
1563                                 for (var k = 0; k < dontEnums.length; ++k) {
1564                                         if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
1565                                                 theKeys.push(dontEnums[k]);
1566                                         }
1567                                 }
1568                         }
1569                         return theKeys;
1570                 };
1571         }
1572         var implementation = keysShim;
1573
1574         var slice = Array.prototype.slice;
1575
1576
1577         var origKeys = Object.keys;
1578         var keysShim$1 = origKeys ? function keys(o) { return origKeys(o); } : implementation;
1579
1580         var originalKeys = Object.keys;
1581
1582         keysShim$1.shim = function shimObjectKeys() {
1583                 if (Object.keys) {
1584                         var keysWorksWithArguments = (function () {
1585                                 // Safari 5.0 bug
1586                                 var args = Object.keys(arguments);
1587                                 return args && args.length === arguments.length;
1588                         }(1, 2));
1589                         if (!keysWorksWithArguments) {
1590                                 Object.keys = function keys(object) { // eslint-disable-line func-name-matching
1591                                         if (isArguments$1(object)) {
1592                                                 return originalKeys(slice.call(object));
1593                                         }
1594                                         return originalKeys(object);
1595                                 };
1596                         }
1597                 } else {
1598                         Object.keys = keysShim$1;
1599                 }
1600                 return Object.keys || keysShim$1;
1601         };
1602
1603         var objectKeys = keysShim$1;
1604
1605         var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
1606
1607         var toStr$2 = Object.prototype.toString;
1608         var concat = Array.prototype.concat;
1609         var origDefineProperty = Object.defineProperty;
1610
1611         var isFunction$1 = function (fn) {
1612                 return typeof fn === 'function' && toStr$2.call(fn) === '[object Function]';
1613         };
1614
1615         var arePropertyDescriptorsSupported = function () {
1616                 var obj = {};
1617                 try {
1618                         origDefineProperty(obj, 'x', { enumerable: false, value: obj });
1619                         // eslint-disable-next-line no-unused-vars, no-restricted-syntax
1620                         for (var _ in obj) { // jscs:ignore disallowUnusedVariables
1621                                 return false;
1622                         }
1623                         return obj.x === obj;
1624                 } catch (e) { /* this is IE 8. */
1625                         return false;
1626                 }
1627         };
1628         var supportsDescriptors = origDefineProperty && arePropertyDescriptorsSupported();
1629
1630         var defineProperty$6 = function (object, name, value, predicate) {
1631                 if (name in object && (!isFunction$1(predicate) || !predicate())) {
1632                         return;
1633                 }
1634                 if (supportsDescriptors) {
1635                         origDefineProperty(object, name, {
1636                                 configurable: true,
1637                                 enumerable: false,
1638                                 value: value,
1639                                 writable: true
1640                         });
1641                 } else {
1642                         object[name] = value;
1643                 }
1644         };
1645
1646         var defineProperties$3 = function (object, map) {
1647                 var predicates = arguments.length > 2 ? arguments[2] : {};
1648                 var props = objectKeys(map);
1649                 if (hasSymbols) {
1650                         props = concat.call(props, Object.getOwnPropertySymbols(map));
1651                 }
1652                 for (var i = 0; i < props.length; i += 1) {
1653                         defineProperty$6(object, props[i], map[props[i]], predicates[props[i]]);
1654                 }
1655         };
1656
1657         defineProperties$3.supportsDescriptors = !!supportsDescriptors;
1658
1659         var defineProperties_1 = defineProperties$3;
1660
1661         /* eslint no-invalid-this: 1 */
1662
1663         var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
1664         var slice$1 = Array.prototype.slice;
1665         var toStr$3 = Object.prototype.toString;
1666         var funcType = '[object Function]';
1667
1668         var implementation$1 = function bind(that) {
1669             var target = this;
1670             if (typeof target !== 'function' || toStr$3.call(target) !== funcType) {
1671                 throw new TypeError(ERROR_MESSAGE + target);
1672             }
1673             var args = slice$1.call(arguments, 1);
1674
1675             var bound;
1676             var binder = function () {
1677                 if (this instanceof bound) {
1678                     var result = target.apply(
1679                         this,
1680                         args.concat(slice$1.call(arguments))
1681                     );
1682                     if (Object(result) === result) {
1683                         return result;
1684                     }
1685                     return this;
1686                 } else {
1687                     return target.apply(
1688                         that,
1689                         args.concat(slice$1.call(arguments))
1690                     );
1691                 }
1692             };
1693
1694             var boundLength = Math.max(0, target.length - args.length);
1695             var boundArgs = [];
1696             for (var i = 0; i < boundLength; i++) {
1697                 boundArgs.push('$' + i);
1698             }
1699
1700             bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
1701
1702             if (target.prototype) {
1703                 var Empty = function Empty() {};
1704                 Empty.prototype = target.prototype;
1705                 bound.prototype = new Empty();
1706                 Empty.prototype = null;
1707             }
1708
1709             return bound;
1710         };
1711
1712         var functionBind = Function.prototype.bind || implementation$1;
1713
1714         var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
1715
1716         var isPrimitive = function isPrimitive(value) {
1717                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
1718         };
1719
1720         var fnToStr = Function.prototype.toString;
1721
1722         var constructorRegex = /^\s*class\b/;
1723         var isES6ClassFn = function isES6ClassFunction(value) {
1724                 try {
1725                         var fnStr = fnToStr.call(value);
1726                         return constructorRegex.test(fnStr);
1727                 } catch (e) {
1728                         return false; // not a function
1729                 }
1730         };
1731
1732         var tryFunctionObject = function tryFunctionToStr(value) {
1733                 try {
1734                         if (isES6ClassFn(value)) { return false; }
1735                         fnToStr.call(value);
1736                         return true;
1737                 } catch (e) {
1738                         return false;
1739                 }
1740         };
1741         var toStr$4 = Object.prototype.toString;
1742         var fnClass = '[object Function]';
1743         var genClass = '[object GeneratorFunction]';
1744         var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1745
1746         var isCallable$1 = function isCallable(value) {
1747                 if (!value) { return false; }
1748                 if (typeof value !== 'function' && typeof value !== 'object') { return false; }
1749                 if (typeof value === 'function' && !value.prototype) { return true; }
1750                 if (hasToStringTag) { return tryFunctionObject(value); }
1751                 if (isES6ClassFn(value)) { return false; }
1752                 var strClass = toStr$4.call(value);
1753                 return strClass === fnClass || strClass === genClass;
1754         };
1755
1756         var getDay = Date.prototype.getDay;
1757         var tryDateObject = function tryDateObject(value) {
1758                 try {
1759                         getDay.call(value);
1760                         return true;
1761                 } catch (e) {
1762                         return false;
1763                 }
1764         };
1765
1766         var toStr$5 = Object.prototype.toString;
1767         var dateClass = '[object Date]';
1768         var hasToStringTag$1 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
1769
1770         var isDateObject = function isDateObject(value) {
1771                 if (typeof value !== 'object' || value === null) { return false; }
1772                 return hasToStringTag$1 ? tryDateObject(value) : toStr$5.call(value) === dateClass;
1773         };
1774
1775         /* eslint complexity: [2, 17], max-statements: [2, 33] */
1776         var shams = function hasSymbols() {
1777                 if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
1778                 if (typeof Symbol.iterator === 'symbol') { return true; }
1779
1780                 var obj = {};
1781                 var sym = Symbol('test');
1782                 var symObj = Object(sym);
1783                 if (typeof sym === 'string') { return false; }
1784
1785                 if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
1786                 if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
1787
1788                 // temp disabled per https://github.com/ljharb/object.assign/issues/17
1789                 // if (sym instanceof Symbol) { return false; }
1790                 // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
1791                 // if (!(symObj instanceof Symbol)) { return false; }
1792
1793                 // if (typeof Symbol.prototype.toString !== 'function') { return false; }
1794                 // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }
1795
1796                 var symVal = 42;
1797                 obj[sym] = symVal;
1798                 for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax
1799                 if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
1800
1801                 if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
1802
1803                 var syms = Object.getOwnPropertySymbols(obj);
1804                 if (syms.length !== 1 || syms[0] !== sym) { return false; }
1805
1806                 if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
1807
1808                 if (typeof Object.getOwnPropertyDescriptor === 'function') {
1809                         var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
1810                         if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
1811                 }
1812
1813                 return true;
1814         };
1815
1816         var origSymbol = commonjsGlobal.Symbol;
1817
1818
1819         var hasSymbols$1 = function hasNativeSymbols() {
1820                 if (typeof origSymbol !== 'function') { return false; }
1821                 if (typeof Symbol !== 'function') { return false; }
1822                 if (typeof origSymbol('foo') !== 'symbol') { return false; }
1823                 if (typeof Symbol('bar') !== 'symbol') { return false; }
1824
1825                 return shams();
1826         };
1827
1828         var isSymbol$1 = createCommonjsModule(function (module) {
1829
1830         var toStr = Object.prototype.toString;
1831         var hasSymbols = hasSymbols$1();
1832
1833         if (hasSymbols) {
1834                 var symToStr = Symbol.prototype.toString;
1835                 var symStringRegex = /^Symbol\(.*\)$/;
1836                 var isSymbolObject = function isRealSymbolObject(value) {
1837                         if (typeof value.valueOf() !== 'symbol') {
1838                                 return false;
1839                         }
1840                         return symStringRegex.test(symToStr.call(value));
1841                 };
1842
1843                 module.exports = function isSymbol(value) {
1844                         if (typeof value === 'symbol') {
1845                                 return true;
1846                         }
1847                         if (toStr.call(value) !== '[object Symbol]') {
1848                                 return false;
1849                         }
1850                         try {
1851                                 return isSymbolObject(value);
1852                         } catch (e) {
1853                                 return false;
1854                         }
1855                 };
1856         } else {
1857
1858                 module.exports = function isSymbol(value) {
1859                         // this environment does not support Symbols.
1860                         return false;
1861                 };
1862         }
1863         });
1864
1865         var hasSymbols$2 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1866
1867
1868
1869
1870
1871
1872         var ordinaryToPrimitive = function OrdinaryToPrimitive(O, hint) {
1873                 if (typeof O === 'undefined' || O === null) {
1874                         throw new TypeError('Cannot call method on ' + O);
1875                 }
1876                 if (typeof hint !== 'string' || (hint !== 'number' && hint !== 'string')) {
1877                         throw new TypeError('hint must be "string" or "number"');
1878                 }
1879                 var methodNames = hint === 'string' ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
1880                 var method, result, i;
1881                 for (i = 0; i < methodNames.length; ++i) {
1882                         method = O[methodNames[i]];
1883                         if (isCallable$1(method)) {
1884                                 result = method.call(O);
1885                                 if (isPrimitive(result)) {
1886                                         return result;
1887                                 }
1888                         }
1889                 }
1890                 throw new TypeError('No default value');
1891         };
1892
1893         var GetMethod = function GetMethod(O, P) {
1894                 var func = O[P];
1895                 if (func !== null && typeof func !== 'undefined') {
1896                         if (!isCallable$1(func)) {
1897                                 throw new TypeError(func + ' returned for property ' + P + ' of object ' + O + ' is not a function');
1898                         }
1899                         return func;
1900                 }
1901                 return void 0;
1902         };
1903
1904         // http://www.ecma-international.org/ecma-262/6.0/#sec-toprimitive
1905         var es2015 = function ToPrimitive(input) {
1906                 if (isPrimitive(input)) {
1907                         return input;
1908                 }
1909                 var hint = 'default';
1910                 if (arguments.length > 1) {
1911                         if (arguments[1] === String) {
1912                                 hint = 'string';
1913                         } else if (arguments[1] === Number) {
1914                                 hint = 'number';
1915                         }
1916                 }
1917
1918                 var exoticToPrim;
1919                 if (hasSymbols$2) {
1920                         if (Symbol.toPrimitive) {
1921                                 exoticToPrim = GetMethod(input, Symbol.toPrimitive);
1922                         } else if (isSymbol$1(input)) {
1923                                 exoticToPrim = Symbol.prototype.valueOf;
1924                         }
1925                 }
1926                 if (typeof exoticToPrim !== 'undefined') {
1927                         var result = exoticToPrim.call(input, hint);
1928                         if (isPrimitive(result)) {
1929                                 return result;
1930                         }
1931                         throw new TypeError('unable to convert exotic object to primitive');
1932                 }
1933                 if (hint === 'default' && (isDateObject(input) || isSymbol$1(input))) {
1934                         hint = 'string';
1935                 }
1936                 return ordinaryToPrimitive(input, hint === 'default' ? 'number' : hint);
1937         };
1938
1939         var es6 = es2015;
1940
1941         /* globals
1942                 Set,
1943                 Map,
1944                 WeakSet,
1945                 WeakMap,
1946
1947                 Promise,
1948
1949                 Symbol,
1950                 Proxy,
1951
1952                 Atomics,
1953                 SharedArrayBuffer,
1954
1955                 ArrayBuffer,
1956                 DataView,
1957                 Uint8Array,
1958                 Float32Array,
1959                 Float64Array,
1960                 Int8Array,
1961                 Int16Array,
1962                 Int32Array,
1963                 Uint8ClampedArray,
1964                 Uint16Array,
1965                 Uint32Array,
1966         */
1967
1968         var undefined$1; // eslint-disable-line no-shadow-restricted-names
1969
1970         var ThrowTypeError = Object.getOwnPropertyDescriptor
1971                 ? (function () { return Object.getOwnPropertyDescriptor(arguments, 'callee').get; }())
1972                 : function () { throw new TypeError(); };
1973
1974         var hasSymbols$3 = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol';
1975
1976         var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto
1977         var generatorFunction = undefined$1;
1978         var asyncFunction = undefined$1;
1979         var asyncGenFunction = undefined$1;
1980
1981         var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array);
1982
1983         var INTRINSICS = {
1984                 '$ %Array%': Array,
1985                 '$ %ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer,
1986                 '$ %ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer.prototype,
1987                 '$ %ArrayIteratorPrototype%': hasSymbols$3 ? getProto([][Symbol.iterator]()) : undefined$1,
1988                 '$ %ArrayPrototype%': Array.prototype,
1989                 '$ %ArrayProto_entries%': Array.prototype.entries,
1990                 '$ %ArrayProto_forEach%': Array.prototype.forEach,
1991                 '$ %ArrayProto_keys%': Array.prototype.keys,
1992                 '$ %ArrayProto_values%': Array.prototype.values,
1993                 '$ %AsyncFromSyncIteratorPrototype%': undefined$1,
1994                 '$ %AsyncFunction%': asyncFunction,
1995                 '$ %AsyncFunctionPrototype%': undefined$1,
1996                 '$ %AsyncGenerator%': undefined$1,
1997                 '$ %AsyncGeneratorFunction%': asyncGenFunction,
1998                 '$ %AsyncGeneratorPrototype%': undefined$1,
1999                 '$ %AsyncIteratorPrototype%': undefined$1,
2000                 '$ %Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics,
2001                 '$ %Boolean%': Boolean,
2002                 '$ %BooleanPrototype%': Boolean.prototype,
2003                 '$ %DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView,
2004                 '$ %DataViewPrototype%': typeof DataView === 'undefined' ? undefined$1 : DataView.prototype,
2005                 '$ %Date%': Date,
2006                 '$ %DatePrototype%': Date.prototype,
2007                 '$ %decodeURI%': decodeURI,
2008                 '$ %decodeURIComponent%': decodeURIComponent,
2009                 '$ %encodeURI%': encodeURI,
2010                 '$ %encodeURIComponent%': encodeURIComponent,
2011                 '$ %Error%': Error,
2012                 '$ %ErrorPrototype%': Error.prototype,
2013                 '$ %eval%': eval, // eslint-disable-line no-eval
2014                 '$ %EvalError%': EvalError,
2015                 '$ %EvalErrorPrototype%': EvalError.prototype,
2016                 '$ %Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array,
2017                 '$ %Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array.prototype,
2018                 '$ %Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array,
2019                 '$ %Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array.prototype,
2020                 '$ %Function%': Function,
2021                 '$ %FunctionPrototype%': Function.prototype,
2022                 '$ %Generator%': undefined$1,
2023                 '$ %GeneratorFunction%': generatorFunction,
2024                 '$ %GeneratorPrototype%': undefined$1,
2025                 '$ %Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array,
2026                 '$ %Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2027                 '$ %Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array,
2028                 '$ %Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined$1 : Int8Array.prototype,
2029                 '$ %Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array,
2030                 '$ %Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array.prototype,
2031                 '$ %isFinite%': isFinite,
2032                 '$ %isNaN%': isNaN,
2033                 '$ %IteratorPrototype%': hasSymbols$3 ? getProto(getProto([][Symbol.iterator]())) : undefined$1,
2034                 '$ %JSON%': JSON,
2035                 '$ %JSONParse%': JSON.parse,
2036                 '$ %Map%': typeof Map === 'undefined' ? undefined$1 : Map,
2037                 '$ %MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Map()[Symbol.iterator]()),
2038                 '$ %MapPrototype%': typeof Map === 'undefined' ? undefined$1 : Map.prototype,
2039                 '$ %Math%': Math,
2040                 '$ %Number%': Number,
2041                 '$ %NumberPrototype%': Number.prototype,
2042                 '$ %Object%': Object,
2043                 '$ %ObjectPrototype%': Object.prototype,
2044                 '$ %ObjProto_toString%': Object.prototype.toString,
2045                 '$ %ObjProto_valueOf%': Object.prototype.valueOf,
2046                 '$ %parseFloat%': parseFloat,
2047                 '$ %parseInt%': parseInt,
2048                 '$ %Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise,
2049                 '$ %PromisePrototype%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype,
2050                 '$ %PromiseProto_then%': typeof Promise === 'undefined' ? undefined$1 : Promise.prototype.then,
2051                 '$ %Promise_all%': typeof Promise === 'undefined' ? undefined$1 : Promise.all,
2052                 '$ %Promise_reject%': typeof Promise === 'undefined' ? undefined$1 : Promise.reject,
2053                 '$ %Promise_resolve%': typeof Promise === 'undefined' ? undefined$1 : Promise.resolve,
2054                 '$ %Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy,
2055                 '$ %RangeError%': RangeError,
2056                 '$ %RangeErrorPrototype%': RangeError.prototype,
2057                 '$ %ReferenceError%': ReferenceError,
2058                 '$ %ReferenceErrorPrototype%': ReferenceError.prototype,
2059                 '$ %Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect,
2060                 '$ %RegExp%': RegExp,
2061                 '$ %RegExpPrototype%': RegExp.prototype,
2062                 '$ %Set%': typeof Set === 'undefined' ? undefined$1 : Set,
2063                 '$ %SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols$3 ? undefined$1 : getProto(new Set()[Symbol.iterator]()),
2064                 '$ %SetPrototype%': typeof Set === 'undefined' ? undefined$1 : Set.prototype,
2065                 '$ %SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer,
2066                 '$ %SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer.prototype,
2067                 '$ %String%': String,
2068                 '$ %StringIteratorPrototype%': hasSymbols$3 ? getProto(''[Symbol.iterator]()) : undefined$1,
2069                 '$ %StringPrototype%': String.prototype,
2070                 '$ %Symbol%': hasSymbols$3 ? Symbol : undefined$1,
2071                 '$ %SymbolPrototype%': hasSymbols$3 ? Symbol.prototype : undefined$1,
2072                 '$ %SyntaxError%': SyntaxError,
2073                 '$ %SyntaxErrorPrototype%': SyntaxError.prototype,
2074                 '$ %ThrowTypeError%': ThrowTypeError,
2075                 '$ %TypedArray%': TypedArray,
2076                 '$ %TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined$1,
2077                 '$ %TypeError%': TypeError,
2078                 '$ %TypeErrorPrototype%': TypeError.prototype,
2079                 '$ %Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array,
2080                 '$ %Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array.prototype,
2081                 '$ %Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray,
2082                 '$ %Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray.prototype,
2083                 '$ %Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array,
2084                 '$ %Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array.prototype,
2085                 '$ %Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array,
2086                 '$ %Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array.prototype,
2087                 '$ %URIError%': URIError,
2088                 '$ %URIErrorPrototype%': URIError.prototype,
2089                 '$ %WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap,
2090                 '$ %WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap.prototype,
2091                 '$ %WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet,
2092                 '$ %WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet.prototype
2093         };
2094
2095         var GetIntrinsic = function GetIntrinsic(name, allowMissing) {
2096                 if (arguments.length > 1 && typeof allowMissing !== 'boolean') {
2097                         throw new TypeError('"allowMissing" argument must be a boolean');
2098                 }
2099
2100                 var key = '$ ' + name;
2101                 if (!(key in INTRINSICS)) {
2102                         throw new SyntaxError('intrinsic ' + name + ' does not exist!');
2103                 }
2104
2105                 // istanbul ignore if // hopefully this is impossible to test :-)
2106                 if (typeof INTRINSICS[key] === 'undefined' && !allowMissing) {
2107                         throw new TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');
2108                 }
2109                 return INTRINSICS[key];
2110         };
2111
2112         var $TypeError = GetIntrinsic('%TypeError%');
2113         var $SyntaxError = GetIntrinsic('%SyntaxError%');
2114
2115
2116
2117         var predicates = {
2118           // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2119           'Property Descriptor': function isPropertyDescriptor(ES, Desc) {
2120             if (ES.Type(Desc) !== 'Object') {
2121               return false;
2122             }
2123             var allowed = {
2124               '[[Configurable]]': true,
2125               '[[Enumerable]]': true,
2126               '[[Get]]': true,
2127               '[[Set]]': true,
2128               '[[Value]]': true,
2129               '[[Writable]]': true
2130             };
2131
2132             for (var key in Desc) { // eslint-disable-line
2133               if (src(Desc, key) && !allowed[key]) {
2134                 return false;
2135               }
2136             }
2137
2138             var isData = src(Desc, '[[Value]]');
2139             var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2140             if (isData && IsAccessor) {
2141               throw new $TypeError('Property Descriptors may not be both accessor and data descriptors');
2142             }
2143             return true;
2144           }
2145         };
2146
2147         var assertRecord = function assertRecord(ES, recordType, argumentName, value) {
2148           var predicate = predicates[recordType];
2149           if (typeof predicate !== 'function') {
2150             throw new $SyntaxError('unknown record type: ' + recordType);
2151           }
2152           if (!predicate(ES, value)) {
2153             throw new $TypeError(argumentName + ' must be a ' + recordType);
2154           }
2155           console.log(predicate(ES, value), value);
2156         };
2157
2158         var _isNaN = Number.isNaN || function isNaN(a) {
2159                 return a !== a;
2160         };
2161
2162         var $isNaN = Number.isNaN || function (a) { return a !== a; };
2163
2164         var _isFinite = Number.isFinite || function (x) { return typeof x === 'number' && !$isNaN(x) && x !== Infinity && x !== -Infinity; };
2165
2166         var has$1 = functionBind.call(Function.call, Object.prototype.hasOwnProperty);
2167
2168         var $assign = Object.assign;
2169
2170         var assign$1 = function assign(target, source) {
2171                 if ($assign) {
2172                         return $assign(target, source);
2173                 }
2174
2175                 for (var key in source) {
2176                         if (has$1(source, key)) {
2177                                 target[key] = source[key];
2178                         }
2179                 }
2180                 return target;
2181         };
2182
2183         var sign$1 = function sign(number) {
2184                 return number >= 0 ? 1 : -1;
2185         };
2186
2187         var mod = function mod(number, modulo) {
2188                 var remain = number % modulo;
2189                 return Math.floor(remain >= 0 ? remain : remain + modulo);
2190         };
2191
2192         var isPrimitive$1 = function isPrimitive(value) {
2193                 return value === null || (typeof value !== 'function' && typeof value !== 'object');
2194         };
2195
2196         var toStr$6 = Object.prototype.toString;
2197
2198
2199
2200
2201
2202         // http://ecma-international.org/ecma-262/5.1/#sec-8.12.8
2203         var ES5internalSlots = {
2204                 '[[DefaultValue]]': function (O) {
2205                         var actualHint;
2206                         if (arguments.length > 1) {
2207                                 actualHint = arguments[1];
2208                         } else {
2209                                 actualHint = toStr$6.call(O) === '[object Date]' ? String : Number;
2210                         }
2211
2212                         if (actualHint === String || actualHint === Number) {
2213                                 var methods = actualHint === String ? ['toString', 'valueOf'] : ['valueOf', 'toString'];
2214                                 var value, i;
2215                                 for (i = 0; i < methods.length; ++i) {
2216                                         if (isCallable$1(O[methods[i]])) {
2217                                                 value = O[methods[i]]();
2218                                                 if (isPrimitive(value)) {
2219                                                         return value;
2220                                                 }
2221                                         }
2222                                 }
2223                                 throw new TypeError('No default value');
2224                         }
2225                         throw new TypeError('invalid [[DefaultValue]] hint supplied');
2226                 }
2227         };
2228
2229         // http://ecma-international.org/ecma-262/5.1/#sec-9.1
2230         var es5 = function ToPrimitive(input) {
2231                 if (isPrimitive(input)) {
2232                         return input;
2233                 }
2234                 if (arguments.length > 1) {
2235                         return ES5internalSlots['[[DefaultValue]]'](input, arguments[1]);
2236                 }
2237                 return ES5internalSlots['[[DefaultValue]]'](input);
2238         };
2239
2240         var $Object = GetIntrinsic('%Object%');
2241         var $TypeError$1 = GetIntrinsic('%TypeError%');
2242         var $String = GetIntrinsic('%String%');
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256         // https://es5.github.io/#x9
2257         var ES5 = {
2258                 ToPrimitive: es5,
2259
2260                 ToBoolean: function ToBoolean(value) {
2261                         return !!value;
2262                 },
2263                 ToNumber: function ToNumber(value) {
2264                         return +value; // eslint-disable-line no-implicit-coercion
2265                 },
2266                 ToInteger: function ToInteger(value) {
2267                         var number = this.ToNumber(value);
2268                         if (_isNaN(number)) { return 0; }
2269                         if (number === 0 || !_isFinite(number)) { return number; }
2270                         return sign$1(number) * Math.floor(Math.abs(number));
2271                 },
2272                 ToInt32: function ToInt32(x) {
2273                         return this.ToNumber(x) >> 0;
2274                 },
2275                 ToUint32: function ToUint32(x) {
2276                         return this.ToNumber(x) >>> 0;
2277                 },
2278                 ToUint16: function ToUint16(value) {
2279                         var number = this.ToNumber(value);
2280                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2281                         var posInt = sign$1(number) * Math.floor(Math.abs(number));
2282                         return mod(posInt, 0x10000);
2283                 },
2284                 ToString: function ToString(value) {
2285                         return $String(value);
2286                 },
2287                 ToObject: function ToObject(value) {
2288                         this.CheckObjectCoercible(value);
2289                         return $Object(value);
2290                 },
2291                 CheckObjectCoercible: function CheckObjectCoercible(value, optMessage) {
2292                         /* jshint eqnull:true */
2293                         if (value == null) {
2294                                 throw new $TypeError$1(optMessage || 'Cannot call method on ' + value);
2295                         }
2296                         return value;
2297                 },
2298                 IsCallable: isCallable$1,
2299                 SameValue: function SameValue(x, y) {
2300                         if (x === y) { // 0 === -0, but they are not identical.
2301                                 if (x === 0) { return 1 / x === 1 / y; }
2302                                 return true;
2303                         }
2304                         return _isNaN(x) && _isNaN(y);
2305                 },
2306
2307                 // https://www.ecma-international.org/ecma-262/5.1/#sec-8
2308                 Type: function Type(x) {
2309                         if (x === null) {
2310                                 return 'Null';
2311                         }
2312                         if (typeof x === 'undefined') {
2313                                 return 'Undefined';
2314                         }
2315                         if (typeof x === 'function' || typeof x === 'object') {
2316                                 return 'Object';
2317                         }
2318                         if (typeof x === 'number') {
2319                                 return 'Number';
2320                         }
2321                         if (typeof x === 'boolean') {
2322                                 return 'Boolean';
2323                         }
2324                         if (typeof x === 'string') {
2325                                 return 'String';
2326                         }
2327                 },
2328
2329                 // https://ecma-international.org/ecma-262/6.0/#sec-property-descriptor-specification-type
2330                 IsPropertyDescriptor: function IsPropertyDescriptor(Desc) {
2331                         if (this.Type(Desc) !== 'Object') {
2332                                 return false;
2333                         }
2334                         var allowed = {
2335                                 '[[Configurable]]': true,
2336                                 '[[Enumerable]]': true,
2337                                 '[[Get]]': true,
2338                                 '[[Set]]': true,
2339                                 '[[Value]]': true,
2340                                 '[[Writable]]': true
2341                         };
2342
2343                         for (var key in Desc) { // eslint-disable-line
2344                                 if (src(Desc, key) && !allowed[key]) {
2345                                         return false;
2346                                 }
2347                         }
2348
2349                         var isData = src(Desc, '[[Value]]');
2350                         var IsAccessor = src(Desc, '[[Get]]') || src(Desc, '[[Set]]');
2351                         if (isData && IsAccessor) {
2352                                 throw new $TypeError$1('Property Descriptors may not be both accessor and data descriptors');
2353                         }
2354                         return true;
2355                 },
2356
2357                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.1
2358                 IsAccessorDescriptor: function IsAccessorDescriptor(Desc) {
2359                         if (typeof Desc === 'undefined') {
2360                                 return false;
2361                         }
2362
2363                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2364
2365                         if (!src(Desc, '[[Get]]') && !src(Desc, '[[Set]]')) {
2366                                 return false;
2367                         }
2368
2369                         return true;
2370                 },
2371
2372                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.2
2373                 IsDataDescriptor: function IsDataDescriptor(Desc) {
2374                         if (typeof Desc === 'undefined') {
2375                                 return false;
2376                         }
2377
2378                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2379
2380                         if (!src(Desc, '[[Value]]') && !src(Desc, '[[Writable]]')) {
2381                                 return false;
2382                         }
2383
2384                         return true;
2385                 },
2386
2387                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.3
2388                 IsGenericDescriptor: function IsGenericDescriptor(Desc) {
2389                         if (typeof Desc === 'undefined') {
2390                                 return false;
2391                         }
2392
2393                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2394
2395                         if (!this.IsAccessorDescriptor(Desc) && !this.IsDataDescriptor(Desc)) {
2396                                 return true;
2397                         }
2398
2399                         return false;
2400                 },
2401
2402                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.4
2403                 FromPropertyDescriptor: function FromPropertyDescriptor(Desc) {
2404                         if (typeof Desc === 'undefined') {
2405                                 return Desc;
2406                         }
2407
2408                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2409
2410                         if (this.IsDataDescriptor(Desc)) {
2411                                 return {
2412                                         value: Desc['[[Value]]'],
2413                                         writable: !!Desc['[[Writable]]'],
2414                                         enumerable: !!Desc['[[Enumerable]]'],
2415                                         configurable: !!Desc['[[Configurable]]']
2416                                 };
2417                         } else if (this.IsAccessorDescriptor(Desc)) {
2418                                 return {
2419                                         get: Desc['[[Get]]'],
2420                                         set: Desc['[[Set]]'],
2421                                         enumerable: !!Desc['[[Enumerable]]'],
2422                                         configurable: !!Desc['[[Configurable]]']
2423                                 };
2424                         } else {
2425                                 throw new $TypeError$1('FromPropertyDescriptor must be called with a fully populated Property Descriptor');
2426                         }
2427                 },
2428
2429                 // https://ecma-international.org/ecma-262/5.1/#sec-8.10.5
2430                 ToPropertyDescriptor: function ToPropertyDescriptor(Obj) {
2431                         if (this.Type(Obj) !== 'Object') {
2432                                 throw new $TypeError$1('ToPropertyDescriptor requires an object');
2433                         }
2434
2435                         var desc = {};
2436                         if (src(Obj, 'enumerable')) {
2437                                 desc['[[Enumerable]]'] = this.ToBoolean(Obj.enumerable);
2438                         }
2439                         if (src(Obj, 'configurable')) {
2440                                 desc['[[Configurable]]'] = this.ToBoolean(Obj.configurable);
2441                         }
2442                         if (src(Obj, 'value')) {
2443                                 desc['[[Value]]'] = Obj.value;
2444                         }
2445                         if (src(Obj, 'writable')) {
2446                                 desc['[[Writable]]'] = this.ToBoolean(Obj.writable);
2447                         }
2448                         if (src(Obj, 'get')) {
2449                                 var getter = Obj.get;
2450                                 if (typeof getter !== 'undefined' && !this.IsCallable(getter)) {
2451                                         throw new TypeError('getter must be a function');
2452                                 }
2453                                 desc['[[Get]]'] = getter;
2454                         }
2455                         if (src(Obj, 'set')) {
2456                                 var setter = Obj.set;
2457                                 if (typeof setter !== 'undefined' && !this.IsCallable(setter)) {
2458                                         throw new $TypeError$1('setter must be a function');
2459                                 }
2460                                 desc['[[Set]]'] = setter;
2461                         }
2462
2463                         if ((src(desc, '[[Get]]') || src(desc, '[[Set]]')) && (src(desc, '[[Value]]') || src(desc, '[[Writable]]'))) {
2464                                 throw new $TypeError$1('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
2465                         }
2466                         return desc;
2467                 }
2468         };
2469
2470         var es5$1 = ES5;
2471
2472         var regexExec = RegExp.prototype.exec;
2473         var gOPD = Object.getOwnPropertyDescriptor;
2474
2475         var tryRegexExecCall = function tryRegexExec(value) {
2476                 try {
2477                         var lastIndex = value.lastIndex;
2478                         value.lastIndex = 0;
2479
2480                         regexExec.call(value);
2481                         return true;
2482                 } catch (e) {
2483                         return false;
2484                 } finally {
2485                         value.lastIndex = lastIndex;
2486                 }
2487         };
2488         var toStr$7 = Object.prototype.toString;
2489         var regexClass = '[object RegExp]';
2490         var hasToStringTag$2 = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
2491
2492         var isRegex = function isRegex(value) {
2493                 if (!value || typeof value !== 'object') {
2494                         return false;
2495                 }
2496                 if (!hasToStringTag$2) {
2497                         return toStr$7.call(value) === regexClass;
2498                 }
2499
2500                 var descriptor = gOPD(value, 'lastIndex');
2501                 var hasLastIndexDataProperty = descriptor && src(descriptor, 'value');
2502                 if (!hasLastIndexDataProperty) {
2503                         return false;
2504                 }
2505
2506                 return tryRegexExecCall(value);
2507         };
2508
2509         var $TypeError$2 = GetIntrinsic('%TypeError%');
2510         var $SyntaxError$1 = GetIntrinsic('%SyntaxError%');
2511         var $Array = GetIntrinsic('%Array%');
2512         var $String$1 = GetIntrinsic('%String%');
2513         var $Object$1 = GetIntrinsic('%Object%');
2514         var $Number = GetIntrinsic('%Number%');
2515         var $Symbol = GetIntrinsic('%Symbol%', true);
2516         var $RegExp = GetIntrinsic('%RegExp%');
2517
2518         var hasSymbols$4 = !!$Symbol;
2519
2520
2521
2522
2523         var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
2524
2525
2526
2527
2528
2529         var parseInteger = parseInt;
2530
2531         var arraySlice = functionBind.call(Function.call, $Array.prototype.slice);
2532         var strSlice = functionBind.call(Function.call, $String$1.prototype.slice);
2533         var isBinary = functionBind.call(Function.call, $RegExp.prototype.test, /^0b[01]+$/i);
2534         var isOctal = functionBind.call(Function.call, $RegExp.prototype.test, /^0o[0-7]+$/i);
2535         var regexExec$1 = functionBind.call(Function.call, $RegExp.prototype.exec);
2536         var nonWS = ['\u0085', '\u200b', '\ufffe'].join('');
2537         var nonWSregex = new $RegExp('[' + nonWS + ']', 'g');
2538         var hasNonWS = functionBind.call(Function.call, $RegExp.prototype.test, nonWSregex);
2539         var invalidHexLiteral = /^[-+]0x[0-9a-f]+$/i;
2540         var isInvalidHexLiteral = functionBind.call(Function.call, $RegExp.prototype.test, invalidHexLiteral);
2541         var $charCodeAt = functionBind.call(Function.call, $String$1.prototype.charCodeAt);
2542
2543         var toStr$8 = functionBind.call(Function.call, Object.prototype.toString);
2544
2545         var $NumberValueOf = functionBind.call(Function.call, GetIntrinsic('%NumberPrototype%').valueOf);
2546         var $BooleanValueOf = functionBind.call(Function.call, GetIntrinsic('%BooleanPrototype%').valueOf);
2547         var $StringValueOf = functionBind.call(Function.call, GetIntrinsic('%StringPrototype%').valueOf);
2548         var $DateValueOf = functionBind.call(Function.call, GetIntrinsic('%DatePrototype%').valueOf);
2549
2550         var $floor = Math.floor;
2551         var $abs = Math.abs;
2552
2553         var $ObjectCreate = Object.create;
2554         var $gOPD = $Object$1.getOwnPropertyDescriptor;
2555
2556         var $isExtensible = $Object$1.isExtensible;
2557
2558         var $defineProperty = $Object$1.defineProperty;
2559
2560         // whitespace from: http://es5.github.io/#x15.5.4.20
2561         // implementation from https://github.com/es-shims/es5-shim/blob/v3.4.0/es5-shim.js#L1304-L1324
2562         var ws = [
2563                 '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003',
2564                 '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028',
2565                 '\u2029\uFEFF'
2566         ].join('');
2567         var trimRegex = new RegExp('(^[' + ws + ']+)|([' + ws + ']+$)', 'g');
2568         var replace = functionBind.call(Function.call, $String$1.prototype.replace);
2569         var trim = function (value) {
2570                 return replace(value, trimRegex, '');
2571         };
2572
2573
2574
2575
2576
2577         // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-abstract-operations
2578         var ES6 = assign$1(assign$1({}, es5$1), {
2579
2580                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-call-f-v-args
2581                 Call: function Call(F, V) {
2582                         var args = arguments.length > 2 ? arguments[2] : [];
2583                         if (!this.IsCallable(F)) {
2584                                 throw new $TypeError$2(F + ' is not a function');
2585                         }
2586                         return F.apply(V, args);
2587                 },
2588
2589                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toprimitive
2590                 ToPrimitive: es6,
2591
2592                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toboolean
2593                 // ToBoolean: ES5.ToBoolean,
2594
2595                 // https://ecma-international.org/ecma-262/6.0/#sec-tonumber
2596                 ToNumber: function ToNumber(argument) {
2597                         var value = isPrimitive$1(argument) ? argument : es6(argument, $Number);
2598                         if (typeof value === 'symbol') {
2599                                 throw new $TypeError$2('Cannot convert a Symbol value to a number');
2600                         }
2601                         if (typeof value === 'string') {
2602                                 if (isBinary(value)) {
2603                                         return this.ToNumber(parseInteger(strSlice(value, 2), 2));
2604                                 } else if (isOctal(value)) {
2605                                         return this.ToNumber(parseInteger(strSlice(value, 2), 8));
2606                                 } else if (hasNonWS(value) || isInvalidHexLiteral(value)) {
2607                                         return NaN;
2608                                 } else {
2609                                         var trimmed = trim(value);
2610                                         if (trimmed !== value) {
2611                                                 return this.ToNumber(trimmed);
2612                                         }
2613                                 }
2614                         }
2615                         return $Number(value);
2616                 },
2617
2618                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tointeger
2619                 // ToInteger: ES5.ToNumber,
2620
2621                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint32
2622                 // ToInt32: ES5.ToInt32,
2623
2624                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint32
2625                 // ToUint32: ES5.ToUint32,
2626
2627                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint16
2628                 ToInt16: function ToInt16(argument) {
2629                         var int16bit = this.ToUint16(argument);
2630                         return int16bit >= 0x8000 ? int16bit - 0x10000 : int16bit;
2631                 },
2632
2633                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint16
2634                 // ToUint16: ES5.ToUint16,
2635
2636                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toint8
2637                 ToInt8: function ToInt8(argument) {
2638                         var int8bit = this.ToUint8(argument);
2639                         return int8bit >= 0x80 ? int8bit - 0x100 : int8bit;
2640                 },
2641
2642                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8
2643                 ToUint8: function ToUint8(argument) {
2644                         var number = this.ToNumber(argument);
2645                         if (_isNaN(number) || number === 0 || !_isFinite(number)) { return 0; }
2646                         var posInt = sign$1(number) * $floor($abs(number));
2647                         return mod(posInt, 0x100);
2648                 },
2649
2650                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-touint8clamp
2651                 ToUint8Clamp: function ToUint8Clamp(argument) {
2652                         var number = this.ToNumber(argument);
2653                         if (_isNaN(number) || number <= 0) { return 0; }
2654                         if (number >= 0xFF) { return 0xFF; }
2655                         var f = $floor(argument);
2656                         if (f + 0.5 < number) { return f + 1; }
2657                         if (number < f + 0.5) { return f; }
2658                         if (f % 2 !== 0) { return f + 1; }
2659                         return f;
2660                 },
2661
2662                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tostring
2663                 ToString: function ToString(argument) {
2664                         if (typeof argument === 'symbol') {
2665                                 throw new $TypeError$2('Cannot convert a Symbol value to a string');
2666                         }
2667                         return $String$1(argument);
2668                 },
2669
2670                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-toobject
2671                 ToObject: function ToObject(value) {
2672                         this.RequireObjectCoercible(value);
2673                         return $Object$1(value);
2674                 },
2675
2676                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-topropertykey
2677                 ToPropertyKey: function ToPropertyKey(argument) {
2678                         var key = this.ToPrimitive(argument, $String$1);
2679                         return typeof key === 'symbol' ? key : this.ToString(key);
2680                 },
2681
2682                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
2683                 ToLength: function ToLength(argument) {
2684                         var len = this.ToInteger(argument);
2685                         if (len <= 0) { return 0; } // includes converting -0 to +0
2686                         if (len > MAX_SAFE_INTEGER) { return MAX_SAFE_INTEGER; }
2687                         return len;
2688                 },
2689
2690                 // https://ecma-international.org/ecma-262/6.0/#sec-canonicalnumericindexstring
2691                 CanonicalNumericIndexString: function CanonicalNumericIndexString(argument) {
2692                         if (toStr$8(argument) !== '[object String]') {
2693                                 throw new $TypeError$2('must be a string');
2694                         }
2695                         if (argument === '-0') { return -0; }
2696                         var n = this.ToNumber(argument);
2697                         if (this.SameValue(this.ToString(n), argument)) { return n; }
2698                         return void 0;
2699                 },
2700
2701                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-requireobjectcoercible
2702                 RequireObjectCoercible: es5$1.CheckObjectCoercible,
2703
2704                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isarray
2705                 IsArray: $Array.isArray || function IsArray(argument) {
2706                         return toStr$8(argument) === '[object Array]';
2707                 },
2708
2709                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-iscallable
2710                 // IsCallable: ES5.IsCallable,
2711
2712                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isconstructor
2713                 IsConstructor: function IsConstructor(argument) {
2714                         return typeof argument === 'function' && !!argument.prototype; // unfortunately there's no way to truly check this without try/catch `new argument`
2715                 },
2716
2717                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isextensible-o
2718                 IsExtensible: Object.preventExtensions
2719                         ? function IsExtensible(obj) {
2720                                 if (isPrimitive$1(obj)) {
2721                                         return false;
2722                                 }
2723                                 return $isExtensible(obj);
2724                         }
2725                         : function isExtensible(obj) { return true; }, // eslint-disable-line no-unused-vars
2726
2727                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-isinteger
2728                 IsInteger: function IsInteger(argument) {
2729                         if (typeof argument !== 'number' || _isNaN(argument) || !_isFinite(argument)) {
2730                                 return false;
2731                         }
2732                         var abs = $abs(argument);
2733                         return $floor(abs) === abs;
2734                 },
2735
2736                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-ispropertykey
2737                 IsPropertyKey: function IsPropertyKey(argument) {
2738                         return typeof argument === 'string' || typeof argument === 'symbol';
2739                 },
2740
2741                 // https://ecma-international.org/ecma-262/6.0/#sec-isregexp
2742                 IsRegExp: function IsRegExp(argument) {
2743                         if (!argument || typeof argument !== 'object') {
2744                                 return false;
2745                         }
2746                         if (hasSymbols$4) {
2747                                 var isRegExp = argument[$Symbol.match];
2748                                 if (typeof isRegExp !== 'undefined') {
2749                                         return es5$1.ToBoolean(isRegExp);
2750                                 }
2751                         }
2752                         return isRegex(argument);
2753                 },
2754
2755                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevalue
2756                 // SameValue: ES5.SameValue,
2757
2758                 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-samevaluezero
2759                 SameValueZero: function SameValueZero(x, y) {
2760                         return (x === y) || (_isNaN(x) && _isNaN(y));
2761                 },
2762
2763                 /**
2764                  * 7.3.2 GetV (V, P)
2765                  * 1. Assert: IsPropertyKey(P) is true.
2766                  * 2. Let O be ToObject(V).
2767                  * 3. ReturnIfAbrupt(O).
2768                  * 4. Return O.[[Get]](P, V).
2769                  */
2770                 GetV: function GetV(V, P) {
2771                         // 7.3.2.1
2772                         if (!this.IsPropertyKey(P)) {
2773                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2774                         }
2775
2776                         // 7.3.2.2-3
2777                         var O = this.ToObject(V);
2778
2779                         // 7.3.2.4
2780                         return O[P];
2781                 },
2782
2783                 /**
2784                  * 7.3.9 - https://ecma-international.org/ecma-262/6.0/#sec-getmethod
2785                  * 1. Assert: IsPropertyKey(P) is true.
2786                  * 2. Let func be GetV(O, P).
2787                  * 3. ReturnIfAbrupt(func).
2788                  * 4. If func is either undefined or null, return undefined.
2789                  * 5. If IsCallable(func) is false, throw a TypeError exception.
2790                  * 6. Return func.
2791                  */
2792                 GetMethod: function GetMethod(O, P) {
2793                         // 7.3.9.1
2794                         if (!this.IsPropertyKey(P)) {
2795                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2796                         }
2797
2798                         // 7.3.9.2
2799                         var func = this.GetV(O, P);
2800
2801                         // 7.3.9.4
2802                         if (func == null) {
2803                                 return void 0;
2804                         }
2805
2806                         // 7.3.9.5
2807                         if (!this.IsCallable(func)) {
2808                                 throw new $TypeError$2(P + 'is not a function');
2809                         }
2810
2811                         // 7.3.9.6
2812                         return func;
2813                 },
2814
2815                 /**
2816                  * 7.3.1 Get (O, P) - https://ecma-international.org/ecma-262/6.0/#sec-get-o-p
2817                  * 1. Assert: Type(O) is Object.
2818                  * 2. Assert: IsPropertyKey(P) is true.
2819                  * 3. Return O.[[Get]](P, O).
2820                  */
2821                 Get: function Get(O, P) {
2822                         // 7.3.1.1
2823                         if (this.Type(O) !== 'Object') {
2824                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2825                         }
2826                         // 7.3.1.2
2827                         if (!this.IsPropertyKey(P)) {
2828                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
2829                         }
2830                         // 7.3.1.3
2831                         return O[P];
2832                 },
2833
2834                 Type: function Type(x) {
2835                         if (typeof x === 'symbol') {
2836                                 return 'Symbol';
2837                         }
2838                         return es5$1.Type(x);
2839                 },
2840
2841                 // https://ecma-international.org/ecma-262/6.0/#sec-speciesconstructor
2842                 SpeciesConstructor: function SpeciesConstructor(O, defaultConstructor) {
2843                         if (this.Type(O) !== 'Object') {
2844                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
2845                         }
2846                         var C = O.constructor;
2847                         if (typeof C === 'undefined') {
2848                                 return defaultConstructor;
2849                         }
2850                         if (this.Type(C) !== 'Object') {
2851                                 throw new $TypeError$2('O.constructor is not an Object');
2852                         }
2853                         var S = hasSymbols$4 && $Symbol.species ? C[$Symbol.species] : void 0;
2854                         if (S == null) {
2855                                 return defaultConstructor;
2856                         }
2857                         if (this.IsConstructor(S)) {
2858                                 return S;
2859                         }
2860                         throw new $TypeError$2('no constructor found');
2861                 },
2862
2863                 // https://ecma-international.org/ecma-262/6.0/#sec-completepropertydescriptor
2864                 CompletePropertyDescriptor: function CompletePropertyDescriptor(Desc) {
2865                         assertRecord(this, 'Property Descriptor', 'Desc', Desc);
2866
2867                         if (this.IsGenericDescriptor(Desc) || this.IsDataDescriptor(Desc)) {
2868                                 if (!src(Desc, '[[Value]]')) {
2869                                         Desc['[[Value]]'] = void 0;
2870                                 }
2871                                 if (!src(Desc, '[[Writable]]')) {
2872                                         Desc['[[Writable]]'] = false;
2873                                 }
2874                         } else {
2875                                 if (!src(Desc, '[[Get]]')) {
2876                                         Desc['[[Get]]'] = void 0;
2877                                 }
2878                                 if (!src(Desc, '[[Set]]')) {
2879                                         Desc['[[Set]]'] = void 0;
2880                                 }
2881                         }
2882                         if (!src(Desc, '[[Enumerable]]')) {
2883                                 Desc['[[Enumerable]]'] = false;
2884                         }
2885                         if (!src(Desc, '[[Configurable]]')) {
2886                                 Desc['[[Configurable]]'] = false;
2887                         }
2888                         return Desc;
2889                 },
2890
2891                 // https://ecma-international.org/ecma-262/6.0/#sec-set-o-p-v-throw
2892                 Set: function Set(O, P, V, Throw) {
2893                         if (this.Type(O) !== 'Object') {
2894                                 throw new $TypeError$2('O must be an Object');
2895                         }
2896                         if (!this.IsPropertyKey(P)) {
2897                                 throw new $TypeError$2('P must be a Property Key');
2898                         }
2899                         if (this.Type(Throw) !== 'Boolean') {
2900                                 throw new $TypeError$2('Throw must be a Boolean');
2901                         }
2902                         if (Throw) {
2903                                 O[P] = V;
2904                                 return true;
2905                         } else {
2906                                 try {
2907                                         O[P] = V;
2908                                 } catch (e) {
2909                                         return false;
2910                                 }
2911                         }
2912                 },
2913
2914                 // https://ecma-international.org/ecma-262/6.0/#sec-hasownproperty
2915                 HasOwnProperty: function HasOwnProperty(O, P) {
2916                         if (this.Type(O) !== 'Object') {
2917                                 throw new $TypeError$2('O must be an Object');
2918                         }
2919                         if (!this.IsPropertyKey(P)) {
2920                                 throw new $TypeError$2('P must be a Property Key');
2921                         }
2922                         return src(O, P);
2923                 },
2924
2925                 // https://ecma-international.org/ecma-262/6.0/#sec-hasproperty
2926                 HasProperty: function HasProperty(O, P) {
2927                         if (this.Type(O) !== 'Object') {
2928                                 throw new $TypeError$2('O must be an Object');
2929                         }
2930                         if (!this.IsPropertyKey(P)) {
2931                                 throw new $TypeError$2('P must be a Property Key');
2932                         }
2933                         return P in O;
2934                 },
2935
2936                 // https://ecma-international.org/ecma-262/6.0/#sec-isconcatspreadable
2937                 IsConcatSpreadable: function IsConcatSpreadable(O) {
2938                         if (this.Type(O) !== 'Object') {
2939                                 return false;
2940                         }
2941                         if (hasSymbols$4 && typeof $Symbol.isConcatSpreadable === 'symbol') {
2942                                 var spreadable = this.Get(O, Symbol.isConcatSpreadable);
2943                                 if (typeof spreadable !== 'undefined') {
2944                                         return this.ToBoolean(spreadable);
2945                                 }
2946                         }
2947                         return this.IsArray(O);
2948                 },
2949
2950                 // https://ecma-international.org/ecma-262/6.0/#sec-invoke
2951                 Invoke: function Invoke(O, P) {
2952                         if (!this.IsPropertyKey(P)) {
2953                                 throw new $TypeError$2('P must be a Property Key');
2954                         }
2955                         var argumentsList = arraySlice(arguments, 2);
2956                         var func = this.GetV(O, P);
2957                         return this.Call(func, O, argumentsList);
2958                 },
2959
2960                 // https://ecma-international.org/ecma-262/6.0/#sec-getiterator
2961                 GetIterator: function GetIterator(obj, method) {
2962                         if (!hasSymbols$4) {
2963                                 throw new SyntaxError('ES.GetIterator depends on native iterator support.');
2964                         }
2965
2966                         var actualMethod = method;
2967                         if (arguments.length < 2) {
2968                                 actualMethod = this.GetMethod(obj, $Symbol.iterator);
2969                         }
2970                         var iterator = this.Call(actualMethod, obj);
2971                         if (this.Type(iterator) !== 'Object') {
2972                                 throw new $TypeError$2('iterator must return an object');
2973                         }
2974
2975                         return iterator;
2976                 },
2977
2978                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratornext
2979                 IteratorNext: function IteratorNext(iterator, value) {
2980                         var result = this.Invoke(iterator, 'next', arguments.length < 2 ? [] : [value]);
2981                         if (this.Type(result) !== 'Object') {
2982                                 throw new $TypeError$2('iterator next must return an object');
2983                         }
2984                         return result;
2985                 },
2986
2987                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorcomplete
2988                 IteratorComplete: function IteratorComplete(iterResult) {
2989                         if (this.Type(iterResult) !== 'Object') {
2990                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2991                         }
2992                         return this.ToBoolean(this.Get(iterResult, 'done'));
2993                 },
2994
2995                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorvalue
2996                 IteratorValue: function IteratorValue(iterResult) {
2997                         if (this.Type(iterResult) !== 'Object') {
2998                                 throw new $TypeError$2('Assertion failed: Type(iterResult) is not Object');
2999                         }
3000                         return this.Get(iterResult, 'value');
3001                 },
3002
3003                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorstep
3004                 IteratorStep: function IteratorStep(iterator) {
3005                         var result = this.IteratorNext(iterator);
3006                         var done = this.IteratorComplete(result);
3007                         return done === true ? false : result;
3008                 },
3009
3010                 // https://ecma-international.org/ecma-262/6.0/#sec-iteratorclose
3011                 IteratorClose: function IteratorClose(iterator, completion) {
3012                         if (this.Type(iterator) !== 'Object') {
3013                                 throw new $TypeError$2('Assertion failed: Type(iterator) is not Object');
3014                         }
3015                         if (!this.IsCallable(completion)) {
3016                                 throw new $TypeError$2('Assertion failed: completion is not a thunk for a Completion Record');
3017                         }
3018                         var completionThunk = completion;
3019
3020                         var iteratorReturn = this.GetMethod(iterator, 'return');
3021
3022                         if (typeof iteratorReturn === 'undefined') {
3023                                 return completionThunk();
3024                         }
3025
3026                         var completionRecord;
3027                         try {
3028                                 var innerResult = this.Call(iteratorReturn, iterator, []);
3029                         } catch (e) {
3030                                 // if we hit here, then "e" is the innerResult completion that needs re-throwing
3031
3032                                 // if the completion is of type "throw", this will throw.
3033                                 completionRecord = completionThunk();
3034                                 completionThunk = null; // ensure it's not called twice.
3035
3036                                 // if not, then return the innerResult completion
3037                                 throw e;
3038                         }
3039                         completionRecord = completionThunk(); // if innerResult worked, then throw if the completion does
3040                         completionThunk = null; // ensure it's not called twice.
3041
3042                         if (this.Type(innerResult) !== 'Object') {
3043                                 throw new $TypeError$2('iterator .return must return an object');
3044                         }
3045
3046                         return completionRecord;
3047                 },
3048
3049                 // https://ecma-international.org/ecma-262/6.0/#sec-createiterresultobject
3050                 CreateIterResultObject: function CreateIterResultObject(value, done) {
3051                         if (this.Type(done) !== 'Boolean') {
3052                                 throw new $TypeError$2('Assertion failed: Type(done) is not Boolean');
3053                         }
3054                         return {
3055                                 value: value,
3056                                 done: done
3057                         };
3058                 },
3059
3060                 // https://ecma-international.org/ecma-262/6.0/#sec-regexpexec
3061                 RegExpExec: function RegExpExec(R, S) {
3062                         if (this.Type(R) !== 'Object') {
3063                                 throw new $TypeError$2('R must be an Object');
3064                         }
3065                         if (this.Type(S) !== 'String') {
3066                                 throw new $TypeError$2('S must be a String');
3067                         }
3068                         var exec = this.Get(R, 'exec');
3069                         if (this.IsCallable(exec)) {
3070                                 var result = this.Call(exec, R, [S]);
3071                                 if (result === null || this.Type(result) === 'Object') {
3072                                         return result;
3073                                 }
3074                                 throw new $TypeError$2('"exec" method must return `null` or an Object');
3075                         }
3076                         return regexExec$1(R, S);
3077                 },
3078
3079                 // https://ecma-international.org/ecma-262/6.0/#sec-arrayspeciescreate
3080                 ArraySpeciesCreate: function ArraySpeciesCreate(originalArray, length) {
3081                         if (!this.IsInteger(length) || length < 0) {
3082                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0');
3083                         }
3084                         var len = length === 0 ? 0 : length;
3085                         var C;
3086                         var isArray = this.IsArray(originalArray);
3087                         if (isArray) {
3088                                 C = this.Get(originalArray, 'constructor');
3089                                 // TODO: figure out how to make a cross-realm normal Array, a same-realm Array
3090                                 // if (this.IsConstructor(C)) {
3091                                 //      if C is another realm's Array, C = undefined
3092                                 //      Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
3093                                 // }
3094                                 if (this.Type(C) === 'Object' && hasSymbols$4 && $Symbol.species) {
3095                                         C = this.Get(C, $Symbol.species);
3096                                         if (C === null) {
3097                                                 C = void 0;
3098                                         }
3099                                 }
3100                         }
3101                         if (typeof C === 'undefined') {
3102                                 return $Array(len);
3103                         }
3104                         if (!this.IsConstructor(C)) {
3105                                 throw new $TypeError$2('C must be a constructor');
3106                         }
3107                         return new C(len); // this.Construct(C, len);
3108                 },
3109
3110                 CreateDataProperty: function CreateDataProperty(O, P, V) {
3111                         if (this.Type(O) !== 'Object') {
3112                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3113                         }
3114                         if (!this.IsPropertyKey(P)) {
3115                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3116                         }
3117                         var oldDesc = $gOPD(O, P);
3118                         var extensible = oldDesc || (typeof $isExtensible !== 'function' || $isExtensible(O));
3119                         var immutable = oldDesc && (!oldDesc.writable || !oldDesc.configurable);
3120                         if (immutable || !extensible) {
3121                                 return false;
3122                         }
3123                         var newDesc = {
3124                                 configurable: true,
3125                                 enumerable: true,
3126                                 value: V,
3127                                 writable: true
3128                         };
3129                         $defineProperty(O, P, newDesc);
3130                         return true;
3131                 },
3132
3133                 // https://ecma-international.org/ecma-262/6.0/#sec-createdatapropertyorthrow
3134                 CreateDataPropertyOrThrow: function CreateDataPropertyOrThrow(O, P, V) {
3135                         if (this.Type(O) !== 'Object') {
3136                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3137                         }
3138                         if (!this.IsPropertyKey(P)) {
3139                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3140                         }
3141                         var success = this.CreateDataProperty(O, P, V);
3142                         if (!success) {
3143                                 throw new $TypeError$2('unable to create data property');
3144                         }
3145                         return success;
3146                 },
3147
3148                 // https://www.ecma-international.org/ecma-262/6.0/#sec-objectcreate
3149                 ObjectCreate: function ObjectCreate(proto, internalSlotsList) {
3150                         if (proto !== null && this.Type(proto) !== 'Object') {
3151                                 throw new $TypeError$2('Assertion failed: proto must be null or an object');
3152                         }
3153                         var slots = arguments.length < 2 ? [] : internalSlotsList;
3154                         if (slots.length > 0) {
3155                                 throw new $SyntaxError$1('es-abstract does not yet support internal slots');
3156                         }
3157
3158                         if (proto === null && !$ObjectCreate) {
3159                                 throw new $SyntaxError$1('native Object.create support is required to create null objects');
3160                         }
3161
3162                         return $ObjectCreate(proto);
3163                 },
3164
3165                 // https://ecma-international.org/ecma-262/6.0/#sec-advancestringindex
3166                 AdvanceStringIndex: function AdvanceStringIndex(S, index, unicode) {
3167                         if (this.Type(S) !== 'String') {
3168                                 throw new $TypeError$2('S must be a String');
3169                         }
3170                         if (!this.IsInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
3171                                 throw new $TypeError$2('Assertion failed: length must be an integer >= 0 and <= 2**53');
3172                         }
3173                         if (this.Type(unicode) !== 'Boolean') {
3174                                 throw new $TypeError$2('Assertion failed: unicode must be a Boolean');
3175                         }
3176                         if (!unicode) {
3177                                 return index + 1;
3178                         }
3179                         var length = S.length;
3180                         if ((index + 1) >= length) {
3181                                 return index + 1;
3182                         }
3183
3184                         var first = $charCodeAt(S, index);
3185                         if (first < 0xD800 || first > 0xDBFF) {
3186                                 return index + 1;
3187                         }
3188
3189                         var second = $charCodeAt(S, index + 1);
3190                         if (second < 0xDC00 || second > 0xDFFF) {
3191                                 return index + 1;
3192                         }
3193
3194                         return index + 2;
3195                 },
3196
3197                 // https://www.ecma-international.org/ecma-262/6.0/#sec-createmethodproperty
3198                 CreateMethodProperty: function CreateMethodProperty(O, P, V) {
3199                         if (this.Type(O) !== 'Object') {
3200                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3201                         }
3202
3203                         if (!this.IsPropertyKey(P)) {
3204                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3205                         }
3206
3207                         var newDesc = {
3208                                 configurable: true,
3209                                 enumerable: false,
3210                                 value: V,
3211                                 writable: true
3212                         };
3213                         return !!$defineProperty(O, P, newDesc);
3214                 },
3215
3216                 // https://www.ecma-international.org/ecma-262/6.0/#sec-definepropertyorthrow
3217                 DefinePropertyOrThrow: function DefinePropertyOrThrow(O, P, desc) {
3218                         if (this.Type(O) !== 'Object') {
3219                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3220                         }
3221
3222                         if (!this.IsPropertyKey(P)) {
3223                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3224                         }
3225
3226                         return !!$defineProperty(O, P, desc);
3227                 },
3228
3229                 // https://www.ecma-international.org/ecma-262/6.0/#sec-deletepropertyorthrow
3230                 DeletePropertyOrThrow: function DeletePropertyOrThrow(O, P) {
3231                         if (this.Type(O) !== 'Object') {
3232                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3233                         }
3234
3235                         if (!this.IsPropertyKey(P)) {
3236                                 throw new $TypeError$2('Assertion failed: IsPropertyKey(P) is not true');
3237                         }
3238
3239                         var success = delete O[P];
3240                         if (!success) {
3241                                 throw new TypeError('Attempt to delete property failed.');
3242                         }
3243                         return success;
3244                 },
3245
3246                 // https://www.ecma-international.org/ecma-262/6.0/#sec-enumerableownnames
3247                 EnumerableOwnNames: function EnumerableOwnNames(O) {
3248                         if (this.Type(O) !== 'Object') {
3249                                 throw new $TypeError$2('Assertion failed: Type(O) is not Object');
3250                         }
3251
3252                         return objectKeys(O);
3253                 },
3254
3255                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-number-prototype-object
3256                 thisNumberValue: function thisNumberValue(value) {
3257                         if (this.Type(value) === 'Number') {
3258                                 return value;
3259                         }
3260
3261                         return $NumberValueOf(value);
3262                 },
3263
3264                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-boolean-prototype-object
3265                 thisBooleanValue: function thisBooleanValue(value) {
3266                         if (this.Type(value) === 'Boolean') {
3267                                 return value;
3268                         }
3269
3270                         return $BooleanValueOf(value);
3271                 },
3272
3273                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-string-prototype-object
3274                 thisStringValue: function thisStringValue(value) {
3275                         if (this.Type(value) === 'String') {
3276                                 return value;
3277                         }
3278
3279                         return $StringValueOf(value);
3280                 },
3281
3282                 // https://ecma-international.org/ecma-262/6.0/#sec-properties-of-the-date-prototype-object
3283                 thisTimeValue: function thisTimeValue(value) {
3284                         return $DateValueOf(value);
3285                 }
3286         });
3287
3288         delete ES6.CheckObjectCoercible; // renamed in ES6 to RequireObjectCoercible
3289
3290         var es2015$1 = ES6;
3291
3292         var es6$1 = es2015$1;
3293
3294         var implementation$2 = function find(predicate) {
3295                 var list = es6$1.ToObject(this);
3296                 var length = es6$1.ToInteger(es6$1.ToLength(list.length));
3297                 if (!es6$1.IsCallable(predicate)) {
3298                         throw new TypeError('Array#find: predicate must be a function');
3299                 }
3300                 if (length === 0) {
3301                         return undefined;
3302                 }
3303                 var thisArg = arguments[1];
3304                 for (var i = 0, value; i < length; i++) {
3305                         value = list[i];
3306                         if (es6$1.Call(predicate, thisArg, [value, i, list])) {
3307                                 return value;
3308                         }
3309                 }
3310                 return undefined;
3311         };
3312
3313         var polyfill$3 = function getPolyfill() {
3314                 // Detect if an implementation exists
3315                 // Detect early implementations which skipped holes in sparse arrays
3316           // eslint-disable-next-line no-sparse-arrays
3317                 var implemented = Array.prototype.find && [, 1].find(function () {
3318                         return true;
3319                 }) !== 1;
3320
3321           // eslint-disable-next-line global-require
3322                 return implemented ? Array.prototype.find : implementation$2;
3323         };
3324
3325         var shim$8 = function shimArrayPrototypeFind() {
3326                 var polyfill = polyfill$3();
3327
3328                 defineProperties_1(Array.prototype, { find: polyfill }, {
3329                         find: function () {
3330                                 return Array.prototype.find !== polyfill;
3331                         }
3332                 });
3333
3334                 return polyfill;
3335         };
3336
3337         var slice$2 = Array.prototype.slice;
3338
3339         var polyfill$4 = polyfill$3();
3340
3341         var boundFindShim = function find(array, predicate) { // eslint-disable-line no-unused-vars
3342                 es6$1.RequireObjectCoercible(array);
3343                 var args = slice$2.call(arguments, 1);
3344                 return polyfill$4.apply(array, args);
3345         };
3346
3347         defineProperties_1(boundFindShim, {
3348                 getPolyfill: polyfill$3,
3349                 implementation: implementation$2,
3350                 shim: shim$8
3351         });
3352
3353         var array_prototype_find = boundFindShim;
3354
3355         var implementation$3 = function findIndex(predicate) {
3356                 var list = es6$1.ToObject(this);
3357                 var length = es6$1.ToLength(list.length);
3358                 if (!es6$1.IsCallable(predicate)) {
3359                         throw new TypeError('Array#findIndex: predicate must be a function');
3360                 }
3361                 if (length === 0) return -1;
3362                 var thisArg = arguments[1];
3363                 for (var i = 0, value; i < length; i++) {
3364                         value = list[i];
3365                         if (es6$1.Call(predicate, thisArg, [value, i, list])) return i;
3366                 }
3367                 return -1;
3368         };
3369
3370         var polyfill$5 = function getPolyfill() {
3371                 // Detect if an implementation exists
3372                 // Detect early implementations which skipped holes in sparse arrays
3373                 var implemented = Array.prototype.findIndex && ([, 1].findIndex(function (item, idx) {
3374                         return idx === 0;
3375                 }) === 0);
3376
3377
3378                 return implemented ? Array.prototype.findIndex : implementation$3;
3379         };
3380
3381         var shim$9 = function shimArrayPrototypeFindIndex() {
3382                 var polyfill = polyfill$5();
3383
3384                 defineProperties_1(Array.prototype, { findIndex: polyfill }, {
3385                         findIndex: function () {
3386                                 return Array.prototype.findIndex !== polyfill;
3387                         }
3388                 });
3389
3390                 return polyfill;
3391         };
3392
3393         var slice$3 = Array.prototype.slice;
3394
3395         var polyfill$6 = polyfill$5();
3396
3397         var boundShim = function findIndex(array, predicate) {
3398                 es6$1.RequireObjectCoercible(array);
3399                 var args = slice$3.call(arguments, 1);
3400                 return polyfill$6.apply(array, args);
3401         };
3402
3403         defineProperties_1(boundShim, {
3404                 implementation: implementation$3,
3405                 getPolyfill: polyfill$5,
3406                 shim: shim$9
3407         });
3408
3409         var array_prototype_findindex = boundShim;
3410
3411         var supportsDescriptors$1 = defineProperties_1.supportsDescriptors;
3412
3413         /*! https://mths.be/array-from v0.2.0 by @mathias */
3414         var implementation$4 = function from(arrayLike) {
3415                 var defineProperty = supportsDescriptors$1 ? Object.defineProperty : function put(object, key, descriptor) {
3416                         object[key] = descriptor.value;
3417                 };
3418                 var C = this;
3419                 if (arrayLike === null || typeof arrayLike === 'undefined') {
3420                         throw new TypeError('`Array.from` requires an array-like object, not `null` or `undefined`');
3421                 }
3422                 var items = es6$1.ToObject(arrayLike);
3423
3424                 var mapFn, T;
3425                 if (typeof arguments[1] !== 'undefined') {
3426                         mapFn = arguments[1];
3427                         if (!es6$1.IsCallable(mapFn)) {
3428                                 throw new TypeError('When provided, the second argument to `Array.from` must be a function');
3429                         }
3430                         if (arguments.length > 2) {
3431                                 T = arguments[2];
3432                         }
3433                 }
3434
3435                 var len = es6$1.ToLength(items.length);
3436                 var A = es6$1.IsCallable(C) ? es6$1.ToObject(new C(len)) : new Array(len);
3437                 var k = 0;
3438                 var kValue, mappedValue;
3439                 while (k < len) {
3440                         kValue = items[k];
3441                         if (mapFn) {
3442                                 mappedValue = typeof T === 'undefined' ? mapFn(kValue, k) : es6$1.Call(mapFn, T, [kValue, k]);
3443                         } else {
3444                                 mappedValue = kValue;
3445                         }
3446                         defineProperty(A, k, {
3447                                 'configurable': true,
3448                                 'enumerable': true,
3449                                 'value': mappedValue,
3450                                 'writable': true
3451                         });
3452                         k += 1;
3453                 }
3454                 A.length = len;
3455                 return A;
3456         };
3457
3458         var tryCall = function (fn) {
3459                 try {
3460                         fn();
3461                         return true;
3462                 } catch (e) {
3463                         return false;
3464                 }
3465         };
3466
3467         var polyfill$7 = function getPolyfill() {
3468                 var implemented = es6$1.IsCallable(Array.from)
3469                         && tryCall(function () { })
3470                         && !tryCall(function () { });
3471
3472                 return implemented ? Array.from : implementation$4;
3473         };
3474
3475         var shim$a = function shimArrayFrom() {
3476                 var polyfill = polyfill$7();
3477
3478                 defineProperties_1(Array, { 'from': polyfill }, {
3479                         'from': function () {
3480                                 return Array.from !== polyfill;
3481                         }
3482                 });
3483
3484                 return polyfill;
3485         };
3486
3487         // eslint-disable-next-line no-unused-vars
3488         var boundFromShim = function from(array) {
3489             // eslint-disable-next-line no-invalid-this
3490                 return implementation$4.apply(this || Array, arguments);
3491         };
3492
3493         defineProperties_1(boundFromShim, {
3494                 'getPolyfill': polyfill$7,
3495                 'implementation': implementation$4,
3496                 'shim': shim$a
3497         });
3498
3499         var array_from = boundFromShim;
3500
3501         var ES2016 = assign$1(assign$1({}, es2015$1), {
3502                 // https://github.com/tc39/ecma262/pull/60
3503                 SameValueNonNumber: function SameValueNonNumber(x, y) {
3504                         if (typeof x === 'number' || typeof x !== typeof y) {
3505                                 throw new TypeError('SameValueNonNumber requires two non-number values of the same type.');
3506                         }
3507                         return this.SameValue(x, y);
3508                 }
3509         });
3510
3511         var es2016 = ES2016;
3512
3513         var es7 = es2016;
3514
3515         var isEnumerable$1 = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3516
3517         var implementation$5 = function values(O) {
3518                 var obj = es7.RequireObjectCoercible(O);
3519                 var vals = [];
3520                 for (var key in obj) {
3521                         if (src(obj, key) && isEnumerable$1(obj, key)) {
3522                                 vals.push(obj[key]);
3523                         }
3524                 }
3525                 return vals;
3526         };
3527
3528         var polyfill$8 = function getPolyfill() {
3529                 return typeof Object.values === 'function' ? Object.values : implementation$5;
3530         };
3531
3532         var shim$b = function shimValues() {
3533                 var polyfill = polyfill$8();
3534                 defineProperties_1(Object, { values: polyfill }, {
3535                         values: function testValues() {
3536                                 return Object.values !== polyfill;
3537                         }
3538                 });
3539                 return polyfill;
3540         };
3541
3542         var polyfill$9 = polyfill$8();
3543
3544         defineProperties_1(polyfill$9, {
3545                 getPolyfill: polyfill$8,
3546                 implementation: implementation$5,
3547                 shim: shim$b
3548         });
3549
3550         var object_values = polyfill$9;
3551
3552         // modified from https://github.com/es-shims/es6-shim
3553
3554
3555         var canBeObject = function (obj) {
3556                 return typeof obj !== 'undefined' && obj !== null;
3557         };
3558         var hasSymbols$5 = shams();
3559         var toObject = Object;
3560         var push = functionBind.call(Function.call, Array.prototype.push);
3561         var propIsEnumerable = functionBind.call(Function.call, Object.prototype.propertyIsEnumerable);
3562         var originalGetSymbols = hasSymbols$5 ? Object.getOwnPropertySymbols : null;
3563
3564         var implementation$6 = function assign(target, source1) {
3565                 if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
3566                 var objTarget = toObject(target);
3567                 var s, source, i, props, syms, value, key;
3568                 for (s = 1; s < arguments.length; ++s) {
3569                         source = toObject(arguments[s]);
3570                         props = objectKeys(source);
3571                         var getSymbols = hasSymbols$5 && (Object.getOwnPropertySymbols || originalGetSymbols);
3572                         if (getSymbols) {
3573                                 syms = getSymbols(source);
3574                                 for (i = 0; i < syms.length; ++i) {
3575                                         key = syms[i];
3576                                         if (propIsEnumerable(source, key)) {
3577                                                 push(props, key);
3578                                         }
3579                                 }
3580                         }
3581                         for (i = 0; i < props.length; ++i) {
3582                                 key = props[i];
3583                                 value = source[key];
3584                                 if (propIsEnumerable(source, key)) {
3585                                         objTarget[key] = value;
3586                                 }
3587                         }
3588                 }
3589                 return objTarget;
3590         };
3591
3592         var lacksProperEnumerationOrder = function () {
3593                 if (!Object.assign) {
3594                         return false;
3595                 }
3596                 // v8, specifically in node 4.x, has a bug with incorrect property enumeration order
3597                 // note: this does not detect the bug unless there's 20 characters
3598                 var str = 'abcdefghijklmnopqrst';
3599                 var letters = str.split('');
3600                 var map = {};
3601                 for (var i = 0; i < letters.length; ++i) {
3602                         map[letters[i]] = letters[i];
3603                 }
3604                 var obj = Object.assign({}, map);
3605                 var actual = '';
3606                 for (var k in obj) {
3607                         actual += k;
3608                 }
3609                 return str !== actual;
3610         };
3611
3612         var assignHasPendingExceptions = function () {
3613                 if (!Object.assign || !Object.preventExtensions) {
3614                         return false;
3615                 }
3616                 // Firefox 37 still has "pending exception" logic in its Object.assign implementation,
3617                 // which is 72% slower than our shim, and Firefox 40's native implementation.
3618                 var thrower = Object.preventExtensions({ 1: 2 });
3619                 try {
3620                         Object.assign(thrower, 'xy');
3621                 } catch (e) {
3622                         return thrower[1] === 'y';
3623                 }
3624                 return false;
3625         };
3626
3627         var polyfill$a = function getPolyfill() {
3628                 if (!Object.assign) {
3629                         return implementation$6;
3630                 }
3631                 if (lacksProperEnumerationOrder()) {
3632                         return implementation$6;
3633                 }
3634                 if (assignHasPendingExceptions()) {
3635                         return implementation$6;
3636                 }
3637                 return Object.assign;
3638         };
3639
3640         var shim$c = function shimAssign() {
3641                 var polyfill = polyfill$a();
3642                 defineProperties_1(
3643                         Object,
3644                         { assign: polyfill },
3645                         { assign: function () { return Object.assign !== polyfill; } }
3646                 );
3647                 return polyfill;
3648         };
3649
3650         var polyfill$b = polyfill$a();
3651
3652         defineProperties_1(polyfill$b, {
3653                 getPolyfill: polyfill$a,
3654                 implementation: implementation$6,
3655                 shim: shim$c
3656         });
3657
3658         var object_assign = polyfill$b;
3659
3660         /**
3661          * @this {Promise}
3662          */
3663         function finallyConstructor(callback) {
3664           var constructor = this.constructor;
3665           return this.then(
3666             function(value) {
3667               return constructor.resolve(callback()).then(function() {
3668                 return value;
3669               });
3670             },
3671             function(reason) {
3672               return constructor.resolve(callback()).then(function() {
3673                 return constructor.reject(reason);
3674               });
3675             }
3676           );
3677         }
3678
3679         // Store setTimeout reference so promise-polyfill will be unaffected by
3680         // other code modifying setTimeout (like sinon.useFakeTimers())
3681         var setTimeoutFunc = setTimeout;
3682
3683         function noop$1() {}
3684
3685         // Polyfill for Function.prototype.bind
3686         function bind$2(fn, thisArg) {
3687           return function() {
3688             fn.apply(thisArg, arguments);
3689           };
3690         }
3691
3692         /**
3693          * @constructor
3694          * @param {Function} fn
3695          */
3696         function Promise$1(fn) {
3697           if (!(this instanceof Promise$1))
3698             throw new TypeError('Promises must be constructed via new');
3699           if (typeof fn !== 'function') throw new TypeError('not a function');
3700           /** @type {!number} */
3701           this._state = 0;
3702           /** @type {!boolean} */
3703           this._handled = false;
3704           /** @type {Promise|undefined} */
3705           this._value = undefined;
3706           /** @type {!Array<!Function>} */
3707           this._deferreds = [];
3708
3709           doResolve(fn, this);
3710         }
3711
3712         function handle(self, deferred) {
3713           while (self._state === 3) {
3714             self = self._value;
3715           }
3716           if (self._state === 0) {
3717             self._deferreds.push(deferred);
3718             return;
3719           }
3720           self._handled = true;
3721           Promise$1._immediateFn(function() {
3722             var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected;
3723             if (cb === null) {
3724               (self._state === 1 ? resolve : reject)(deferred.promise, self._value);
3725               return;
3726             }
3727             var ret;
3728             try {
3729               ret = cb(self._value);
3730             } catch (e) {
3731               reject(deferred.promise, e);
3732               return;
3733             }
3734             resolve(deferred.promise, ret);
3735           });
3736         }
3737
3738         function resolve(self, newValue) {
3739           try {
3740             // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
3741             if (newValue === self)
3742               throw new TypeError('A promise cannot be resolved with itself.');
3743             if (
3744               newValue &&
3745               (typeof newValue === 'object' || typeof newValue === 'function')
3746             ) {
3747               var then = newValue.then;
3748               if (newValue instanceof Promise$1) {
3749                 self._state = 3;
3750                 self._value = newValue;
3751                 finale(self);
3752                 return;
3753               } else if (typeof then === 'function') {
3754                 doResolve(bind$2(then, newValue), self);
3755                 return;
3756               }
3757             }
3758             self._state = 1;
3759             self._value = newValue;
3760             finale(self);
3761           } catch (e) {
3762             reject(self, e);
3763           }
3764         }
3765
3766         function reject(self, newValue) {
3767           self._state = 2;
3768           self._value = newValue;
3769           finale(self);
3770         }
3771
3772         function finale(self) {
3773           if (self._state === 2 && self._deferreds.length === 0) {
3774             Promise$1._immediateFn(function() {
3775               if (!self._handled) {
3776                 Promise$1._unhandledRejectionFn(self._value);
3777               }
3778             });
3779           }
3780
3781           for (var i = 0, len = self._deferreds.length; i < len; i++) {
3782             handle(self, self._deferreds[i]);
3783           }
3784           self._deferreds = null;
3785         }
3786
3787         /**
3788          * @constructor
3789          */
3790         function Handler(onFulfilled, onRejected, promise) {
3791           this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
3792           this.onRejected = typeof onRejected === 'function' ? onRejected : null;
3793           this.promise = promise;
3794         }
3795
3796         /**
3797          * Take a potentially misbehaving resolver function and make sure
3798          * onFulfilled and onRejected are only called once.
3799          *
3800          * Makes no guarantees about asynchrony.
3801          */
3802         function doResolve(fn, self) {
3803           var done = false;
3804           try {
3805             fn(
3806               function(value) {
3807                 if (done) return;
3808                 done = true;
3809                 resolve(self, value);
3810               },
3811               function(reason) {
3812                 if (done) return;
3813                 done = true;
3814                 reject(self, reason);
3815               }
3816             );
3817           } catch (ex) {
3818             if (done) return;
3819             done = true;
3820             reject(self, ex);
3821           }
3822         }
3823
3824         Promise$1.prototype['catch'] = function(onRejected) {
3825           return this.then(null, onRejected);
3826         };
3827
3828         Promise$1.prototype.then = function(onFulfilled, onRejected) {
3829           // @ts-ignore
3830           var prom = new this.constructor(noop$1);
3831
3832           handle(this, new Handler(onFulfilled, onRejected, prom));
3833           return prom;
3834         };
3835
3836         Promise$1.prototype['finally'] = finallyConstructor;
3837
3838         Promise$1.all = function(arr) {
3839           return new Promise$1(function(resolve, reject) {
3840             if (!arr || typeof arr.length === 'undefined')
3841               throw new TypeError('Promise.all accepts an array');
3842             var args = Array.prototype.slice.call(arr);
3843             if (args.length === 0) return resolve([]);
3844             var remaining = args.length;
3845
3846             function res(i, val) {
3847               try {
3848                 if (val && (typeof val === 'object' || typeof val === 'function')) {
3849                   var then = val.then;
3850                   if (typeof then === 'function') {
3851                     then.call(
3852                       val,
3853                       function(val) {
3854                         res(i, val);
3855                       },
3856                       reject
3857                     );
3858                     return;
3859                   }
3860                 }
3861                 args[i] = val;
3862                 if (--remaining === 0) {
3863                   resolve(args);
3864                 }
3865               } catch (ex) {
3866                 reject(ex);
3867               }
3868             }
3869
3870             for (var i = 0; i < args.length; i++) {
3871               res(i, args[i]);
3872             }
3873           });
3874         };
3875
3876         Promise$1.resolve = function(value) {
3877           if (value && typeof value === 'object' && value.constructor === Promise$1) {
3878             return value;
3879           }
3880
3881           return new Promise$1(function(resolve) {
3882             resolve(value);
3883           });
3884         };
3885
3886         Promise$1.reject = function(value) {
3887           return new Promise$1(function(resolve, reject) {
3888             reject(value);
3889           });
3890         };
3891
3892         Promise$1.race = function(values) {
3893           return new Promise$1(function(resolve, reject) {
3894             for (var i = 0, len = values.length; i < len; i++) {
3895               values[i].then(resolve, reject);
3896             }
3897           });
3898         };
3899
3900         // Use polyfill for setImmediate for performance gains
3901         Promise$1._immediateFn =
3902           (typeof setImmediate === 'function' &&
3903             function(fn) {
3904               setImmediate(fn);
3905             }) ||
3906           function(fn) {
3907             setTimeoutFunc(fn, 0);
3908           };
3909
3910         Promise$1._unhandledRejectionFn = function _unhandledRejectionFn(err) {
3911           if (typeof console !== 'undefined' && console) {
3912             console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console
3913           }
3914         };
3915
3916         /** @suppress {undefinedVars} */
3917         var globalNS = (function() {
3918           // the only reliable means to get the global object is
3919           // `Function('return this')()`
3920           // However, this causes CSP violations in Chrome apps.
3921           if (typeof self !== 'undefined') {
3922             return self;
3923           }
3924           if (typeof window !== 'undefined') {
3925             return window;
3926           }
3927           if (typeof global !== 'undefined') {
3928             return global;
3929           }
3930           throw new Error('unable to locate global object');
3931         })();
3932
3933         if (!('Promise' in globalNS)) {
3934           globalNS['Promise'] = Promise$1;
3935         } else if (!globalNS.Promise.prototype['finally']) {
3936           globalNS.Promise.prototype['finally'] = finallyConstructor;
3937         }
3938
3939         var polyfill$c = /*#__PURE__*/Object.freeze({
3940
3941         });
3942
3943         var setAsap = createCommonjsModule(function (module) {
3944         (function (thisVar, undefined$1) {
3945                 var main = (typeof window === 'object' && window) || (typeof commonjsGlobal === 'object' && commonjsGlobal) ||
3946                         typeof self === 'object' && self || thisVar;
3947
3948                 var hasSetImmediate = typeof setImmediate === 'function';
3949                 var hasNextTick = typeof process === 'object' && !!process && typeof process.nextTick === 'function';
3950                 var index = 0;
3951
3952                 function getNewIndex() {
3953                         if (index === 9007199254740991) {
3954                                 return 0;
3955                         }
3956                         return ++index;
3957                 }
3958
3959                 var setAsap = (function () {
3960                         var hiddenDiv, scriptEl, timeoutFn, callbacks;
3961
3962                         // Modern browsers, fastest async
3963                         if (main.MutationObserver) {
3964                                 return function setAsap(callback) {
3965                                         hiddenDiv = document.createElement("div");
3966                                         (new MutationObserver(function() {
3967                                                 callback();
3968                                                 hiddenDiv = null;
3969                                         })).observe(hiddenDiv, { attributes: true });
3970                                         hiddenDiv.setAttribute('i', '1');
3971                                 };
3972
3973                         // Browsers that support postMessage
3974                         } else if (!hasSetImmediate && main.postMessage && !main.importScripts && main.addEventListener) {
3975
3976                                 var MESSAGE_PREFIX = "com.setImmediate" + Math.random();
3977                                 callbacks = {};
3978
3979                                 var onGlobalMessage = function (event) {
3980                                         if (event.source === main && event.data.indexOf(MESSAGE_PREFIX) === 0) {
3981                                                 var i = +event.data.split(':')[1];
3982                                                 callbacks[i]();
3983                                                 delete callbacks[i];
3984                                         }
3985                                 };
3986
3987                                 main.addEventListener("message", onGlobalMessage, false);
3988
3989                                 return function setAsap(callback) {
3990                                         var i = getNewIndex();
3991                                         callbacks[i] = callback;
3992                                         main.postMessage(MESSAGE_PREFIX + ':' + i, "*");
3993                                 };
3994
3995                                 // IE browsers without postMessage
3996                         } else if (!hasSetImmediate && main.document && 'onreadystatechange' in document.createElement('script')) {
3997
3998                                 return function setAsap(callback) {
3999                                         scriptEl = document.createElement("script");
4000                                         scriptEl.onreadystatechange = function onreadystatechange() {
4001                                                 scriptEl.onreadystatechange = null;
4002                                                 scriptEl.parentNode.removeChild(scriptEl);
4003                                                 scriptEl = null;
4004                                                 callback();
4005                                         };
4006                                         document.body.appendChild(scriptEl);
4007                                 };
4008
4009                         // All other browsers and node
4010                         } else {
4011
4012                                 timeoutFn = (hasSetImmediate && setImmediate) || (hasNextTick && process.nextTick) || setTimeout;
4013                                 return function setAsap(callback) {
4014                                         timeoutFn(callback);
4015                                 };
4016                         }
4017
4018                 })();
4019
4020                 if (module.exports) {
4021                         module.exports = setAsap;
4022                 } else if (typeof commonjsRequire !== 'undefined' && commonjsRequire.amd) {
4023                         undefined$1(function () {
4024                                 return setAsap;
4025                         });
4026                 } else {
4027                         main.setAsap = setAsap;
4028                 }
4029         })(commonjsGlobal);
4030         });
4031
4032         var performanceNow = createCommonjsModule(function (module) {
4033         // Generated by CoffeeScript 1.12.2
4034         (function() {
4035           var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;
4036
4037           if ((typeof performance !== "undefined" && performance !== null) && performance.now) {
4038             module.exports = function() {
4039               return performance.now();
4040             };
4041           } else if ((typeof process !== "undefined" && process !== null) && process.hrtime) {
4042             module.exports = function() {
4043               return (getNanoSeconds() - nodeLoadTime) / 1e6;
4044             };
4045             hrtime = process.hrtime;
4046             getNanoSeconds = function() {
4047               var hr;
4048               hr = hrtime();
4049               return hr[0] * 1e9 + hr[1];
4050             };
4051             moduleLoadTime = getNanoSeconds();
4052             upTime = process.uptime() * 1e9;
4053             nodeLoadTime = moduleLoadTime - upTime;
4054           } else if (Date.now) {
4055             module.exports = function() {
4056               return Date.now() - loadTime;
4057             };
4058             loadTime = Date.now();
4059           } else {
4060             module.exports = function() {
4061               return new Date().getTime() - loadTime;
4062             };
4063             loadTime = new Date().getTime();
4064           }
4065
4066         }).call(commonjsGlobal);
4067
4068
4069         });
4070
4071         var root = typeof window === 'undefined' ? commonjsGlobal : window
4072           , vendors = ['moz', 'webkit']
4073           , suffix = 'AnimationFrame'
4074           , raf = root['request' + suffix]
4075           , caf = root['cancel' + suffix] || root['cancelRequest' + suffix];
4076
4077         for(var i = 0; !raf && i < vendors.length; i++) {
4078           raf = root[vendors[i] + 'Request' + suffix];
4079           caf = root[vendors[i] + 'Cancel' + suffix]
4080               || root[vendors[i] + 'CancelRequest' + suffix];
4081         }
4082
4083         // Some versions of FF have rAF but not cAF
4084         if(!raf || !caf) {
4085           var last = 0
4086             , id$3 = 0
4087             , queue = []
4088             , frameDuration = 1000 / 60;
4089
4090           raf = function(callback) {
4091             if(queue.length === 0) {
4092               var _now = performanceNow()
4093                 , next = Math.max(0, frameDuration - (_now - last));
4094               last = next + _now;
4095               setTimeout(function() {
4096                 var cp = queue.slice(0);
4097                 // Clear queue here to prevent
4098                 // callbacks from appending listeners
4099                 // to the current frame's queue
4100                 queue.length = 0;
4101                 for(var i = 0; i < cp.length; i++) {
4102                   if(!cp[i].cancelled) {
4103                     try{
4104                       cp[i].callback(last);
4105                     } catch(e) {
4106                       setTimeout(function() { throw e }, 0);
4107                     }
4108                   }
4109                 }
4110               }, Math.round(next));
4111             }
4112             queue.push({
4113               handle: ++id$3,
4114               callback: callback,
4115               cancelled: false
4116             });
4117             return id$3
4118           };
4119
4120           caf = function(handle) {
4121             for(var i = 0; i < queue.length; i++) {
4122               if(queue[i].handle === handle) {
4123                 queue[i].cancelled = true;
4124               }
4125             }
4126           };
4127         }
4128
4129         var raf_1 = function(fn) {
4130           // Wrap in a new function to prevent
4131           // `cancel` potentially being assigned
4132           // to the native rAF function
4133           return raf.call(root, fn)
4134         };
4135         var cancel = function() {
4136           caf.apply(root, arguments);
4137         };
4138         var polyfill$d = function(object) {
4139           if (!object) {
4140             object = root;
4141           }
4142           object.requestAnimationFrame = raf;
4143           object.cancelAnimationFrame = caf;
4144         };
4145         raf_1.cancel = cancel;
4146         raf_1.polyfill = polyfill$d;
4147
4148         var support = {
4149           searchParams: 'URLSearchParams' in self,
4150           iterable: 'Symbol' in self && 'iterator' in Symbol,
4151           blob:
4152             'FileReader' in self &&
4153             'Blob' in self &&
4154             (function() {
4155               try {
4156                 new Blob();
4157                 return true
4158               } catch (e) {
4159                 return false
4160               }
4161             })(),
4162           formData: 'FormData' in self,
4163           arrayBuffer: 'ArrayBuffer' in self
4164         };
4165
4166         function isDataView(obj) {
4167           return obj && DataView.prototype.isPrototypeOf(obj)
4168         }
4169
4170         if (support.arrayBuffer) {
4171           var viewClasses = [
4172             '[object Int8Array]',
4173             '[object Uint8Array]',
4174             '[object Uint8ClampedArray]',
4175             '[object Int16Array]',
4176             '[object Uint16Array]',
4177             '[object Int32Array]',
4178             '[object Uint32Array]',
4179             '[object Float32Array]',
4180             '[object Float64Array]'
4181           ];
4182
4183           var isArrayBufferView =
4184             ArrayBuffer.isView ||
4185             function(obj) {
4186               return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
4187             };
4188         }
4189
4190         function normalizeName(name) {
4191           if (typeof name !== 'string') {
4192             name = String(name);
4193           }
4194           if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) {
4195             throw new TypeError('Invalid character in header field name')
4196           }
4197           return name.toLowerCase()
4198         }
4199
4200         function normalizeValue(value) {
4201           if (typeof value !== 'string') {
4202             value = String(value);
4203           }
4204           return value
4205         }
4206
4207         // Build a destructive iterator for the value list
4208         function iteratorFor(items) {
4209           var iterator = {
4210             next: function() {
4211               var value = items.shift();
4212               return {done: value === undefined, value: value}
4213             }
4214           };
4215
4216           if (support.iterable) {
4217             iterator[Symbol.iterator] = function() {
4218               return iterator
4219             };
4220           }
4221
4222           return iterator
4223         }
4224
4225         function Headers(headers) {
4226           this.map = {};
4227
4228           if (headers instanceof Headers) {
4229             headers.forEach(function(value, name) {
4230               this.append(name, value);
4231             }, this);
4232           } else if (Array.isArray(headers)) {
4233             headers.forEach(function(header) {
4234               this.append(header[0], header[1]);
4235             }, this);
4236           } else if (headers) {
4237             Object.getOwnPropertyNames(headers).forEach(function(name) {
4238               this.append(name, headers[name]);
4239             }, this);
4240           }
4241         }
4242
4243         Headers.prototype.append = function(name, value) {
4244           name = normalizeName(name);
4245           value = normalizeValue(value);
4246           var oldValue = this.map[name];
4247           this.map[name] = oldValue ? oldValue + ', ' + value : value;
4248         };
4249
4250         Headers.prototype['delete'] = function(name) {
4251           delete this.map[normalizeName(name)];
4252         };
4253
4254         Headers.prototype.get = function(name) {
4255           name = normalizeName(name);
4256           return this.has(name) ? this.map[name] : null
4257         };
4258
4259         Headers.prototype.has = function(name) {
4260           return this.map.hasOwnProperty(normalizeName(name))
4261         };
4262
4263         Headers.prototype.set = function(name, value) {
4264           this.map[normalizeName(name)] = normalizeValue(value);
4265         };
4266
4267         Headers.prototype.forEach = function(callback, thisArg) {
4268           for (var name in this.map) {
4269             if (this.map.hasOwnProperty(name)) {
4270               callback.call(thisArg, this.map[name], name, this);
4271             }
4272           }
4273         };
4274
4275         Headers.prototype.keys = function() {
4276           var items = [];
4277           this.forEach(function(value, name) {
4278             items.push(name);
4279           });
4280           return iteratorFor(items)
4281         };
4282
4283         Headers.prototype.values = function() {
4284           var items = [];
4285           this.forEach(function(value) {
4286             items.push(value);
4287           });
4288           return iteratorFor(items)
4289         };
4290
4291         Headers.prototype.entries = function() {
4292           var items = [];
4293           this.forEach(function(value, name) {
4294             items.push([name, value]);
4295           });
4296           return iteratorFor(items)
4297         };
4298
4299         if (support.iterable) {
4300           Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
4301         }
4302
4303         function consumed(body) {
4304           if (body.bodyUsed) {
4305             return Promise.reject(new TypeError('Already read'))
4306           }
4307           body.bodyUsed = true;
4308         }
4309
4310         function fileReaderReady(reader) {
4311           return new Promise(function(resolve, reject) {
4312             reader.onload = function() {
4313               resolve(reader.result);
4314             };
4315             reader.onerror = function() {
4316               reject(reader.error);
4317             };
4318           })
4319         }
4320
4321         function readBlobAsArrayBuffer(blob) {
4322           var reader = new FileReader();
4323           var promise = fileReaderReady(reader);
4324           reader.readAsArrayBuffer(blob);
4325           return promise
4326         }
4327
4328         function readBlobAsText(blob) {
4329           var reader = new FileReader();
4330           var promise = fileReaderReady(reader);
4331           reader.readAsText(blob);
4332           return promise
4333         }
4334
4335         function readArrayBufferAsText(buf) {
4336           var view = new Uint8Array(buf);
4337           var chars = new Array(view.length);
4338
4339           for (var i = 0; i < view.length; i++) {
4340             chars[i] = String.fromCharCode(view[i]);
4341           }
4342           return chars.join('')
4343         }
4344
4345         function bufferClone(buf) {
4346           if (buf.slice) {
4347             return buf.slice(0)
4348           } else {
4349             var view = new Uint8Array(buf.byteLength);
4350             view.set(new Uint8Array(buf));
4351             return view.buffer
4352           }
4353         }
4354
4355         function Body() {
4356           this.bodyUsed = false;
4357
4358           this._initBody = function(body) {
4359             this._bodyInit = body;
4360             if (!body) {
4361               this._bodyText = '';
4362             } else if (typeof body === 'string') {
4363               this._bodyText = body;
4364             } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
4365               this._bodyBlob = body;
4366             } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
4367               this._bodyFormData = body;
4368             } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4369               this._bodyText = body.toString();
4370             } else if (support.arrayBuffer && support.blob && isDataView(body)) {
4371               this._bodyArrayBuffer = bufferClone(body.buffer);
4372               // IE 10-11 can't handle a DataView body.
4373               this._bodyInit = new Blob([this._bodyArrayBuffer]);
4374             } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
4375               this._bodyArrayBuffer = bufferClone(body);
4376             } else {
4377               this._bodyText = body = Object.prototype.toString.call(body);
4378             }
4379
4380             if (!this.headers.get('content-type')) {
4381               if (typeof body === 'string') {
4382                 this.headers.set('content-type', 'text/plain;charset=UTF-8');
4383               } else if (this._bodyBlob && this._bodyBlob.type) {
4384                 this.headers.set('content-type', this._bodyBlob.type);
4385               } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
4386                 this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');
4387               }
4388             }
4389           };
4390
4391           if (support.blob) {
4392             this.blob = function() {
4393               var rejected = consumed(this);
4394               if (rejected) {
4395                 return rejected
4396               }
4397
4398               if (this._bodyBlob) {
4399                 return Promise.resolve(this._bodyBlob)
4400               } else if (this._bodyArrayBuffer) {
4401                 return Promise.resolve(new Blob([this._bodyArrayBuffer]))
4402               } else if (this._bodyFormData) {
4403                 throw new Error('could not read FormData body as blob')
4404               } else {
4405                 return Promise.resolve(new Blob([this._bodyText]))
4406               }
4407             };
4408
4409             this.arrayBuffer = function() {
4410               if (this._bodyArrayBuffer) {
4411                 return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
4412               } else {
4413                 return this.blob().then(readBlobAsArrayBuffer)
4414               }
4415             };
4416           }
4417
4418           this.text = function() {
4419             var rejected = consumed(this);
4420             if (rejected) {
4421               return rejected
4422             }
4423
4424             if (this._bodyBlob) {
4425               return readBlobAsText(this._bodyBlob)
4426             } else if (this._bodyArrayBuffer) {
4427               return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
4428             } else if (this._bodyFormData) {
4429               throw new Error('could not read FormData body as text')
4430             } else {
4431               return Promise.resolve(this._bodyText)
4432             }
4433           };
4434
4435           if (support.formData) {
4436             this.formData = function() {
4437               return this.text().then(decode)
4438             };
4439           }
4440
4441           this.json = function() {
4442             return this.text().then(JSON.parse)
4443           };
4444
4445           return this
4446         }
4447
4448         // HTTP methods whose capitalization should be normalized
4449         var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT'];
4450
4451         function normalizeMethod(method) {
4452           var upcased = method.toUpperCase();
4453           return methods.indexOf(upcased) > -1 ? upcased : method
4454         }
4455
4456         function Request(input, options) {
4457           options = options || {};
4458           var body = options.body;
4459
4460           if (input instanceof Request) {
4461             if (input.bodyUsed) {
4462               throw new TypeError('Already read')
4463             }
4464             this.url = input.url;
4465             this.credentials = input.credentials;
4466             if (!options.headers) {
4467               this.headers = new Headers(input.headers);
4468             }
4469             this.method = input.method;
4470             this.mode = input.mode;
4471             this.signal = input.signal;
4472             if (!body && input._bodyInit != null) {
4473               body = input._bodyInit;
4474               input.bodyUsed = true;
4475             }
4476           } else {
4477             this.url = String(input);
4478           }
4479
4480           this.credentials = options.credentials || this.credentials || 'same-origin';
4481           if (options.headers || !this.headers) {
4482             this.headers = new Headers(options.headers);
4483           }
4484           this.method = normalizeMethod(options.method || this.method || 'GET');
4485           this.mode = options.mode || this.mode || null;
4486           this.signal = options.signal || this.signal;
4487           this.referrer = null;
4488
4489           if ((this.method === 'GET' || this.method === 'HEAD') && body) {
4490             throw new TypeError('Body not allowed for GET or HEAD requests')
4491           }
4492           this._initBody(body);
4493         }
4494
4495         Request.prototype.clone = function() {
4496           return new Request(this, {body: this._bodyInit})
4497         };
4498
4499         function decode(body) {
4500           var form = new FormData();
4501           body
4502             .trim()
4503             .split('&')
4504             .forEach(function(bytes) {
4505               if (bytes) {
4506                 var split = bytes.split('=');
4507                 var name = split.shift().replace(/\+/g, ' ');
4508                 var value = split.join('=').replace(/\+/g, ' ');
4509                 form.append(decodeURIComponent(name), decodeURIComponent(value));
4510               }
4511             });
4512           return form
4513         }
4514
4515         function parseHeaders(rawHeaders) {
4516           var headers = new Headers();
4517           // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space
4518           // https://tools.ietf.org/html/rfc7230#section-3.2
4519           var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' ');
4520           preProcessedHeaders.split(/\r?\n/).forEach(function(line) {
4521             var parts = line.split(':');
4522             var key = parts.shift().trim();
4523             if (key) {
4524               var value = parts.join(':').trim();
4525               headers.append(key, value);
4526             }
4527           });
4528           return headers
4529         }
4530
4531         Body.call(Request.prototype);
4532
4533         function Response(bodyInit, options) {
4534           if (!options) {
4535             options = {};
4536           }
4537
4538           this.type = 'default';
4539           this.status = options.status === undefined ? 200 : options.status;
4540           this.ok = this.status >= 200 && this.status < 300;
4541           this.statusText = 'statusText' in options ? options.statusText : 'OK';
4542           this.headers = new Headers(options.headers);
4543           this.url = options.url || '';
4544           this._initBody(bodyInit);
4545         }
4546
4547         Body.call(Response.prototype);
4548
4549         Response.prototype.clone = function() {
4550           return new Response(this._bodyInit, {
4551             status: this.status,
4552             statusText: this.statusText,
4553             headers: new Headers(this.headers),
4554             url: this.url
4555           })
4556         };
4557
4558         Response.error = function() {
4559           var response = new Response(null, {status: 0, statusText: ''});
4560           response.type = 'error';
4561           return response
4562         };
4563
4564         var redirectStatuses = [301, 302, 303, 307, 308];
4565
4566         Response.redirect = function(url, status) {
4567           if (redirectStatuses.indexOf(status) === -1) {
4568             throw new RangeError('Invalid status code')
4569           }
4570
4571           return new Response(null, {status: status, headers: {location: url}})
4572         };
4573
4574         var DOMException$1 = self.DOMException;
4575         try {
4576           new DOMException$1();
4577         } catch (err) {
4578           DOMException$1 = function(message, name) {
4579             this.message = message;
4580             this.name = name;
4581             var error = Error(message);
4582             this.stack = error.stack;
4583           };
4584           DOMException$1.prototype = Object.create(Error.prototype);
4585           DOMException$1.prototype.constructor = DOMException$1;
4586         }
4587
4588         function fetch$1(input, init) {
4589           return new Promise(function(resolve, reject) {
4590             var request = new Request(input, init);
4591
4592             if (request.signal && request.signal.aborted) {
4593               return reject(new DOMException$1('Aborted', 'AbortError'))
4594             }
4595
4596             var xhr = new XMLHttpRequest();
4597
4598             function abortXhr() {
4599               xhr.abort();
4600             }
4601
4602             xhr.onload = function() {
4603               var options = {
4604                 status: xhr.status,
4605                 statusText: xhr.statusText,
4606                 headers: parseHeaders(xhr.getAllResponseHeaders() || '')
4607               };
4608               options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL');
4609               var body = 'response' in xhr ? xhr.response : xhr.responseText;
4610               resolve(new Response(body, options));
4611             };
4612
4613             xhr.onerror = function() {
4614               reject(new TypeError('Network request failed'));
4615             };
4616
4617             xhr.ontimeout = function() {
4618               reject(new TypeError('Network request failed'));
4619             };
4620
4621             xhr.onabort = function() {
4622               reject(new DOMException$1('Aborted', 'AbortError'));
4623             };
4624
4625             xhr.open(request.method, request.url, true);
4626
4627             if (request.credentials === 'include') {
4628               xhr.withCredentials = true;
4629             } else if (request.credentials === 'omit') {
4630               xhr.withCredentials = false;
4631             }
4632
4633             if ('responseType' in xhr && support.blob) {
4634               xhr.responseType = 'blob';
4635             }
4636
4637             request.headers.forEach(function(value, name) {
4638               xhr.setRequestHeader(name, value);
4639             });
4640
4641             if (request.signal) {
4642               request.signal.addEventListener('abort', abortXhr);
4643
4644               xhr.onreadystatechange = function() {
4645                 // DONE (success or failure)
4646                 if (xhr.readyState === 4) {
4647                   request.signal.removeEventListener('abort', abortXhr);
4648                 }
4649               };
4650             }
4651
4652             xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit);
4653           })
4654         }
4655
4656         fetch$1.polyfill = true;
4657
4658         if (!self.fetch) {
4659           self.fetch = fetch$1;
4660           self.Headers = Headers;
4661           self.Request = Request;
4662           self.Response = Response;
4663         }
4664
4665         var lib = createCommonjsModule(function (module, exports) {
4666         Object.defineProperty(exports, "__esModule", { value: true });
4667
4668
4669
4670
4671
4672
4673
4674
4675
4676
4677         if (!window.Set) {
4678             window.Set = es6Set;
4679         }
4680         if (!window.Map) {
4681             window.Map = es6Map;
4682         }
4683         if (!window.Promise) {
4684             window.Promise = polyfill$c;
4685             window.Promise._immediateFn = setAsap;
4686         }
4687         if (!Array.prototype.find) {
4688             array_prototype_find.shim();
4689         }
4690         if (!Array.prototype.findIndex) {
4691             array_prototype_findindex.shim();
4692         }
4693         if (!Array.from) {
4694             array_from.shim();
4695         }
4696         if (!Object.values) {
4697             object_values.shim();
4698         }
4699         if (!Object.assign) {
4700             object_assign.shim();
4701         }
4702         if (!window.requestAnimationFrame || !window.cancelAnimationFrame) {
4703             window.requestAnimationFrame = raf_1;
4704             window.cancelAnimationFrame = raf_1.cancel;
4705         }
4706
4707         var finalFetch = window.fetch;
4708         var finalPromise = window.Promise;
4709         window.fetch = function (input, init) {
4710             try {
4711                 return finalFetch(input, init);
4712             }
4713             catch (error) {
4714                 return new finalPromise(function (_, reject) { return reject(error); });
4715             }
4716         };
4717         });
4718
4719         unwrapExports(lib);
4720
4721         (function (factory) {
4722           factory();
4723         }(function () {
4724           function _classCallCheck(instance, Constructor) {
4725             if (!(instance instanceof Constructor)) {
4726               throw new TypeError("Cannot call a class as a function");
4727             }
4728           }
4729
4730           function _defineProperties(target, props) {
4731             for (var i = 0; i < props.length; i++) {
4732               var descriptor = props[i];
4733               descriptor.enumerable = descriptor.enumerable || false;
4734               descriptor.configurable = true;
4735               if ("value" in descriptor) descriptor.writable = true;
4736               Object.defineProperty(target, descriptor.key, descriptor);
4737             }
4738           }
4739
4740           function _createClass(Constructor, protoProps, staticProps) {
4741             if (protoProps) _defineProperties(Constructor.prototype, protoProps);
4742             if (staticProps) _defineProperties(Constructor, staticProps);
4743             return Constructor;
4744           }
4745
4746           function _inherits(subClass, superClass) {
4747             if (typeof superClass !== "function" && superClass !== null) {
4748               throw new TypeError("Super expression must either be null or a function");
4749             }
4750
4751             subClass.prototype = Object.create(superClass && superClass.prototype, {
4752               constructor: {
4753                 value: subClass,
4754                 writable: true,
4755                 configurable: true
4756               }
4757             });
4758             if (superClass) _setPrototypeOf(subClass, superClass);
4759           }
4760
4761           function _getPrototypeOf(o) {
4762             _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {
4763               return o.__proto__ || Object.getPrototypeOf(o);
4764             };
4765             return _getPrototypeOf(o);
4766           }
4767
4768           function _setPrototypeOf(o, p) {
4769             _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {
4770               o.__proto__ = p;
4771               return o;
4772             };
4773
4774             return _setPrototypeOf(o, p);
4775           }
4776
4777           function _assertThisInitialized(self) {
4778             if (self === void 0) {
4779               throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
4780             }
4781
4782             return self;
4783           }
4784
4785           function _possibleConstructorReturn(self, call) {
4786             if (call && (typeof call === "object" || typeof call === "function")) {
4787               return call;
4788             }
4789
4790             return _assertThisInitialized(self);
4791           }
4792
4793           function _superPropBase(object, property) {
4794             while (!Object.prototype.hasOwnProperty.call(object, property)) {
4795               object = _getPrototypeOf(object);
4796               if (object === null) break;
4797             }
4798
4799             return object;
4800           }
4801
4802           function _get(target, property, receiver) {
4803             if (typeof Reflect !== "undefined" && Reflect.get) {
4804               _get = Reflect.get;
4805             } else {
4806               _get = function _get(target, property, receiver) {
4807                 var base = _superPropBase(target, property);
4808
4809                 if (!base) return;
4810                 var desc = Object.getOwnPropertyDescriptor(base, property);
4811
4812                 if (desc.get) {
4813                   return desc.get.call(receiver);
4814                 }
4815
4816                 return desc.value;
4817               };
4818             }
4819
4820             return _get(target, property, receiver || target);
4821           }
4822
4823           var Emitter =
4824           /*#__PURE__*/
4825           function () {
4826             function Emitter() {
4827               _classCallCheck(this, Emitter);
4828
4829               Object.defineProperty(this, 'listeners', {
4830                 value: {},
4831                 writable: true,
4832                 configurable: true
4833               });
4834             }
4835
4836             _createClass(Emitter, [{
4837               key: "addEventListener",
4838               value: function addEventListener(type, callback) {
4839                 if (!(type in this.listeners)) {
4840                   this.listeners[type] = [];
4841                 }
4842
4843                 this.listeners[type].push(callback);
4844               }
4845             }, {
4846               key: "removeEventListener",
4847               value: function removeEventListener(type, callback) {
4848                 if (!(type in this.listeners)) {
4849                   return;
4850                 }
4851
4852                 var stack = this.listeners[type];
4853
4854                 for (var i = 0, l = stack.length; i < l; i++) {
4855                   if (stack[i] === callback) {
4856                     stack.splice(i, 1);
4857                     return;
4858                   }
4859                 }
4860               }
4861             }, {
4862               key: "dispatchEvent",
4863               value: function dispatchEvent(event) {
4864                 var _this = this;
4865
4866                 if (!(event.type in this.listeners)) {
4867                   return;
4868                 }
4869
4870                 var debounce = function debounce(callback) {
4871                   setTimeout(function () {
4872                     return callback.call(_this, event);
4873                   });
4874                 };
4875
4876                 var stack = this.listeners[event.type];
4877
4878                 for (var i = 0, l = stack.length; i < l; i++) {
4879                   debounce(stack[i]);
4880                 }
4881
4882                 return !event.defaultPrevented;
4883               }
4884             }]);
4885
4886             return Emitter;
4887           }();
4888
4889           var AbortSignal =
4890           /*#__PURE__*/
4891           function (_Emitter) {
4892             _inherits(AbortSignal, _Emitter);
4893
4894             function AbortSignal() {
4895               var _this2;
4896
4897               _classCallCheck(this, AbortSignal);
4898
4899               _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AbortSignal).call(this)); // Some versions of babel does not transpile super() correctly for IE <= 10, if the parent
4900               // constructor has failed to run, then "this.listeners" will still be undefined and then we call
4901               // the parent constructor directly instead as a workaround. For general details, see babel bug:
4902               // https://github.com/babel/babel/issues/3041
4903               // This hack was added as a fix for the issue described here:
4904               // https://github.com/Financial-Times/polyfill-library/pull/59#issuecomment-477558042
4905
4906               if (!_this2.listeners) {
4907                 Emitter.call(_assertThisInitialized(_this2));
4908               } // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4909               // we want Object.keys(new AbortController().signal) to be [] for compat with the native impl
4910
4911
4912               Object.defineProperty(_assertThisInitialized(_this2), 'aborted', {
4913                 value: false,
4914                 writable: true,
4915                 configurable: true
4916               });
4917               Object.defineProperty(_assertThisInitialized(_this2), 'onabort', {
4918                 value: null,
4919                 writable: true,
4920                 configurable: true
4921               });
4922               return _this2;
4923             }
4924
4925             _createClass(AbortSignal, [{
4926               key: "toString",
4927               value: function toString() {
4928                 return '[object AbortSignal]';
4929               }
4930             }, {
4931               key: "dispatchEvent",
4932               value: function dispatchEvent(event) {
4933                 if (event.type === 'abort') {
4934                   this.aborted = true;
4935
4936                   if (typeof this.onabort === 'function') {
4937                     this.onabort.call(this, event);
4938                   }
4939                 }
4940
4941                 _get(_getPrototypeOf(AbortSignal.prototype), "dispatchEvent", this).call(this, event);
4942               }
4943             }]);
4944
4945             return AbortSignal;
4946           }(Emitter);
4947           var AbortController =
4948           /*#__PURE__*/
4949           function () {
4950             function AbortController() {
4951               _classCallCheck(this, AbortController);
4952
4953               // Compared to assignment, Object.defineProperty makes properties non-enumerable by default and
4954               // we want Object.keys(new AbortController()) to be [] for compat with the native impl
4955               Object.defineProperty(this, 'signal', {
4956                 value: new AbortSignal(),
4957                 writable: true,
4958                 configurable: true
4959               });
4960             }
4961
4962             _createClass(AbortController, [{
4963               key: "abort",
4964               value: function abort() {
4965                 var event;
4966
4967                 try {
4968                   event = new Event('abort');
4969                 } catch (e) {
4970                   if (typeof document !== 'undefined') {
4971                     if (!document.createEvent) {
4972                       // For Internet Explorer 8:
4973                       event = document.createEventObject();
4974                       event.type = 'abort';
4975                     } else {
4976                       // For Internet Explorer 11:
4977                       event = document.createEvent('Event');
4978                       event.initEvent('abort', false, false);
4979                     }
4980                   } else {
4981                     // Fallback where document isn't available:
4982                     event = {
4983                       type: 'abort',
4984                       bubbles: false,
4985                       cancelable: false
4986                     };
4987                   }
4988                 }
4989
4990                 this.signal.dispatchEvent(event);
4991               }
4992             }, {
4993               key: "toString",
4994               value: function toString() {
4995                 return '[object AbortController]';
4996               }
4997             }]);
4998
4999             return AbortController;
5000           }();
5001
5002           if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
5003             // These are necessary to make sure that we get correct output for:
5004             // Object.prototype.toString.call(new AbortController())
5005             AbortController.prototype[Symbol.toStringTag] = 'AbortController';
5006             AbortSignal.prototype[Symbol.toStringTag] = 'AbortSignal';
5007           }
5008
5009           function polyfillNeeded(self) {
5010             if (self.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5011               console.log('__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL=true is set, will force install polyfill');
5012               return true;
5013             } // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5014             // defining window.Request, and this polyfill need to work on top of unfetch
5015             // so the below feature detection needs the !self.AbortController part.
5016             // The Request.prototype check is also needed because Safari versions 11.1.2
5017             // up to and including 12.1.x has a window.AbortController present but still
5018             // does NOT correctly implement abortable fetch:
5019             // https://bugs.webkit.org/show_bug.cgi?id=174980#c2
5020
5021
5022             return typeof self.Request === 'function' && !self.Request.prototype.hasOwnProperty('signal') || !self.AbortController;
5023           }
5024
5025           /**
5026            * Note: the "fetch.Request" default value is available for fetch imported from
5027            * the "node-fetch" package and not in browsers. This is OK since browsers
5028            * will be importing umd-polyfill.js from that path "self" is passed the
5029            * decorator so the default value will not be used (because browsers that define
5030            * fetch also has Request). One quirky setup where self.fetch exists but
5031            * self.Request does not is when the "unfetch" minimal fetch polyfill is used
5032            * on top of IE11; for this case the browser will try to use the fetch.Request
5033            * default value which in turn will be undefined but then then "if (Request)"
5034            * will ensure that you get a patched fetch but still no Request (as expected).
5035            * @param {fetch, Request = fetch.Request}
5036            * @returns {fetch: abortableFetch, Request: AbortableRequest}
5037            */
5038
5039           function abortableFetchDecorator(patchTargets) {
5040             if ('function' === typeof patchTargets) {
5041               patchTargets = {
5042                 fetch: patchTargets
5043               };
5044             }
5045
5046             var _patchTargets = patchTargets,
5047                 fetch = _patchTargets.fetch,
5048                 _patchTargets$Request = _patchTargets.Request,
5049                 NativeRequest = _patchTargets$Request === void 0 ? fetch.Request : _patchTargets$Request,
5050                 NativeAbortController = _patchTargets.AbortController,
5051                 _patchTargets$__FORCE = _patchTargets.__FORCE_INSTALL_ABORTCONTROLLER_POLYFILL,
5052                 __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL = _patchTargets$__FORCE === void 0 ? false : _patchTargets$__FORCE;
5053
5054             if (!polyfillNeeded({
5055               fetch: fetch,
5056               Request: NativeRequest,
5057               AbortController: NativeAbortController,
5058               __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL: __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL
5059             })) {
5060               return {
5061                 fetch: fetch,
5062                 Request: Request
5063               };
5064             }
5065
5066             var Request = NativeRequest; // Note that the "unfetch" minimal fetch polyfill defines fetch() without
5067             // defining window.Request, and this polyfill need to work on top of unfetch
5068             // hence we only patch it if it's available. Also we don't patch it if signal
5069             // is already available on the Request prototype because in this case support
5070             // is present and the patching below can cause a crash since it assigns to
5071             // request.signal which is technically a read-only property. This latter error
5072             // happens when you run the main5.js node-fetch example in the repo
5073             // "abortcontroller-polyfill-examples". The exact error is:
5074             //   request.signal = init.signal;
5075             //   ^
5076             // TypeError: Cannot set property signal of #<Request> which has only a getter
5077
5078             if (Request && !Request.prototype.hasOwnProperty('signal') || __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL) {
5079               Request = function Request(input, init) {
5080                 var signal;
5081
5082                 if (init && init.signal) {
5083                   signal = init.signal; // Never pass init.signal to the native Request implementation when the polyfill has
5084                   // been installed because if we're running on top of a browser with a
5085                   // working native AbortController (i.e. the polyfill was installed due to
5086                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5087                   // fake AbortSignal to the native fetch will trigger:
5088                   // TypeError: Failed to construct 'Request': member signal is not of type AbortSignal.
5089
5090                   delete init.signal;
5091                 }
5092
5093                 var request = new NativeRequest(input, init);
5094
5095                 if (signal) {
5096                   Object.defineProperty(request, 'signal', {
5097                     writable: false,
5098                     enumerable: false,
5099                     configurable: true,
5100                     value: signal
5101                   });
5102                 }
5103
5104                 return request;
5105               };
5106
5107               Request.prototype = NativeRequest.prototype;
5108             }
5109
5110             var realFetch = fetch;
5111
5112             var abortableFetch = function abortableFetch(input, init) {
5113               var signal = Request && Request.prototype.isPrototypeOf(input) ? input.signal : init ? init.signal : undefined;
5114
5115               if (signal) {
5116                 var abortError;
5117
5118                 try {
5119                   abortError = new DOMException('Aborted', 'AbortError');
5120                 } catch (err) {
5121                   // IE 11 does not support calling the DOMException constructor, use a
5122                   // regular error object on it instead.
5123                   abortError = new Error('Aborted');
5124                   abortError.name = 'AbortError';
5125                 } // Return early if already aborted, thus avoiding making an HTTP request
5126
5127
5128                 if (signal.aborted) {
5129                   return Promise.reject(abortError);
5130                 } // Turn an event into a promise, reject it once `abort` is dispatched
5131
5132
5133                 var cancellation = new Promise(function (_, reject) {
5134                   signal.addEventListener('abort', function () {
5135                     return reject(abortError);
5136                   }, {
5137                     once: true
5138                   });
5139                 });
5140
5141                 if (init && init.signal) {
5142                   // Never pass .signal to the native implementation when the polyfill has
5143                   // been installed because if we're running on top of a browser with a
5144                   // working native AbortController (i.e. the polyfill was installed due to
5145                   // __FORCE_INSTALL_ABORTCONTROLLER_POLYFILL being set), then passing our
5146                   // fake AbortSignal to the native fetch will trigger:
5147                   // TypeError: Failed to execute 'fetch' on 'Window': member signal is not of type AbortSignal.
5148                   delete init.signal;
5149                 } // Return the fastest promise (don't need to wait for request to finish)
5150
5151
5152                 return Promise.race([cancellation, realFetch(input, init)]);
5153               }
5154
5155               return realFetch(input, init);
5156             };
5157
5158             return {
5159               fetch: abortableFetch,
5160               Request: Request
5161             };
5162           }
5163
5164           (function (self) {
5165
5166             if (!polyfillNeeded(self)) {
5167               return;
5168             }
5169
5170             if (!self.fetch) {
5171               console.warn('fetch() is not available, cannot install abortcontroller-polyfill');
5172               return;
5173             }
5174
5175             var _abortableFetch = abortableFetchDecorator(self),
5176                 fetch = _abortableFetch.fetch,
5177                 Request = _abortableFetch.Request;
5178
5179             self.fetch = fetch;
5180             self.Request = Request;
5181             Object.defineProperty(self, 'AbortController', {
5182               writable: true,
5183               enumerable: false,
5184               configurable: true,
5185               value: AbortController
5186             });
5187             Object.defineProperty(self, 'AbortSignal', {
5188               writable: true,
5189               enumerable: false,
5190               configurable: true,
5191               value: AbortSignal
5192             });
5193           })(typeof self !== 'undefined' ? self : commonjsGlobal);
5194
5195         }));
5196
5197         var version = "5.9.2";
5198
5199         function d3_ascending(a, b) {
5200           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
5201         }
5202
5203         function d3_bisector(compare) {
5204           if (compare.length === 1) compare = ascendingComparator(compare);
5205           return {
5206             left: function(a, x, lo, hi) {
5207               if (lo == null) lo = 0;
5208               if (hi == null) hi = a.length;
5209               while (lo < hi) {
5210                 var mid = lo + hi >>> 1;
5211                 if (compare(a[mid], x) < 0) lo = mid + 1;
5212                 else hi = mid;
5213               }
5214               return lo;
5215             },
5216             right: function(a, x, lo, hi) {
5217               if (lo == null) lo = 0;
5218               if (hi == null) hi = a.length;
5219               while (lo < hi) {
5220                 var mid = lo + hi >>> 1;
5221                 if (compare(a[mid], x) > 0) hi = mid;
5222                 else lo = mid + 1;
5223               }
5224               return lo;
5225             }
5226           };
5227         }
5228
5229         function ascendingComparator(f) {
5230           return function(d, x) {
5231             return d3_ascending(f(d), x);
5232           };
5233         }
5234
5235         var ascendingBisect = d3_bisector(d3_ascending);
5236         var bisectRight = ascendingBisect.right;
5237         var bisectLeft = ascendingBisect.left;
5238
5239         function pairs(array, f) {
5240           if (f == null) f = pair;
5241           var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
5242           while (i < n) pairs[i] = f(p, p = array[++i]);
5243           return pairs;
5244         }
5245
5246         function pair(a, b) {
5247           return [a, b];
5248         }
5249
5250         function cross(values0, values1, reduce) {
5251           var n0 = values0.length,
5252               n1 = values1.length,
5253               values = new Array(n0 * n1),
5254               i0,
5255               i1,
5256               i,
5257               value0;
5258
5259           if (reduce == null) reduce = pair;
5260
5261           for (i0 = i = 0; i0 < n0; ++i0) {
5262             for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
5263               values[i] = reduce(value0, values1[i1]);
5264             }
5265           }
5266
5267           return values;
5268         }
5269
5270         function d3_descending(a, b) {
5271           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
5272         }
5273
5274         function number(x) {
5275           return x === null ? NaN : +x;
5276         }
5277
5278         function variance(values, valueof) {
5279           var n = values.length,
5280               m = 0,
5281               i = -1,
5282               mean = 0,
5283               value,
5284               delta,
5285               sum = 0;
5286
5287           if (valueof == null) {
5288             while (++i < n) {
5289               if (!isNaN(value = number(values[i]))) {
5290                 delta = value - mean;
5291                 mean += delta / ++m;
5292                 sum += delta * (value - mean);
5293               }
5294             }
5295           }
5296
5297           else {
5298             while (++i < n) {
5299               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5300                 delta = value - mean;
5301                 mean += delta / ++m;
5302                 sum += delta * (value - mean);
5303               }
5304             }
5305           }
5306
5307           if (m > 1) return sum / (m - 1);
5308         }
5309
5310         function deviation(array, f) {
5311           var v = variance(array, f);
5312           return v ? Math.sqrt(v) : v;
5313         }
5314
5315         function extent(values, valueof) {
5316           var n = values.length,
5317               i = -1,
5318               value,
5319               min,
5320               max;
5321
5322           if (valueof == null) {
5323             while (++i < n) { // Find the first comparable value.
5324               if ((value = values[i]) != null && value >= value) {
5325                 min = max = value;
5326                 while (++i < n) { // Compare the remaining values.
5327                   if ((value = values[i]) != null) {
5328                     if (min > value) min = value;
5329                     if (max < value) max = value;
5330                   }
5331                 }
5332               }
5333             }
5334           }
5335
5336           else {
5337             while (++i < n) { // Find the first comparable value.
5338               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5339                 min = max = value;
5340                 while (++i < n) { // Compare the remaining values.
5341                   if ((value = valueof(values[i], i, values)) != null) {
5342                     if (min > value) min = value;
5343                     if (max < value) max = value;
5344                   }
5345                 }
5346               }
5347             }
5348           }
5349
5350           return [min, max];
5351         }
5352
5353         var array$1 = Array.prototype;
5354
5355         var slice$4 = array$1.slice;
5356         var map$2 = array$1.map;
5357
5358         function constant(x) {
5359           return function() {
5360             return x;
5361           };
5362         }
5363
5364         function identity(x) {
5365           return x;
5366         }
5367
5368         function d3_range(start, stop, step) {
5369           start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
5370
5371           var i = -1,
5372               n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
5373               range = new Array(n);
5374
5375           while (++i < n) {
5376             range[i] = start + i * step;
5377           }
5378
5379           return range;
5380         }
5381
5382         var e10 = Math.sqrt(50),
5383             e5 = Math.sqrt(10),
5384             e2 = Math.sqrt(2);
5385
5386         function ticks(start, stop, count) {
5387           var reverse,
5388               i = -1,
5389               n,
5390               ticks,
5391               step;
5392
5393           stop = +stop, start = +start, count = +count;
5394           if (start === stop && count > 0) return [start];
5395           if (reverse = stop < start) n = start, start = stop, stop = n;
5396           if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
5397
5398           if (step > 0) {
5399             start = Math.ceil(start / step);
5400             stop = Math.floor(stop / step);
5401             ticks = new Array(n = Math.ceil(stop - start + 1));
5402             while (++i < n) ticks[i] = (start + i) * step;
5403           } else {
5404             start = Math.floor(start * step);
5405             stop = Math.ceil(stop * step);
5406             ticks = new Array(n = Math.ceil(start - stop + 1));
5407             while (++i < n) ticks[i] = (start - i) / step;
5408           }
5409
5410           if (reverse) ticks.reverse();
5411
5412           return ticks;
5413         }
5414
5415         function tickIncrement(start, stop, count) {
5416           var step = (stop - start) / Math.max(0, count),
5417               power = Math.floor(Math.log(step) / Math.LN10),
5418               error = step / Math.pow(10, power);
5419           return power >= 0
5420               ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
5421               : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
5422         }
5423
5424         function tickStep(start, stop, count) {
5425           var step0 = Math.abs(stop - start) / Math.max(0, count),
5426               step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
5427               error = step0 / step1;
5428           if (error >= e10) step1 *= 10;
5429           else if (error >= e5) step1 *= 5;
5430           else if (error >= e2) step1 *= 2;
5431           return stop < start ? -step1 : step1;
5432         }
5433
5434         function thresholdSturges(values) {
5435           return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
5436         }
5437
5438         function histogram() {
5439           var value = identity,
5440               domain = extent,
5441               threshold = thresholdSturges;
5442
5443           function histogram(data) {
5444             var i,
5445                 n = data.length,
5446                 x,
5447                 values = new Array(n);
5448
5449             for (i = 0; i < n; ++i) {
5450               values[i] = value(data[i], i, data);
5451             }
5452
5453             var xz = domain(values),
5454                 x0 = xz[0],
5455                 x1 = xz[1],
5456                 tz = threshold(values, x0, x1);
5457
5458             // Convert number of thresholds into uniform thresholds.
5459             if (!Array.isArray(tz)) {
5460               tz = tickStep(x0, x1, tz);
5461               tz = d3_range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
5462             }
5463
5464             // Remove any thresholds outside the domain.
5465             var m = tz.length;
5466             while (tz[0] <= x0) tz.shift(), --m;
5467             while (tz[m - 1] > x1) tz.pop(), --m;
5468
5469             var bins = new Array(m + 1),
5470                 bin;
5471
5472             // Initialize bins.
5473             for (i = 0; i <= m; ++i) {
5474               bin = bins[i] = [];
5475               bin.x0 = i > 0 ? tz[i - 1] : x0;
5476               bin.x1 = i < m ? tz[i] : x1;
5477             }
5478
5479             // Assign data to bins by value, ignoring any outside the domain.
5480             for (i = 0; i < n; ++i) {
5481               x = values[i];
5482               if (x0 <= x && x <= x1) {
5483                 bins[bisectRight(tz, x, 0, m)].push(data[i]);
5484               }
5485             }
5486
5487             return bins;
5488           }
5489
5490           histogram.value = function(_) {
5491             return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
5492           };
5493
5494           histogram.domain = function(_) {
5495             return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
5496           };
5497
5498           histogram.thresholds = function(_) {
5499             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice$4.call(_)) : constant(_), histogram) : threshold;
5500           };
5501
5502           return histogram;
5503         }
5504
5505         function threshold(values, p, valueof) {
5506           if (valueof == null) valueof = number;
5507           if (!(n = values.length)) return;
5508           if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
5509           if (p >= 1) return +valueof(values[n - 1], n - 1, values);
5510           var n,
5511               i = (n - 1) * p,
5512               i0 = Math.floor(i),
5513               value0 = +valueof(values[i0], i0, values),
5514               value1 = +valueof(values[i0 + 1], i0 + 1, values);
5515           return value0 + (value1 - value0) * (i - i0);
5516         }
5517
5518         function freedmanDiaconis(values, min, max) {
5519           values = map$2.call(values, number).sort(d3_ascending);
5520           return Math.ceil((max - min) / (2 * (threshold(values, 0.75) - threshold(values, 0.25)) * Math.pow(values.length, -1 / 3)));
5521         }
5522
5523         function scott(values, min, max) {
5524           return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
5525         }
5526
5527         function max$2(values, valueof) {
5528           var n = values.length,
5529               i = -1,
5530               value,
5531               max;
5532
5533           if (valueof == null) {
5534             while (++i < n) { // Find the first comparable value.
5535               if ((value = values[i]) != null && value >= value) {
5536                 max = value;
5537                 while (++i < n) { // Compare the remaining values.
5538                   if ((value = values[i]) != null && value > max) {
5539                     max = value;
5540                   }
5541                 }
5542               }
5543             }
5544           }
5545
5546           else {
5547             while (++i < n) { // Find the first comparable value.
5548               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5549                 max = value;
5550                 while (++i < n) { // Compare the remaining values.
5551                   if ((value = valueof(values[i], i, values)) != null && value > max) {
5552                     max = value;
5553                   }
5554                 }
5555               }
5556             }
5557           }
5558
5559           return max;
5560         }
5561
5562         function mean(values, valueof) {
5563           var n = values.length,
5564               m = n,
5565               i = -1,
5566               value,
5567               sum = 0;
5568
5569           if (valueof == null) {
5570             while (++i < n) {
5571               if (!isNaN(value = number(values[i]))) sum += value;
5572               else --m;
5573             }
5574           }
5575
5576           else {
5577             while (++i < n) {
5578               if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
5579               else --m;
5580             }
5581           }
5582
5583           if (m) return sum / m;
5584         }
5585
5586         function d3_median(values, valueof) {
5587           var n = values.length,
5588               i = -1,
5589               value,
5590               numbers = [];
5591
5592           if (valueof == null) {
5593             while (++i < n) {
5594               if (!isNaN(value = number(values[i]))) {
5595                 numbers.push(value);
5596               }
5597             }
5598           }
5599
5600           else {
5601             while (++i < n) {
5602               if (!isNaN(value = number(valueof(values[i], i, values)))) {
5603                 numbers.push(value);
5604               }
5605             }
5606           }
5607
5608           return threshold(numbers.sort(d3_ascending), 0.5);
5609         }
5610
5611         function merge(arrays) {
5612           var n = arrays.length,
5613               m,
5614               i = -1,
5615               j = 0,
5616               merged,
5617               array;
5618
5619           while (++i < n) j += arrays[i].length;
5620           merged = new Array(j);
5621
5622           while (--n >= 0) {
5623             array = arrays[n];
5624             m = array.length;
5625             while (--m >= 0) {
5626               merged[--j] = array[m];
5627             }
5628           }
5629
5630           return merged;
5631         }
5632
5633         function min(values, valueof) {
5634           var n = values.length,
5635               i = -1,
5636               value,
5637               min;
5638
5639           if (valueof == null) {
5640             while (++i < n) { // Find the first comparable value.
5641               if ((value = values[i]) != null && value >= value) {
5642                 min = value;
5643                 while (++i < n) { // Compare the remaining values.
5644                   if ((value = values[i]) != null && min > value) {
5645                     min = value;
5646                   }
5647                 }
5648               }
5649             }
5650           }
5651
5652           else {
5653             while (++i < n) { // Find the first comparable value.
5654               if ((value = valueof(values[i], i, values)) != null && value >= value) {
5655                 min = value;
5656                 while (++i < n) { // Compare the remaining values.
5657                   if ((value = valueof(values[i], i, values)) != null && min > value) {
5658                     min = value;
5659                   }
5660                 }
5661               }
5662             }
5663           }
5664
5665           return min;
5666         }
5667
5668         function permute(array, indexes) {
5669           var i = indexes.length, permutes = new Array(i);
5670           while (i--) permutes[i] = array[indexes[i]];
5671           return permutes;
5672         }
5673
5674         function scan(values, compare) {
5675           if (!(n = values.length)) return;
5676           var n,
5677               i = 0,
5678               j = 0,
5679               xi,
5680               xj = values[j];
5681
5682           if (compare == null) compare = d3_ascending;
5683
5684           while (++i < n) {
5685             if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
5686               xj = xi, j = i;
5687             }
5688           }
5689
5690           if (compare(xj, xj) === 0) return j;
5691         }
5692
5693         function shuffle(array, i0, i1) {
5694           var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
5695               t,
5696               i;
5697
5698           while (m) {
5699             i = Math.random() * m-- | 0;
5700             t = array[m + i0];
5701             array[m + i0] = array[i + i0];
5702             array[i + i0] = t;
5703           }
5704
5705           return array;
5706         }
5707
5708         function sum(values, valueof) {
5709           var n = values.length,
5710               i = -1,
5711               value,
5712               sum = 0;
5713
5714           if (valueof == null) {
5715             while (++i < n) {
5716               if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
5717             }
5718           }
5719
5720           else {
5721             while (++i < n) {
5722               if (value = +valueof(values[i], i, values)) sum += value;
5723             }
5724           }
5725
5726           return sum;
5727         }
5728
5729         function transpose(matrix) {
5730           if (!(n = matrix.length)) return [];
5731           for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
5732             for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
5733               row[j] = matrix[j][i];
5734             }
5735           }
5736           return transpose;
5737         }
5738
5739         function length(d) {
5740           return d.length;
5741         }
5742
5743         function zip() {
5744           return transpose(arguments);
5745         }
5746
5747         var slice$5 = Array.prototype.slice;
5748
5749         function identity$1(x) {
5750           return x;
5751         }
5752
5753         var top = 1,
5754             right = 2,
5755             bottom = 3,
5756             left = 4,
5757             epsilon = 1e-6;
5758
5759         function translateX(x) {
5760           return "translate(" + (x + 0.5) + ",0)";
5761         }
5762
5763         function translateY(y) {
5764           return "translate(0," + (y + 0.5) + ")";
5765         }
5766
5767         function number$1(scale) {
5768           return function(d) {
5769             return +scale(d);
5770           };
5771         }
5772
5773         function center(scale) {
5774           var offset = Math.max(0, scale.bandwidth() - 1) / 2; // Adjust for 0.5px offset.
5775           if (scale.round()) offset = Math.round(offset);
5776           return function(d) {
5777             return +scale(d) + offset;
5778           };
5779         }
5780
5781         function entering() {
5782           return !this.__axis;
5783         }
5784
5785         function axis(orient, scale) {
5786           var tickArguments = [],
5787               tickValues = null,
5788               tickFormat = null,
5789               tickSizeInner = 6,
5790               tickSizeOuter = 6,
5791               tickPadding = 3,
5792               k = orient === top || orient === left ? -1 : 1,
5793               x = orient === left || orient === right ? "x" : "y",
5794               transform = orient === top || orient === bottom ? translateX : translateY;
5795
5796           function axis(context) {
5797             var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues,
5798                 format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity$1) : tickFormat,
5799                 spacing = Math.max(tickSizeInner, 0) + tickPadding,
5800                 range = scale.range(),
5801                 range0 = +range[0] + 0.5,
5802                 range1 = +range[range.length - 1] + 0.5,
5803                 position = (scale.bandwidth ? center : number$1)(scale.copy()),
5804                 selection = context.selection ? context.selection() : context,
5805                 path = selection.selectAll(".domain").data([null]),
5806                 tick = selection.selectAll(".tick").data(values, scale).order(),
5807                 tickExit = tick.exit(),
5808                 tickEnter = tick.enter().append("g").attr("class", "tick"),
5809                 line = tick.select("line"),
5810                 text = tick.select("text");
5811
5812             path = path.merge(path.enter().insert("path", ".tick")
5813                 .attr("class", "domain")
5814                 .attr("stroke", "currentColor"));
5815
5816             tick = tick.merge(tickEnter);
5817
5818             line = line.merge(tickEnter.append("line")
5819                 .attr("stroke", "currentColor")
5820                 .attr(x + "2", k * tickSizeInner));
5821
5822             text = text.merge(tickEnter.append("text")
5823                 .attr("fill", "currentColor")
5824                 .attr(x, k * spacing)
5825                 .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em"));
5826
5827             if (context !== selection) {
5828               path = path.transition(context);
5829               tick = tick.transition(context);
5830               line = line.transition(context);
5831               text = text.transition(context);
5832
5833               tickExit = tickExit.transition(context)
5834                   .attr("opacity", epsilon)
5835                   .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d) : this.getAttribute("transform"); });
5836
5837               tickEnter
5838                   .attr("opacity", epsilon)
5839                   .attr("transform", function(d) { var p = this.parentNode.__axis; return transform(p && isFinite(p = p(d)) ? p : position(d)); });
5840             }
5841
5842             tickExit.remove();
5843
5844             path
5845                 .attr("d", orient === left || orient == right
5846                     ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H0.5V" + range1 + "H" + k * tickSizeOuter : "M0.5," + range0 + "V" + range1)
5847                     : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V0.5H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + ",0.5H" + range1));
5848
5849             tick
5850                 .attr("opacity", 1)
5851                 .attr("transform", function(d) { return transform(position(d)); });
5852
5853             line
5854                 .attr(x + "2", k * tickSizeInner);
5855
5856             text
5857                 .attr(x, k * spacing)
5858                 .text(format);
5859
5860             selection.filter(entering)
5861                 .attr("fill", "none")
5862                 .attr("font-size", 10)
5863                 .attr("font-family", "sans-serif")
5864                 .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle");
5865
5866             selection
5867                 .each(function() { this.__axis = position; });
5868           }
5869
5870           axis.scale = function(_) {
5871             return arguments.length ? (scale = _, axis) : scale;
5872           };
5873
5874           axis.ticks = function() {
5875             return tickArguments = slice$5.call(arguments), axis;
5876           };
5877
5878           axis.tickArguments = function(_) {
5879             return arguments.length ? (tickArguments = _ == null ? [] : slice$5.call(_), axis) : tickArguments.slice();
5880           };
5881
5882           axis.tickValues = function(_) {
5883             return arguments.length ? (tickValues = _ == null ? null : slice$5.call(_), axis) : tickValues && tickValues.slice();
5884           };
5885
5886           axis.tickFormat = function(_) {
5887             return arguments.length ? (tickFormat = _, axis) : tickFormat;
5888           };
5889
5890           axis.tickSize = function(_) {
5891             return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner;
5892           };
5893
5894           axis.tickSizeInner = function(_) {
5895             return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner;
5896           };
5897
5898           axis.tickSizeOuter = function(_) {
5899             return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter;
5900           };
5901
5902           axis.tickPadding = function(_) {
5903             return arguments.length ? (tickPadding = +_, axis) : tickPadding;
5904           };
5905
5906           return axis;
5907         }
5908
5909         function axisTop(scale) {
5910           return axis(top, scale);
5911         }
5912
5913         function axisRight(scale) {
5914           return axis(right, scale);
5915         }
5916
5917         function axisBottom(scale) {
5918           return axis(bottom, scale);
5919         }
5920
5921         function axisLeft(scale) {
5922           return axis(left, scale);
5923         }
5924
5925         var noop$2 = {value: function() {}};
5926
5927         function dispatch() {
5928           for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) {
5929             if (!(t = arguments[i] + "") || (t in _)) throw new Error("illegal type: " + t);
5930             _[t] = [];
5931           }
5932           return new Dispatch(_);
5933         }
5934
5935         function Dispatch(_) {
5936           this._ = _;
5937         }
5938
5939         function parseTypenames(typenames, types) {
5940           return typenames.trim().split(/^|\s+/).map(function(t) {
5941             var name = "", i = t.indexOf(".");
5942             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
5943             if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t);
5944             return {type: t, name: name};
5945           });
5946         }
5947
5948         Dispatch.prototype = dispatch.prototype = {
5949           constructor: Dispatch,
5950           on: function(typename, callback) {
5951             var _ = this._,
5952                 T = parseTypenames(typename + "", _),
5953                 t,
5954                 i = -1,
5955                 n = T.length;
5956
5957             // If no callback was specified, return the callback of the given type and name.
5958             if (arguments.length < 2) {
5959               while (++i < n) if ((t = (typename = T[i]).type) && (t = get$1(_[t], typename.name))) return t;
5960               return;
5961             }
5962
5963             // If a type was specified, set the callback for the given type and name.
5964             // Otherwise, if a null callback was specified, remove callbacks of the given name.
5965             if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback);
5966             while (++i < n) {
5967               if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback);
5968               else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null);
5969             }
5970
5971             return this;
5972           },
5973           copy: function() {
5974             var copy = {}, _ = this._;
5975             for (var t in _) copy[t] = _[t].slice();
5976             return new Dispatch(copy);
5977           },
5978           call: function(type, that) {
5979             if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2];
5980             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5981             for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5982           },
5983           apply: function(type, that, args) {
5984             if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type);
5985             for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args);
5986           }
5987         };
5988
5989         function get$1(type, name) {
5990           for (var i = 0, n = type.length, c; i < n; ++i) {
5991             if ((c = type[i]).name === name) {
5992               return c.value;
5993             }
5994           }
5995         }
5996
5997         function set(type, name, callback) {
5998           for (var i = 0, n = type.length; i < n; ++i) {
5999             if (type[i].name === name) {
6000               type[i] = noop$2, type = type.slice(0, i).concat(type.slice(i + 1));
6001               break;
6002             }
6003           }
6004           if (callback != null) type.push({name: name, value: callback});
6005           return type;
6006         }
6007
6008         var xhtml = "http://www.w3.org/1999/xhtml";
6009
6010         var namespaces = {
6011           svg: "http://www.w3.org/2000/svg",
6012           xhtml: xhtml,
6013           xlink: "http://www.w3.org/1999/xlink",
6014           xml: "http://www.w3.org/XML/1998/namespace",
6015           xmlns: "http://www.w3.org/2000/xmlns/"
6016         };
6017
6018         function namespace(name) {
6019           var prefix = name += "", i = prefix.indexOf(":");
6020           if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1);
6021           return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name;
6022         }
6023
6024         function creatorInherit(name) {
6025           return function() {
6026             var document = this.ownerDocument,
6027                 uri = this.namespaceURI;
6028             return uri === xhtml && document.documentElement.namespaceURI === xhtml
6029                 ? document.createElement(name)
6030                 : document.createElementNS(uri, name);
6031           };
6032         }
6033
6034         function creatorFixed(fullname) {
6035           return function() {
6036             return this.ownerDocument.createElementNS(fullname.space, fullname.local);
6037           };
6038         }
6039
6040         function creator(name) {
6041           var fullname = namespace(name);
6042           return (fullname.local
6043               ? creatorFixed
6044               : creatorInherit)(fullname);
6045         }
6046
6047         function none() {}
6048
6049         function selector(selector) {
6050           return selector == null ? none : function() {
6051             return this.querySelector(selector);
6052           };
6053         }
6054
6055         function selection_select(select) {
6056           if (typeof select !== "function") select = selector(select);
6057
6058           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6059             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
6060               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
6061                 if ("__data__" in node) subnode.__data__ = node.__data__;
6062                 subgroup[i] = subnode;
6063               }
6064             }
6065           }
6066
6067           return new Selection(subgroups, this._parents);
6068         }
6069
6070         function empty() {
6071           return [];
6072         }
6073
6074         function selectorAll(selector) {
6075           return selector == null ? empty : function() {
6076             return this.querySelectorAll(selector);
6077           };
6078         }
6079
6080         function selection_selectAll(select) {
6081           if (typeof select !== "function") select = selectorAll(select);
6082
6083           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
6084             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
6085               if (node = group[i]) {
6086                 subgroups.push(select.call(node, node.__data__, i, group));
6087                 parents.push(node);
6088               }
6089             }
6090           }
6091
6092           return new Selection(subgroups, parents);
6093         }
6094
6095         function matcher(selector) {
6096           return function() {
6097             return this.matches(selector);
6098           };
6099         }
6100
6101         function selection_filter(match) {
6102           if (typeof match !== "function") match = matcher(match);
6103
6104           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
6105             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
6106               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
6107                 subgroup.push(node);
6108               }
6109             }
6110           }
6111
6112           return new Selection(subgroups, this._parents);
6113         }
6114
6115         function sparse(update) {
6116           return new Array(update.length);
6117         }
6118
6119         function selection_enter() {
6120           return new Selection(this._enter || this._groups.map(sparse), this._parents);
6121         }
6122
6123         function EnterNode(parent, datum) {
6124           this.ownerDocument = parent.ownerDocument;
6125           this.namespaceURI = parent.namespaceURI;
6126           this._next = null;
6127           this._parent = parent;
6128           this.__data__ = datum;
6129         }
6130
6131         EnterNode.prototype = {
6132           constructor: EnterNode,
6133           appendChild: function(child) { return this._parent.insertBefore(child, this._next); },
6134           insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },
6135           querySelector: function(selector) { return this._parent.querySelector(selector); },
6136           querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }
6137         };
6138
6139         function constant$1(x) {
6140           return function() {
6141             return x;
6142           };
6143         }
6144
6145         var keyPrefix = "$"; // Protect against keys like “__proto__”.
6146
6147         function bindIndex(parent, group, enter, update, exit, data) {
6148           var i = 0,
6149               node,
6150               groupLength = group.length,
6151               dataLength = data.length;
6152
6153           // Put any non-null nodes that fit into update.
6154           // Put any null nodes into enter.
6155           // Put any remaining data into enter.
6156           for (; i < dataLength; ++i) {
6157             if (node = group[i]) {
6158               node.__data__ = data[i];
6159               update[i] = node;
6160             } else {
6161               enter[i] = new EnterNode(parent, data[i]);
6162             }
6163           }
6164
6165           // Put any non-null nodes that don’t fit into exit.
6166           for (; i < groupLength; ++i) {
6167             if (node = group[i]) {
6168               exit[i] = node;
6169             }
6170           }
6171         }
6172
6173         function bindKey(parent, group, enter, update, exit, data, key) {
6174           var i,
6175               node,
6176               nodeByKeyValue = {},
6177               groupLength = group.length,
6178               dataLength = data.length,
6179               keyValues = new Array(groupLength),
6180               keyValue;
6181
6182           // Compute the key for each node.
6183           // If multiple nodes have the same key, the duplicates are added to exit.
6184           for (i = 0; i < groupLength; ++i) {
6185             if (node = group[i]) {
6186               keyValues[i] = keyValue = keyPrefix + key.call(node, node.__data__, i, group);
6187               if (keyValue in nodeByKeyValue) {
6188                 exit[i] = node;
6189               } else {
6190                 nodeByKeyValue[keyValue] = node;
6191               }
6192             }
6193           }
6194
6195           // Compute the key for each datum.
6196           // If there a node associated with this key, join and add it to update.
6197           // If there is not (or the key is a duplicate), add it to enter.
6198           for (i = 0; i < dataLength; ++i) {
6199             keyValue = keyPrefix + key.call(parent, data[i], i, data);
6200             if (node = nodeByKeyValue[keyValue]) {
6201               update[i] = node;
6202               node.__data__ = data[i];
6203               nodeByKeyValue[keyValue] = null;
6204             } else {
6205               enter[i] = new EnterNode(parent, data[i]);
6206             }
6207           }
6208
6209           // Add any remaining nodes that were not bound to data to exit.
6210           for (i = 0; i < groupLength; ++i) {
6211             if ((node = group[i]) && (nodeByKeyValue[keyValues[i]] === node)) {
6212               exit[i] = node;
6213             }
6214           }
6215         }
6216
6217         function selection_data(value, key) {
6218           if (!value) {
6219             data = new Array(this.size()), j = -1;
6220             this.each(function(d) { data[++j] = d; });
6221             return data;
6222           }
6223
6224           var bind = key ? bindKey : bindIndex,
6225               parents = this._parents,
6226               groups = this._groups;
6227
6228           if (typeof value !== "function") value = constant$1(value);
6229
6230           for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {
6231             var parent = parents[j],
6232                 group = groups[j],
6233                 groupLength = group.length,
6234                 data = value.call(parent, parent && parent.__data__, j, parents),
6235                 dataLength = data.length,
6236                 enterGroup = enter[j] = new Array(dataLength),
6237                 updateGroup = update[j] = new Array(dataLength),
6238                 exitGroup = exit[j] = new Array(groupLength);
6239
6240             bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);
6241
6242             // Now connect the enter nodes to their following update node, such that
6243             // appendChild can insert the materialized enter node before this node,
6244             // rather than at the end of the parent node.
6245             for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {
6246               if (previous = enterGroup[i0]) {
6247                 if (i0 >= i1) i1 = i0 + 1;
6248                 while (!(next = updateGroup[i1]) && ++i1 < dataLength);
6249                 previous._next = next || null;
6250               }
6251             }
6252           }
6253
6254           update = new Selection(update, parents);
6255           update._enter = enter;
6256           update._exit = exit;
6257           return update;
6258         }
6259
6260         function selection_exit() {
6261           return new Selection(this._exit || this._groups.map(sparse), this._parents);
6262         }
6263
6264         function selection_join(onenter, onupdate, onexit) {
6265           var enter = this.enter(), update = this, exit = this.exit();
6266           enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + "");
6267           if (onupdate != null) update = onupdate(update);
6268           if (onexit == null) exit.remove(); else onexit(exit);
6269           return enter && update ? enter.merge(update).order() : update;
6270         }
6271
6272         function selection_merge(selection) {
6273
6274           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) {
6275             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
6276               if (node = group0[i] || group1[i]) {
6277                 merge[i] = node;
6278               }
6279             }
6280           }
6281
6282           for (; j < m0; ++j) {
6283             merges[j] = groups0[j];
6284           }
6285
6286           return new Selection(merges, this._parents);
6287         }
6288
6289         function selection_order() {
6290
6291           for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {
6292             for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {
6293               if (node = group[i]) {
6294                 if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);
6295                 next = node;
6296               }
6297             }
6298           }
6299
6300           return this;
6301         }
6302
6303         function selection_sort(compare) {
6304           if (!compare) compare = ascending;
6305
6306           function compareNode(a, b) {
6307             return a && b ? compare(a.__data__, b.__data__) : !a - !b;
6308           }
6309
6310           for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {
6311             for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {
6312               if (node = group[i]) {
6313                 sortgroup[i] = node;
6314               }
6315             }
6316             sortgroup.sort(compareNode);
6317           }
6318
6319           return new Selection(sortgroups, this._parents).order();
6320         }
6321
6322         function ascending(a, b) {
6323           return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6324         }
6325
6326         function selection_call() {
6327           var callback = arguments[0];
6328           arguments[0] = this;
6329           callback.apply(null, arguments);
6330           return this;
6331         }
6332
6333         function selection_nodes() {
6334           var nodes = new Array(this.size()), i = -1;
6335           this.each(function() { nodes[++i] = this; });
6336           return nodes;
6337         }
6338
6339         function selection_node() {
6340
6341           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6342             for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {
6343               var node = group[i];
6344               if (node) return node;
6345             }
6346           }
6347
6348           return null;
6349         }
6350
6351         function selection_size() {
6352           var size = 0;
6353           this.each(function() { ++size; });
6354           return size;
6355         }
6356
6357         function selection_empty() {
6358           return !this.node();
6359         }
6360
6361         function selection_each(callback) {
6362
6363           for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {
6364             for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {
6365               if (node = group[i]) callback.call(node, node.__data__, i, group);
6366             }
6367           }
6368
6369           return this;
6370         }
6371
6372         function attrRemove(name) {
6373           return function() {
6374             this.removeAttribute(name);
6375           };
6376         }
6377
6378         function attrRemoveNS(fullname) {
6379           return function() {
6380             this.removeAttributeNS(fullname.space, fullname.local);
6381           };
6382         }
6383
6384         function attrConstant(name, value) {
6385           return function() {
6386             this.setAttribute(name, value);
6387           };
6388         }
6389
6390         function attrConstantNS(fullname, value) {
6391           return function() {
6392             this.setAttributeNS(fullname.space, fullname.local, value);
6393           };
6394         }
6395
6396         function attrFunction(name, value) {
6397           return function() {
6398             var v = value.apply(this, arguments);
6399             if (v == null) this.removeAttribute(name);
6400             else this.setAttribute(name, v);
6401           };
6402         }
6403
6404         function attrFunctionNS(fullname, value) {
6405           return function() {
6406             var v = value.apply(this, arguments);
6407             if (v == null) this.removeAttributeNS(fullname.space, fullname.local);
6408             else this.setAttributeNS(fullname.space, fullname.local, v);
6409           };
6410         }
6411
6412         function selection_attr(name, value) {
6413           var fullname = namespace(name);
6414
6415           if (arguments.length < 2) {
6416             var node = this.node();
6417             return fullname.local
6418                 ? node.getAttributeNS(fullname.space, fullname.local)
6419                 : node.getAttribute(fullname);
6420           }
6421
6422           return this.each((value == null
6423               ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function"
6424               ? (fullname.local ? attrFunctionNS : attrFunction)
6425               : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));
6426         }
6427
6428         function defaultView(node) {
6429           return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node
6430               || (node.document && node) // node is a Window
6431               || node.defaultView; // node is a Document
6432         }
6433
6434         function styleRemove(name) {
6435           return function() {
6436             this.style.removeProperty(name);
6437           };
6438         }
6439
6440         function styleConstant(name, value, priority) {
6441           return function() {
6442             this.style.setProperty(name, value, priority);
6443           };
6444         }
6445
6446         function styleFunction(name, value, priority) {
6447           return function() {
6448             var v = value.apply(this, arguments);
6449             if (v == null) this.style.removeProperty(name);
6450             else this.style.setProperty(name, v, priority);
6451           };
6452         }
6453
6454         function selection_style(name, value, priority) {
6455           return arguments.length > 1
6456               ? this.each((value == null
6457                     ? styleRemove : typeof value === "function"
6458                     ? styleFunction
6459                     : styleConstant)(name, value, priority == null ? "" : priority))
6460               : styleValue(this.node(), name);
6461         }
6462
6463         function styleValue(node, name) {
6464           return node.style.getPropertyValue(name)
6465               || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);
6466         }
6467
6468         function propertyRemove(name) {
6469           return function() {
6470             delete this[name];
6471           };
6472         }
6473
6474         function propertyConstant(name, value) {
6475           return function() {
6476             this[name] = value;
6477           };
6478         }
6479
6480         function propertyFunction(name, value) {
6481           return function() {
6482             var v = value.apply(this, arguments);
6483             if (v == null) delete this[name];
6484             else this[name] = v;
6485           };
6486         }
6487
6488         function selection_property(name, value) {
6489           return arguments.length > 1
6490               ? this.each((value == null
6491                   ? propertyRemove : typeof value === "function"
6492                   ? propertyFunction
6493                   : propertyConstant)(name, value))
6494               : this.node()[name];
6495         }
6496
6497         function classArray(string) {
6498           return string.trim().split(/^|\s+/);
6499         }
6500
6501         function classList(node) {
6502           return node.classList || new ClassList(node);
6503         }
6504
6505         function ClassList(node) {
6506           this._node = node;
6507           this._names = classArray(node.getAttribute("class") || "");
6508         }
6509
6510         ClassList.prototype = {
6511           add: function(name) {
6512             var i = this._names.indexOf(name);
6513             if (i < 0) {
6514               this._names.push(name);
6515               this._node.setAttribute("class", this._names.join(" "));
6516             }
6517           },
6518           remove: function(name) {
6519             var i = this._names.indexOf(name);
6520             if (i >= 0) {
6521               this._names.splice(i, 1);
6522               this._node.setAttribute("class", this._names.join(" "));
6523             }
6524           },
6525           contains: function(name) {
6526             return this._names.indexOf(name) >= 0;
6527           }
6528         };
6529
6530         function classedAdd(node, names) {
6531           var list = classList(node), i = -1, n = names.length;
6532           while (++i < n) list.add(names[i]);
6533         }
6534
6535         function classedRemove(node, names) {
6536           var list = classList(node), i = -1, n = names.length;
6537           while (++i < n) list.remove(names[i]);
6538         }
6539
6540         function classedTrue(names) {
6541           return function() {
6542             classedAdd(this, names);
6543           };
6544         }
6545
6546         function classedFalse(names) {
6547           return function() {
6548             classedRemove(this, names);
6549           };
6550         }
6551
6552         function classedFunction(names, value) {
6553           return function() {
6554             (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);
6555           };
6556         }
6557
6558         function selection_classed(name, value) {
6559           var names = classArray(name + "");
6560
6561           if (arguments.length < 2) {
6562             var list = classList(this.node()), i = -1, n = names.length;
6563             while (++i < n) if (!list.contains(names[i])) return false;
6564             return true;
6565           }
6566
6567           return this.each((typeof value === "function"
6568               ? classedFunction : value
6569               ? classedTrue
6570               : classedFalse)(names, value));
6571         }
6572
6573         function textRemove() {
6574           this.textContent = "";
6575         }
6576
6577         function textConstant(value) {
6578           return function() {
6579             this.textContent = value;
6580           };
6581         }
6582
6583         function textFunction(value) {
6584           return function() {
6585             var v = value.apply(this, arguments);
6586             this.textContent = v == null ? "" : v;
6587           };
6588         }
6589
6590         function selection_text(value) {
6591           return arguments.length
6592               ? this.each(value == null
6593                   ? textRemove : (typeof value === "function"
6594                   ? textFunction
6595                   : textConstant)(value))
6596               : this.node().textContent;
6597         }
6598
6599         function htmlRemove() {
6600           this.innerHTML = "";
6601         }
6602
6603         function htmlConstant(value) {
6604           return function() {
6605             this.innerHTML = value;
6606           };
6607         }
6608
6609         function htmlFunction(value) {
6610           return function() {
6611             var v = value.apply(this, arguments);
6612             this.innerHTML = v == null ? "" : v;
6613           };
6614         }
6615
6616         function selection_html(value) {
6617           return arguments.length
6618               ? this.each(value == null
6619                   ? htmlRemove : (typeof value === "function"
6620                   ? htmlFunction
6621                   : htmlConstant)(value))
6622               : this.node().innerHTML;
6623         }
6624
6625         function raise() {
6626           if (this.nextSibling) this.parentNode.appendChild(this);
6627         }
6628
6629         function selection_raise() {
6630           return this.each(raise);
6631         }
6632
6633         function lower() {
6634           if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);
6635         }
6636
6637         function selection_lower() {
6638           return this.each(lower);
6639         }
6640
6641         function selection_append(name) {
6642           var create = typeof name === "function" ? name : creator(name);
6643           return this.select(function() {
6644             return this.appendChild(create.apply(this, arguments));
6645           });
6646         }
6647
6648         function constantNull() {
6649           return null;
6650         }
6651
6652         function selection_insert(name, before) {
6653           var create = typeof name === "function" ? name : creator(name),
6654               select = before == null ? constantNull : typeof before === "function" ? before : selector(before);
6655           return this.select(function() {
6656             return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);
6657           });
6658         }
6659
6660         function remove() {
6661           var parent = this.parentNode;
6662           if (parent) parent.removeChild(this);
6663         }
6664
6665         function selection_remove() {
6666           return this.each(remove);
6667         }
6668
6669         function selection_cloneShallow() {
6670           return this.parentNode.insertBefore(this.cloneNode(false), this.nextSibling);
6671         }
6672
6673         function selection_cloneDeep() {
6674           return this.parentNode.insertBefore(this.cloneNode(true), this.nextSibling);
6675         }
6676
6677         function selection_clone(deep) {
6678           return this.select(deep ? selection_cloneDeep : selection_cloneShallow);
6679         }
6680
6681         function selection_datum(value) {
6682           return arguments.length
6683               ? this.property("__data__", value)
6684               : this.node().__data__;
6685         }
6686
6687         var filterEvents = {};
6688
6689         var event = null;
6690
6691         if (typeof document !== "undefined") {
6692           var element = document.documentElement;
6693           if (!("onmouseenter" in element)) {
6694             filterEvents = {mouseenter: "mouseover", mouseleave: "mouseout"};
6695           }
6696         }
6697
6698         function filterContextListener(listener, index, group) {
6699           listener = contextListener(listener, index, group);
6700           return function(event) {
6701             var related = event.relatedTarget;
6702             if (!related || (related !== this && !(related.compareDocumentPosition(this) & 8))) {
6703               listener.call(this, event);
6704             }
6705           };
6706         }
6707
6708         function contextListener(listener, index, group) {
6709           return function(event1) {
6710             var event0 = event; // Events can be reentrant (e.g., focus).
6711             event = event1;
6712             try {
6713               listener.call(this, this.__data__, index, group);
6714             } finally {
6715               event = event0;
6716             }
6717           };
6718         }
6719
6720         function parseTypenames$1(typenames) {
6721           return typenames.trim().split(/^|\s+/).map(function(t) {
6722             var name = "", i = t.indexOf(".");
6723             if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);
6724             return {type: t, name: name};
6725           });
6726         }
6727
6728         function onRemove(typename) {
6729           return function() {
6730             var on = this.__on;
6731             if (!on) return;
6732             for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {
6733               if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {
6734                 this.removeEventListener(o.type, o.listener, o.capture);
6735               } else {
6736                 on[++i] = o;
6737               }
6738             }
6739             if (++i) on.length = i;
6740             else delete this.__on;
6741           };
6742         }
6743
6744         function onAdd(typename, value, capture) {
6745           var wrap = filterEvents.hasOwnProperty(typename.type) ? filterContextListener : contextListener;
6746           return function(d, i, group) {
6747             var on = this.__on, o, listener = wrap(value, i, group);
6748             if (on) for (var j = 0, m = on.length; j < m; ++j) {
6749               if ((o = on[j]).type === typename.type && o.name === typename.name) {
6750                 this.removeEventListener(o.type, o.listener, o.capture);
6751                 this.addEventListener(o.type, o.listener = listener, o.capture = capture);
6752                 o.value = value;
6753                 return;
6754               }
6755             }
6756             this.addEventListener(typename.type, listener, capture);
6757             o = {type: typename.type, name: typename.name, value: value, listener: listener, capture: capture};
6758             if (!on) this.__on = [o];
6759             else on.push(o);
6760           };
6761         }
6762
6763         function selection_on(typename, value, capture) {
6764           var typenames = parseTypenames$1(typename + ""), i, n = typenames.length, t;
6765
6766           if (arguments.length < 2) {
6767             var on = this.node().__on;
6768             if (on) for (var j = 0, m = on.length, o; j < m; ++j) {
6769               for (i = 0, o = on[j]; i < n; ++i) {
6770                 if ((t = typenames[i]).type === o.type && t.name === o.name) {
6771                   return o.value;
6772                 }
6773               }
6774             }
6775             return;
6776           }
6777
6778           on = value ? onAdd : onRemove;
6779           if (capture == null) capture = false;
6780           for (i = 0; i < n; ++i) this.each(on(typenames[i], value, capture));
6781           return this;
6782         }
6783
6784         function customEvent(event1, listener, that, args) {
6785           var event0 = event;
6786           event1.sourceEvent = event;
6787           event = event1;
6788           try {
6789             return listener.apply(that, args);
6790           } finally {
6791             event = event0;
6792           }
6793         }
6794
6795         function dispatchEvent(node, type, params) {
6796           var window = defaultView(node),
6797               event = window.CustomEvent;
6798
6799           if (typeof event === "function") {
6800             event = new event(type, params);
6801           } else {
6802             event = window.document.createEvent("Event");
6803             if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;
6804             else event.initEvent(type, false, false);
6805           }
6806
6807           node.dispatchEvent(event);
6808         }
6809
6810         function dispatchConstant(type, params) {
6811           return function() {
6812             return dispatchEvent(this, type, params);
6813           };
6814         }
6815
6816         function dispatchFunction(type, params) {
6817           return function() {
6818             return dispatchEvent(this, type, params.apply(this, arguments));
6819           };
6820         }
6821
6822         function selection_dispatch(type, params) {
6823           return this.each((typeof params === "function"
6824               ? dispatchFunction
6825               : dispatchConstant)(type, params));
6826         }
6827
6828         var root$1 = [null];
6829
6830         function Selection(groups, parents) {
6831           this._groups = groups;
6832           this._parents = parents;
6833         }
6834
6835         function selection() {
6836           return new Selection([[document.documentElement]], root$1);
6837         }
6838
6839         Selection.prototype = selection.prototype = {
6840           constructor: Selection,
6841           select: selection_select,
6842           selectAll: selection_selectAll,
6843           filter: selection_filter,
6844           data: selection_data,
6845           enter: selection_enter,
6846           exit: selection_exit,
6847           join: selection_join,
6848           merge: selection_merge,
6849           order: selection_order,
6850           sort: selection_sort,
6851           call: selection_call,
6852           nodes: selection_nodes,
6853           node: selection_node,
6854           size: selection_size,
6855           empty: selection_empty,
6856           each: selection_each,
6857           attr: selection_attr,
6858           style: selection_style,
6859           property: selection_property,
6860           classed: selection_classed,
6861           text: selection_text,
6862           html: selection_html,
6863           raise: selection_raise,
6864           lower: selection_lower,
6865           append: selection_append,
6866           insert: selection_insert,
6867           remove: selection_remove,
6868           clone: selection_clone,
6869           datum: selection_datum,
6870           on: selection_on,
6871           dispatch: selection_dispatch
6872         };
6873
6874         function d3_select(selector) {
6875           return typeof selector === "string"
6876               ? new Selection([[document.querySelector(selector)]], [document.documentElement])
6877               : new Selection([[selector]], root$1);
6878         }
6879
6880         function create$5(name) {
6881           return d3_select(creator(name).call(document.documentElement));
6882         }
6883
6884         var nextId = 0;
6885
6886         function local() {
6887           return new Local;
6888         }
6889
6890         function Local() {
6891           this._ = "@" + (++nextId).toString(36);
6892         }
6893
6894         Local.prototype = local.prototype = {
6895           constructor: Local,
6896           get: function(node) {
6897             var id = this._;
6898             while (!(id in node)) if (!(node = node.parentNode)) return;
6899             return node[id];
6900           },
6901           set: function(node, value) {
6902             return node[this._] = value;
6903           },
6904           remove: function(node) {
6905             return this._ in node && delete node[this._];
6906           },
6907           toString: function() {
6908             return this._;
6909           }
6910         };
6911
6912         function sourceEvent() {
6913           var current = event, source;
6914           while (source = current.sourceEvent) current = source;
6915           return current;
6916         }
6917
6918         function point(node, event) {
6919           var svg = node.ownerSVGElement || node;
6920
6921           if (svg.createSVGPoint) {
6922             var point = svg.createSVGPoint();
6923             point.x = event.clientX, point.y = event.clientY;
6924             point = point.matrixTransform(node.getScreenCTM().inverse());
6925             return [point.x, point.y];
6926           }
6927
6928           var rect = node.getBoundingClientRect();
6929           return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop];
6930         }
6931
6932         function d3_mouse(node) {
6933           var event = sourceEvent();
6934           if (event.changedTouches) event = event.changedTouches[0];
6935           return point(node, event);
6936         }
6937
6938         function d3_selectAll(selector) {
6939           return typeof selector === "string"
6940               ? new Selection([document.querySelectorAll(selector)], [document.documentElement])
6941               : new Selection([selector == null ? [] : selector], root$1);
6942         }
6943
6944         function touch(node, touches, identifier) {
6945           if (arguments.length < 3) identifier = touches, touches = sourceEvent().changedTouches;
6946
6947           for (var i = 0, n = touches ? touches.length : 0, touch; i < n; ++i) {
6948             if ((touch = touches[i]).identifier === identifier) {
6949               return point(node, touch);
6950             }
6951           }
6952
6953           return null;
6954         }
6955
6956         function d3_touches(node, touches) {
6957           if (touches == null) touches = sourceEvent().touches;
6958
6959           for (var i = 0, n = touches ? touches.length : 0, points = new Array(n); i < n; ++i) {
6960             points[i] = point(node, touches[i]);
6961           }
6962
6963           return points;
6964         }
6965
6966         function nopropagation() {
6967           event.stopImmediatePropagation();
6968         }
6969
6970         function noevent() {
6971           event.preventDefault();
6972           event.stopImmediatePropagation();
6973         }
6974
6975         function dragDisable(view) {
6976           var root = view.document.documentElement,
6977               selection = d3_select(view).on("dragstart.drag", noevent, true);
6978           if ("onselectstart" in root) {
6979             selection.on("selectstart.drag", noevent, true);
6980           } else {
6981             root.__noselect = root.style.MozUserSelect;
6982             root.style.MozUserSelect = "none";
6983           }
6984         }
6985
6986         function yesdrag(view, noclick) {
6987           var root = view.document.documentElement,
6988               selection = d3_select(view).on("dragstart.drag", null);
6989           if (noclick) {
6990             selection.on("click.drag", noevent, true);
6991             setTimeout(function() { selection.on("click.drag", null); }, 0);
6992           }
6993           if ("onselectstart" in root) {
6994             selection.on("selectstart.drag", null);
6995           } else {
6996             root.style.MozUserSelect = root.__noselect;
6997             delete root.__noselect;
6998           }
6999         }
7000
7001         function constant$2(x) {
7002           return function() {
7003             return x;
7004           };
7005         }
7006
7007         function DragEvent(target, type, subject, id, active, x, y, dx, dy, dispatch) {
7008           this.target = target;
7009           this.type = type;
7010           this.subject = subject;
7011           this.identifier = id;
7012           this.active = active;
7013           this.x = x;
7014           this.y = y;
7015           this.dx = dx;
7016           this.dy = dy;
7017           this._ = dispatch;
7018         }
7019
7020         DragEvent.prototype.on = function() {
7021           var value = this._.on.apply(this._, arguments);
7022           return value === this._ ? this : value;
7023         };
7024
7025         // Ignore right-click, since that should open the context menu.
7026         function defaultFilter() {
7027           return !event.button;
7028         }
7029
7030         function defaultContainer() {
7031           return this.parentNode;
7032         }
7033
7034         function defaultSubject(d) {
7035           return d == null ? {x: event.x, y: event.y} : d;
7036         }
7037
7038         function defaultTouchable() {
7039           return "ontouchstart" in this;
7040         }
7041
7042         function d3_drag() {
7043           var filter = defaultFilter,
7044               container = defaultContainer,
7045               subject = defaultSubject,
7046               touchable = defaultTouchable,
7047               gestures = {},
7048               listeners = dispatch("start", "drag", "end"),
7049               active = 0,
7050               mousedownx,
7051               mousedowny,
7052               mousemoving,
7053               touchending,
7054               clickDistance2 = 0;
7055
7056           function drag(selection) {
7057             selection
7058                 .on("mousedown.drag", mousedowned)
7059               .filter(touchable)
7060                 .on("touchstart.drag", touchstarted)
7061                 .on("touchmove.drag", touchmoved)
7062                 .on("touchend.drag touchcancel.drag", touchended)
7063                 .style("touch-action", "none")
7064                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
7065           }
7066
7067           function mousedowned() {
7068             if (touchending || !filter.apply(this, arguments)) return;
7069             var gesture = beforestart("mouse", container.apply(this, arguments), d3_mouse, this, arguments);
7070             if (!gesture) return;
7071             d3_select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true);
7072             dragDisable(event.view);
7073             nopropagation();
7074             mousemoving = false;
7075             mousedownx = event.clientX;
7076             mousedowny = event.clientY;
7077             gesture("start");
7078           }
7079
7080           function mousemoved() {
7081             noevent();
7082             if (!mousemoving) {
7083               var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny;
7084               mousemoving = dx * dx + dy * dy > clickDistance2;
7085             }
7086             gestures.mouse("drag");
7087           }
7088
7089           function mouseupped() {
7090             d3_select(event.view).on("mousemove.drag mouseup.drag", null);
7091             yesdrag(event.view, mousemoving);
7092             noevent();
7093             gestures.mouse("end");
7094           }
7095
7096           function touchstarted() {
7097             if (!filter.apply(this, arguments)) return;
7098             var touches = event.changedTouches,
7099                 c = container.apply(this, arguments),
7100                 n = touches.length, i, gesture;
7101
7102             for (i = 0; i < n; ++i) {
7103               if (gesture = beforestart(touches[i].identifier, c, touch, this, arguments)) {
7104                 nopropagation();
7105                 gesture("start");
7106               }
7107             }
7108           }
7109
7110           function touchmoved() {
7111             var touches = event.changedTouches,
7112                 n = touches.length, i, gesture;
7113
7114             for (i = 0; i < n; ++i) {
7115               if (gesture = gestures[touches[i].identifier]) {
7116                 noevent();
7117                 gesture("drag");
7118               }
7119             }
7120           }
7121
7122           function touchended() {
7123             var touches = event.changedTouches,
7124                 n = touches.length, i, gesture;
7125
7126             if (touchending) clearTimeout(touchending);
7127             touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
7128             for (i = 0; i < n; ++i) {
7129               if (gesture = gestures[touches[i].identifier]) {
7130                 nopropagation();
7131                 gesture("end");
7132               }
7133             }
7134           }
7135
7136           function beforestart(id, container, point, that, args) {
7137             var p = point(container, id), s, dx, dy,
7138                 sublisteners = listeners.copy();
7139
7140             if (!customEvent(new DragEvent(drag, "beforestart", s, id, active, p[0], p[1], 0, 0, sublisteners), function() {
7141               if ((event.subject = s = subject.apply(that, args)) == null) return false;
7142               dx = s.x - p[0] || 0;
7143               dy = s.y - p[1] || 0;
7144               return true;
7145             })) return;
7146
7147             return function gesture(type) {
7148               var p0 = p, n;
7149               switch (type) {
7150                 case "start": gestures[id] = gesture, n = active++; break;
7151                 case "end": delete gestures[id], --active; // nobreak
7152                 case "drag": p = point(container, id), n = active; break;
7153               }
7154               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]);
7155             };
7156           }
7157
7158           drag.filter = function(_) {
7159             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$2(!!_), drag) : filter;
7160           };
7161
7162           drag.container = function(_) {
7163             return arguments.length ? (container = typeof _ === "function" ? _ : constant$2(_), drag) : container;
7164           };
7165
7166           drag.subject = function(_) {
7167             return arguments.length ? (subject = typeof _ === "function" ? _ : constant$2(_), drag) : subject;
7168           };
7169
7170           drag.touchable = function(_) {
7171             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$2(!!_), drag) : touchable;
7172           };
7173
7174           drag.on = function() {
7175             var value = listeners.on.apply(listeners, arguments);
7176             return value === listeners ? drag : value;
7177           };
7178
7179           drag.clickDistance = function(_) {
7180             return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2);
7181           };
7182
7183           return drag;
7184         }
7185
7186         function define$1(constructor, factory, prototype) {
7187           constructor.prototype = factory.prototype = prototype;
7188           prototype.constructor = constructor;
7189         }
7190
7191         function extend(parent, definition) {
7192           var prototype = Object.create(parent.prototype);
7193           for (var key in definition) prototype[key] = definition[key];
7194           return prototype;
7195         }
7196
7197         function Color() {}
7198
7199         var darker = 0.7;
7200         var brighter = 1 / darker;
7201
7202         var reI = "\\s*([+-]?\\d+)\\s*",
7203             reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",
7204             reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",
7205             reHex3 = /^#([0-9a-f]{3})$/,
7206             reHex6 = /^#([0-9a-f]{6})$/,
7207             reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"),
7208             reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"),
7209             reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"),
7210             reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"),
7211             reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"),
7212             reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$");
7213
7214         var named = {
7215           aliceblue: 0xf0f8ff,
7216           antiquewhite: 0xfaebd7,
7217           aqua: 0x00ffff,
7218           aquamarine: 0x7fffd4,
7219           azure: 0xf0ffff,
7220           beige: 0xf5f5dc,
7221           bisque: 0xffe4c4,
7222           black: 0x000000,
7223           blanchedalmond: 0xffebcd,
7224           blue: 0x0000ff,
7225           blueviolet: 0x8a2be2,
7226           brown: 0xa52a2a,
7227           burlywood: 0xdeb887,
7228           cadetblue: 0x5f9ea0,
7229           chartreuse: 0x7fff00,
7230           chocolate: 0xd2691e,
7231           coral: 0xff7f50,
7232           cornflowerblue: 0x6495ed,
7233           cornsilk: 0xfff8dc,
7234           crimson: 0xdc143c,
7235           cyan: 0x00ffff,
7236           darkblue: 0x00008b,
7237           darkcyan: 0x008b8b,
7238           darkgoldenrod: 0xb8860b,
7239           darkgray: 0xa9a9a9,
7240           darkgreen: 0x006400,
7241           darkgrey: 0xa9a9a9,
7242           darkkhaki: 0xbdb76b,
7243           darkmagenta: 0x8b008b,
7244           darkolivegreen: 0x556b2f,
7245           darkorange: 0xff8c00,
7246           darkorchid: 0x9932cc,
7247           darkred: 0x8b0000,
7248           darksalmon: 0xe9967a,
7249           darkseagreen: 0x8fbc8f,
7250           darkslateblue: 0x483d8b,
7251           darkslategray: 0x2f4f4f,
7252           darkslategrey: 0x2f4f4f,
7253           darkturquoise: 0x00ced1,
7254           darkviolet: 0x9400d3,
7255           deeppink: 0xff1493,
7256           deepskyblue: 0x00bfff,
7257           dimgray: 0x696969,
7258           dimgrey: 0x696969,
7259           dodgerblue: 0x1e90ff,
7260           firebrick: 0xb22222,
7261           floralwhite: 0xfffaf0,
7262           forestgreen: 0x228b22,
7263           fuchsia: 0xff00ff,
7264           gainsboro: 0xdcdcdc,
7265           ghostwhite: 0xf8f8ff,
7266           gold: 0xffd700,
7267           goldenrod: 0xdaa520,
7268           gray: 0x808080,
7269           green: 0x008000,
7270           greenyellow: 0xadff2f,
7271           grey: 0x808080,
7272           honeydew: 0xf0fff0,
7273           hotpink: 0xff69b4,
7274           indianred: 0xcd5c5c,
7275           indigo: 0x4b0082,
7276           ivory: 0xfffff0,
7277           khaki: 0xf0e68c,
7278           lavender: 0xe6e6fa,
7279           lavenderblush: 0xfff0f5,
7280           lawngreen: 0x7cfc00,
7281           lemonchiffon: 0xfffacd,
7282           lightblue: 0xadd8e6,
7283           lightcoral: 0xf08080,
7284           lightcyan: 0xe0ffff,
7285           lightgoldenrodyellow: 0xfafad2,
7286           lightgray: 0xd3d3d3,
7287           lightgreen: 0x90ee90,
7288           lightgrey: 0xd3d3d3,
7289           lightpink: 0xffb6c1,
7290           lightsalmon: 0xffa07a,
7291           lightseagreen: 0x20b2aa,
7292           lightskyblue: 0x87cefa,
7293           lightslategray: 0x778899,
7294           lightslategrey: 0x778899,
7295           lightsteelblue: 0xb0c4de,
7296           lightyellow: 0xffffe0,
7297           lime: 0x00ff00,
7298           limegreen: 0x32cd32,
7299           linen: 0xfaf0e6,
7300           magenta: 0xff00ff,
7301           maroon: 0x800000,
7302           mediumaquamarine: 0x66cdaa,
7303           mediumblue: 0x0000cd,
7304           mediumorchid: 0xba55d3,
7305           mediumpurple: 0x9370db,
7306           mediumseagreen: 0x3cb371,
7307           mediumslateblue: 0x7b68ee,
7308           mediumspringgreen: 0x00fa9a,
7309           mediumturquoise: 0x48d1cc,
7310           mediumvioletred: 0xc71585,
7311           midnightblue: 0x191970,
7312           mintcream: 0xf5fffa,
7313           mistyrose: 0xffe4e1,
7314           moccasin: 0xffe4b5,
7315           navajowhite: 0xffdead,
7316           navy: 0x000080,
7317           oldlace: 0xfdf5e6,
7318           olive: 0x808000,
7319           olivedrab: 0x6b8e23,
7320           orange: 0xffa500,
7321           orangered: 0xff4500,
7322           orchid: 0xda70d6,
7323           palegoldenrod: 0xeee8aa,
7324           palegreen: 0x98fb98,
7325           paleturquoise: 0xafeeee,
7326           palevioletred: 0xdb7093,
7327           papayawhip: 0xffefd5,
7328           peachpuff: 0xffdab9,
7329           peru: 0xcd853f,
7330           pink: 0xffc0cb,
7331           plum: 0xdda0dd,
7332           powderblue: 0xb0e0e6,
7333           purple: 0x800080,
7334           rebeccapurple: 0x663399,
7335           red: 0xff0000,
7336           rosybrown: 0xbc8f8f,
7337           royalblue: 0x4169e1,
7338           saddlebrown: 0x8b4513,
7339           salmon: 0xfa8072,
7340           sandybrown: 0xf4a460,
7341           seagreen: 0x2e8b57,
7342           seashell: 0xfff5ee,
7343           sienna: 0xa0522d,
7344           silver: 0xc0c0c0,
7345           skyblue: 0x87ceeb,
7346           slateblue: 0x6a5acd,
7347           slategray: 0x708090,
7348           slategrey: 0x708090,
7349           snow: 0xfffafa,
7350           springgreen: 0x00ff7f,
7351           steelblue: 0x4682b4,
7352           tan: 0xd2b48c,
7353           teal: 0x008080,
7354           thistle: 0xd8bfd8,
7355           tomato: 0xff6347,
7356           turquoise: 0x40e0d0,
7357           violet: 0xee82ee,
7358           wheat: 0xf5deb3,
7359           white: 0xffffff,
7360           whitesmoke: 0xf5f5f5,
7361           yellow: 0xffff00,
7362           yellowgreen: 0x9acd32
7363         };
7364
7365         define$1(Color, color, {
7366           displayable: function() {
7367             return this.rgb().displayable();
7368           },
7369           hex: function() {
7370             return this.rgb().hex();
7371           },
7372           toString: function() {
7373             return this.rgb() + "";
7374           }
7375         });
7376
7377         function color(format) {
7378           var m;
7379           format = (format + "").trim().toLowerCase();
7380           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
7381               : (m = reHex6.exec(format)) ? rgbn(parseInt(m[1], 16)) // #ff0000
7382               : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0)
7383               : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%)
7384               : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1)
7385               : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1)
7386               : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%)
7387               : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1)
7388               : named.hasOwnProperty(format) ? rgbn(named[format])
7389               : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0)
7390               : null;
7391         }
7392
7393         function rgbn(n) {
7394           return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1);
7395         }
7396
7397         function rgba(r, g, b, a) {
7398           if (a <= 0) r = g = b = NaN;
7399           return new Rgb(r, g, b, a);
7400         }
7401
7402         function rgbConvert(o) {
7403           if (!(o instanceof Color)) o = color(o);
7404           if (!o) return new Rgb;
7405           o = o.rgb();
7406           return new Rgb(o.r, o.g, o.b, o.opacity);
7407         }
7408
7409         function rgb(r, g, b, opacity) {
7410           return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity);
7411         }
7412
7413         function Rgb(r, g, b, opacity) {
7414           this.r = +r;
7415           this.g = +g;
7416           this.b = +b;
7417           this.opacity = +opacity;
7418         }
7419
7420         define$1(Rgb, rgb, extend(Color, {
7421           brighter: function(k) {
7422             k = k == null ? brighter : Math.pow(brighter, k);
7423             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7424           },
7425           darker: function(k) {
7426             k = k == null ? darker : Math.pow(darker, k);
7427             return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity);
7428           },
7429           rgb: function() {
7430             return this;
7431           },
7432           displayable: function() {
7433             return (0 <= this.r && this.r <= 255)
7434                 && (0 <= this.g && this.g <= 255)
7435                 && (0 <= this.b && this.b <= 255)
7436                 && (0 <= this.opacity && this.opacity <= 1);
7437           },
7438           hex: function() {
7439             return "#" + hex$1(this.r) + hex$1(this.g) + hex$1(this.b);
7440           },
7441           toString: function() {
7442             var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a));
7443             return (a === 1 ? "rgb(" : "rgba(")
7444                 + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", "
7445                 + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", "
7446                 + Math.max(0, Math.min(255, Math.round(this.b) || 0))
7447                 + (a === 1 ? ")" : ", " + a + ")");
7448           }
7449         }));
7450
7451         function hex$1(value) {
7452           value = Math.max(0, Math.min(255, Math.round(value) || 0));
7453           return (value < 16 ? "0" : "") + value.toString(16);
7454         }
7455
7456         function hsla(h, s, l, a) {
7457           if (a <= 0) h = s = l = NaN;
7458           else if (l <= 0 || l >= 1) h = s = NaN;
7459           else if (s <= 0) h = NaN;
7460           return new Hsl(h, s, l, a);
7461         }
7462
7463         function hslConvert(o) {
7464           if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity);
7465           if (!(o instanceof Color)) o = color(o);
7466           if (!o) return new Hsl;
7467           if (o instanceof Hsl) return o;
7468           o = o.rgb();
7469           var r = o.r / 255,
7470               g = o.g / 255,
7471               b = o.b / 255,
7472               min = Math.min(r, g, b),
7473               max = Math.max(r, g, b),
7474               h = NaN,
7475               s = max - min,
7476               l = (max + min) / 2;
7477           if (s) {
7478             if (r === max) h = (g - b) / s + (g < b) * 6;
7479             else if (g === max) h = (b - r) / s + 2;
7480             else h = (r - g) / s + 4;
7481             s /= l < 0.5 ? max + min : 2 - max - min;
7482             h *= 60;
7483           } else {
7484             s = l > 0 && l < 1 ? 0 : h;
7485           }
7486           return new Hsl(h, s, l, o.opacity);
7487         }
7488
7489         function hsl(h, s, l, opacity) {
7490           return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity);
7491         }
7492
7493         function Hsl(h, s, l, opacity) {
7494           this.h = +h;
7495           this.s = +s;
7496           this.l = +l;
7497           this.opacity = +opacity;
7498         }
7499
7500         define$1(Hsl, hsl, extend(Color, {
7501           brighter: function(k) {
7502             k = k == null ? brighter : Math.pow(brighter, k);
7503             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7504           },
7505           darker: function(k) {
7506             k = k == null ? darker : Math.pow(darker, k);
7507             return new Hsl(this.h, this.s, this.l * k, this.opacity);
7508           },
7509           rgb: function() {
7510             var h = this.h % 360 + (this.h < 0) * 360,
7511                 s = isNaN(h) || isNaN(this.s) ? 0 : this.s,
7512                 l = this.l,
7513                 m2 = l + (l < 0.5 ? l : 1 - l) * s,
7514                 m1 = 2 * l - m2;
7515             return new Rgb(
7516               hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2),
7517               hsl2rgb(h, m1, m2),
7518               hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2),
7519               this.opacity
7520             );
7521           },
7522           displayable: function() {
7523             return (0 <= this.s && this.s <= 1 || isNaN(this.s))
7524                 && (0 <= this.l && this.l <= 1)
7525                 && (0 <= this.opacity && this.opacity <= 1);
7526           }
7527         }));
7528
7529         /* From FvD 13.37, CSS Color Module Level 3 */
7530         function hsl2rgb(h, m1, m2) {
7531           return (h < 60 ? m1 + (m2 - m1) * h / 60
7532               : h < 180 ? m2
7533               : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60
7534               : m1) * 255;
7535         }
7536
7537         var deg2rad = Math.PI / 180;
7538         var rad2deg = 180 / Math.PI;
7539
7540         // https://beta.observablehq.com/@mbostock/lab-and-rgb
7541         var K = 18,
7542             Xn = 0.96422,
7543             Yn = 1,
7544             Zn = 0.82521,
7545             t0 = 4 / 29,
7546             t1 = 6 / 29,
7547             t2 = 3 * t1 * t1,
7548             t3 = t1 * t1 * t1;
7549
7550         function labConvert(o) {
7551           if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity);
7552           if (o instanceof Hcl) {
7553             if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity);
7554             var h = o.h * deg2rad;
7555             return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity);
7556           }
7557           if (!(o instanceof Rgb)) o = rgbConvert(o);
7558           var r = rgb2lrgb(o.r),
7559               g = rgb2lrgb(o.g),
7560               b = rgb2lrgb(o.b),
7561               y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z;
7562           if (r === g && g === b) x = z = y; else {
7563             x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn);
7564             z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn);
7565           }
7566           return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity);
7567         }
7568
7569         function gray(l, opacity) {
7570           return new Lab(l, 0, 0, opacity == null ? 1 : opacity);
7571         }
7572
7573         function lab(l, a, b, opacity) {
7574           return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity);
7575         }
7576
7577         function Lab(l, a, b, opacity) {
7578           this.l = +l;
7579           this.a = +a;
7580           this.b = +b;
7581           this.opacity = +opacity;
7582         }
7583
7584         define$1(Lab, lab, extend(Color, {
7585           brighter: function(k) {
7586             return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7587           },
7588           darker: function(k) {
7589             return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity);
7590           },
7591           rgb: function() {
7592             var y = (this.l + 16) / 116,
7593                 x = isNaN(this.a) ? y : y + this.a / 500,
7594                 z = isNaN(this.b) ? y : y - this.b / 200;
7595             x = Xn * lab2xyz(x);
7596             y = Yn * lab2xyz(y);
7597             z = Zn * lab2xyz(z);
7598             return new Rgb(
7599               lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z),
7600               lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z),
7601               lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z),
7602               this.opacity
7603             );
7604           }
7605         }));
7606
7607         function xyz2lab(t) {
7608           return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0;
7609         }
7610
7611         function lab2xyz(t) {
7612           return t > t1 ? t * t * t : t2 * (t - t0);
7613         }
7614
7615         function lrgb2rgb(x) {
7616           return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055);
7617         }
7618
7619         function rgb2lrgb(x) {
7620           return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4);
7621         }
7622
7623         function hclConvert(o) {
7624           if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity);
7625           if (!(o instanceof Lab)) o = labConvert(o);
7626           if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0, o.l, o.opacity);
7627           var h = Math.atan2(o.b, o.a) * rad2deg;
7628           return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity);
7629         }
7630
7631         function lch(l, c, h, opacity) {
7632           return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7633         }
7634
7635         function hcl(h, c, l, opacity) {
7636           return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity);
7637         }
7638
7639         function Hcl(h, c, l, opacity) {
7640           this.h = +h;
7641           this.c = +c;
7642           this.l = +l;
7643           this.opacity = +opacity;
7644         }
7645
7646         define$1(Hcl, hcl, extend(Color, {
7647           brighter: function(k) {
7648             return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity);
7649           },
7650           darker: function(k) {
7651             return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity);
7652           },
7653           rgb: function() {
7654             return labConvert(this).rgb();
7655           }
7656         }));
7657
7658         var A = -0.14861,
7659             B = +1.78277,
7660             C = -0.29227,
7661             D = -0.90649,
7662             E = +1.97294,
7663             ED = E * D,
7664             EB = E * B,
7665             BC_DA = B * C - D * A;
7666
7667         function cubehelixConvert(o) {
7668           if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity);
7669           if (!(o instanceof Rgb)) o = rgbConvert(o);
7670           var r = o.r / 255,
7671               g = o.g / 255,
7672               b = o.b / 255,
7673               l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB),
7674               bl = b - l,
7675               k = (E * (g - l) - C * bl) / D,
7676               s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1
7677               h = s ? Math.atan2(k, bl) * rad2deg - 120 : NaN;
7678           return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity);
7679         }
7680
7681         function cubehelix(h, s, l, opacity) {
7682           return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity);
7683         }
7684
7685         function Cubehelix(h, s, l, opacity) {
7686           this.h = +h;
7687           this.s = +s;
7688           this.l = +l;
7689           this.opacity = +opacity;
7690         }
7691
7692         define$1(Cubehelix, cubehelix, extend(Color, {
7693           brighter: function(k) {
7694             k = k == null ? brighter : Math.pow(brighter, k);
7695             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7696           },
7697           darker: function(k) {
7698             k = k == null ? darker : Math.pow(darker, k);
7699             return new Cubehelix(this.h, this.s, this.l * k, this.opacity);
7700           },
7701           rgb: function() {
7702             var h = isNaN(this.h) ? 0 : (this.h + 120) * deg2rad,
7703                 l = +this.l,
7704                 a = isNaN(this.s) ? 0 : this.s * l * (1 - l),
7705                 cosh = Math.cos(h),
7706                 sinh = Math.sin(h);
7707             return new Rgb(
7708               255 * (l + a * (A * cosh + B * sinh)),
7709               255 * (l + a * (C * cosh + D * sinh)),
7710               255 * (l + a * (E * cosh)),
7711               this.opacity
7712             );
7713           }
7714         }));
7715
7716         function basis(t1, v0, v1, v2, v3) {
7717           var t2 = t1 * t1, t3 = t2 * t1;
7718           return ((1 - 3 * t1 + 3 * t2 - t3) * v0
7719               + (4 - 6 * t2 + 3 * t3) * v1
7720               + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2
7721               + t3 * v3) / 6;
7722         }
7723
7724         function basis$1(values) {
7725           var n = values.length - 1;
7726           return function(t) {
7727             var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n),
7728                 v1 = values[i],
7729                 v2 = values[i + 1],
7730                 v0 = i > 0 ? values[i - 1] : 2 * v1 - v2,
7731                 v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1;
7732             return basis((t - i / n) * n, v0, v1, v2, v3);
7733           };
7734         }
7735
7736         function basisClosed(values) {
7737           var n = values.length;
7738           return function(t) {
7739             var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n),
7740                 v0 = values[(i + n - 1) % n],
7741                 v1 = values[i % n],
7742                 v2 = values[(i + 1) % n],
7743                 v3 = values[(i + 2) % n];
7744             return basis((t - i / n) * n, v0, v1, v2, v3);
7745           };
7746         }
7747
7748         function constant$3(x) {
7749           return function() {
7750             return x;
7751           };
7752         }
7753
7754         function linear(a, d) {
7755           return function(t) {
7756             return a + t * d;
7757           };
7758         }
7759
7760         function exponential(a, b, y) {
7761           return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) {
7762             return Math.pow(a + t * b, y);
7763           };
7764         }
7765
7766         function hue(a, b) {
7767           var d = b - a;
7768           return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant$3(isNaN(a) ? b : a);
7769         }
7770
7771         function gamma(y) {
7772           return (y = +y) === 1 ? nogamma : function(a, b) {
7773             return b - a ? exponential(a, b, y) : constant$3(isNaN(a) ? b : a);
7774           };
7775         }
7776
7777         function nogamma(a, b) {
7778           var d = b - a;
7779           return d ? linear(a, d) : constant$3(isNaN(a) ? b : a);
7780         }
7781
7782         var d3_interpolateRgb = (function rgbGamma(y) {
7783           var color = gamma(y);
7784
7785           function rgb$1(start, end) {
7786             var r = color((start = rgb(start)).r, (end = rgb(end)).r),
7787                 g = color(start.g, end.g),
7788                 b = color(start.b, end.b),
7789                 opacity = nogamma(start.opacity, end.opacity);
7790             return function(t) {
7791               start.r = r(t);
7792               start.g = g(t);
7793               start.b = b(t);
7794               start.opacity = opacity(t);
7795               return start + "";
7796             };
7797           }
7798
7799           rgb$1.gamma = rgbGamma;
7800
7801           return rgb$1;
7802         })(1);
7803
7804         function rgbSpline(spline) {
7805           return function(colors) {
7806             var n = colors.length,
7807                 r = new Array(n),
7808                 g = new Array(n),
7809                 b = new Array(n),
7810                 i, color;
7811             for (i = 0; i < n; ++i) {
7812               color = rgb(colors[i]);
7813               r[i] = color.r || 0;
7814               g[i] = color.g || 0;
7815               b[i] = color.b || 0;
7816             }
7817             r = spline(r);
7818             g = spline(g);
7819             b = spline(b);
7820             color.opacity = 1;
7821             return function(t) {
7822               color.r = r(t);
7823               color.g = g(t);
7824               color.b = b(t);
7825               return color + "";
7826             };
7827           };
7828         }
7829
7830         var rgbBasis = rgbSpline(basis$1);
7831         var rgbBasisClosed = rgbSpline(basisClosed);
7832
7833         function array$2(a, b) {
7834           var nb = b ? b.length : 0,
7835               na = a ? Math.min(nb, a.length) : 0,
7836               x = new Array(na),
7837               c = new Array(nb),
7838               i;
7839
7840           for (i = 0; i < na; ++i) x[i] = d3_interpolate(a[i], b[i]);
7841           for (; i < nb; ++i) c[i] = b[i];
7842
7843           return function(t) {
7844             for (i = 0; i < na; ++i) c[i] = x[i](t);
7845             return c;
7846           };
7847         }
7848
7849         function date(a, b) {
7850           var d = new Date;
7851           return a = +a, b -= a, function(t) {
7852             return d.setTime(a + b * t), d;
7853           };
7854         }
7855
7856         function d3_interpolateNumber(a, b) {
7857           return a = +a, b -= a, function(t) {
7858             return a + b * t;
7859           };
7860         }
7861
7862         function object(a, b) {
7863           var i = {},
7864               c = {},
7865               k;
7866
7867           if (a === null || typeof a !== "object") a = {};
7868           if (b === null || typeof b !== "object") b = {};
7869
7870           for (k in b) {
7871             if (k in a) {
7872               i[k] = d3_interpolate(a[k], b[k]);
7873             } else {
7874               c[k] = b[k];
7875             }
7876           }
7877
7878           return function(t) {
7879             for (k in i) c[k] = i[k](t);
7880             return c;
7881           };
7882         }
7883
7884         var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,
7885             reB = new RegExp(reA.source, "g");
7886
7887         function zero(b) {
7888           return function() {
7889             return b;
7890           };
7891         }
7892
7893         function one(b) {
7894           return function(t) {
7895             return b(t) + "";
7896           };
7897         }
7898
7899         function interpolateString(a, b) {
7900           var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b
7901               am, // current match in a
7902               bm, // current match in b
7903               bs, // string preceding current number in b, if any
7904               i = -1, // index in s
7905               s = [], // string constants and placeholders
7906               q = []; // number interpolators
7907
7908           // Coerce inputs to strings.
7909           a = a + "", b = b + "";
7910
7911           // Interpolate pairs of numbers in a & b.
7912           while ((am = reA.exec(a))
7913               && (bm = reB.exec(b))) {
7914             if ((bs = bm.index) > bi) { // a string precedes the next number in b
7915               bs = b.slice(bi, bs);
7916               if (s[i]) s[i] += bs; // coalesce with previous string
7917               else s[++i] = bs;
7918             }
7919             if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match
7920               if (s[i]) s[i] += bm; // coalesce with previous string
7921               else s[++i] = bm;
7922             } else { // interpolate non-matching numbers
7923               s[++i] = null;
7924               q.push({i: i, x: d3_interpolateNumber(am, bm)});
7925             }
7926             bi = reB.lastIndex;
7927           }
7928
7929           // Add remains of b.
7930           if (bi < b.length) {
7931             bs = b.slice(bi);
7932             if (s[i]) s[i] += bs; // coalesce with previous string
7933             else s[++i] = bs;
7934           }
7935
7936           // Special optimization for only a single match.
7937           // Otherwise, interpolate each of the numbers and rejoin the string.
7938           return s.length < 2 ? (q[0]
7939               ? one(q[0].x)
7940               : zero(b))
7941               : (b = q.length, function(t) {
7942                   for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
7943                   return s.join("");
7944                 });
7945         }
7946
7947         function d3_interpolate(a, b) {
7948           var t = typeof b, c;
7949           return b == null || t === "boolean" ? constant$3(b)
7950               : (t === "number" ? d3_interpolateNumber
7951               : t === "string" ? ((c = color(b)) ? (b = c, d3_interpolateRgb) : interpolateString)
7952               : b instanceof color ? d3_interpolateRgb
7953               : b instanceof Date ? date
7954               : Array.isArray(b) ? array$2
7955               : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object
7956               : d3_interpolateNumber)(a, b);
7957         }
7958
7959         function discrete(range) {
7960           var n = range.length;
7961           return function(t) {
7962             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
7963           };
7964         }
7965
7966         function hue$1(a, b) {
7967           var i = hue(+a, +b);
7968           return function(t) {
7969             var x = i(t);
7970             return x - 360 * Math.floor(x / 360);
7971           };
7972         }
7973
7974         function interpolateRound(a, b) {
7975           return a = +a, b -= a, function(t) {
7976             return Math.round(a + b * t);
7977           };
7978         }
7979
7980         var degrees = 180 / Math.PI;
7981
7982         var identity$2 = {
7983           translateX: 0,
7984           translateY: 0,
7985           rotate: 0,
7986           skewX: 0,
7987           scaleX: 1,
7988           scaleY: 1
7989         };
7990
7991         function decompose(a, b, c, d, e, f) {
7992           var scaleX, scaleY, skewX;
7993           if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX;
7994           if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX;
7995           if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY;
7996           if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX;
7997           return {
7998             translateX: e,
7999             translateY: f,
8000             rotate: Math.atan2(b, a) * degrees,
8001             skewX: Math.atan(skewX) * degrees,
8002             scaleX: scaleX,
8003             scaleY: scaleY
8004           };
8005         }
8006
8007         var cssNode,
8008             cssRoot,
8009             cssView,
8010             svgNode;
8011
8012         function parseCss(value) {
8013           if (value === "none") return identity$2;
8014           if (!cssNode) cssNode = document.createElement("DIV"), cssRoot = document.documentElement, cssView = document.defaultView;
8015           cssNode.style.transform = value;
8016           value = cssView.getComputedStyle(cssRoot.appendChild(cssNode), null).getPropertyValue("transform");
8017           cssRoot.removeChild(cssNode);
8018           value = value.slice(7, -1).split(",");
8019           return decompose(+value[0], +value[1], +value[2], +value[3], +value[4], +value[5]);
8020         }
8021
8022         function parseSvg(value) {
8023           if (value == null) return identity$2;
8024           if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g");
8025           svgNode.setAttribute("transform", value);
8026           if (!(value = svgNode.transform.baseVal.consolidate())) return identity$2;
8027           value = value.matrix;
8028           return decompose(value.a, value.b, value.c, value.d, value.e, value.f);
8029         }
8030
8031         function interpolateTransform(parse, pxComma, pxParen, degParen) {
8032
8033           function pop(s) {
8034             return s.length ? s.pop() + " " : "";
8035           }
8036
8037           function translate(xa, ya, xb, yb, s, q) {
8038             if (xa !== xb || ya !== yb) {
8039               var i = s.push("translate(", null, pxComma, null, pxParen);
8040               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8041             } else if (xb || yb) {
8042               s.push("translate(" + xb + pxComma + yb + pxParen);
8043             }
8044           }
8045
8046           function rotate(a, b, s, q) {
8047             if (a !== b) {
8048               if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path
8049               q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8050             } else if (b) {
8051               s.push(pop(s) + "rotate(" + b + degParen);
8052             }
8053           }
8054
8055           function skewX(a, b, s, q) {
8056             if (a !== b) {
8057               q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: d3_interpolateNumber(a, b)});
8058             } else if (b) {
8059               s.push(pop(s) + "skewX(" + b + degParen);
8060             }
8061           }
8062
8063           function scale(xa, ya, xb, yb, s, q) {
8064             if (xa !== xb || ya !== yb) {
8065               var i = s.push(pop(s) + "scale(", null, ",", null, ")");
8066               q.push({i: i - 4, x: d3_interpolateNumber(xa, xb)}, {i: i - 2, x: d3_interpolateNumber(ya, yb)});
8067             } else if (xb !== 1 || yb !== 1) {
8068               s.push(pop(s) + "scale(" + xb + "," + yb + ")");
8069             }
8070           }
8071
8072           return function(a, b) {
8073             var s = [], // string constants and placeholders
8074                 q = []; // number interpolators
8075             a = parse(a), b = parse(b);
8076             translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q);
8077             rotate(a.rotate, b.rotate, s, q);
8078             skewX(a.skewX, b.skewX, s, q);
8079             scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q);
8080             a = b = null; // gc
8081             return function(t) {
8082               var i = -1, n = q.length, o;
8083               while (++i < n) s[(o = q[i]).i] = o.x(t);
8084               return s.join("");
8085             };
8086           };
8087         }
8088
8089         var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)");
8090         var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")");
8091
8092         var rho = Math.SQRT2,
8093             rho2 = 2,
8094             rho4 = 4,
8095             epsilon2 = 1e-12;
8096
8097         function cosh(x) {
8098           return ((x = Math.exp(x)) + 1 / x) / 2;
8099         }
8100
8101         function sinh(x) {
8102           return ((x = Math.exp(x)) - 1 / x) / 2;
8103         }
8104
8105         function tanh(x) {
8106           return ((x = Math.exp(2 * x)) - 1) / (x + 1);
8107         }
8108
8109         // p0 = [ux0, uy0, w0]
8110         // p1 = [ux1, uy1, w1]
8111         function interpolateZoom(p0, p1) {
8112           var ux0 = p0[0], uy0 = p0[1], w0 = p0[2],
8113               ux1 = p1[0], uy1 = p1[1], w1 = p1[2],
8114               dx = ux1 - ux0,
8115               dy = uy1 - uy0,
8116               d2 = dx * dx + dy * dy,
8117               i,
8118               S;
8119
8120           // Special case for u0 ≅ u1.
8121           if (d2 < epsilon2) {
8122             S = Math.log(w1 / w0) / rho;
8123             i = function(t) {
8124               return [
8125                 ux0 + t * dx,
8126                 uy0 + t * dy,
8127                 w0 * Math.exp(rho * t * S)
8128               ];
8129             };
8130           }
8131
8132           // General case.
8133           else {
8134             var d1 = Math.sqrt(d2),
8135                 b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1),
8136                 b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1),
8137                 r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0),
8138                 r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);
8139             S = (r1 - r0) / rho;
8140             i = function(t) {
8141               var s = t * S,
8142                   coshr0 = cosh(r0),
8143                   u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0));
8144               return [
8145                 ux0 + u * dx,
8146                 uy0 + u * dy,
8147                 w0 * coshr0 / cosh(rho * s + r0)
8148               ];
8149             };
8150           }
8151
8152           i.duration = S * 1000;
8153
8154           return i;
8155         }
8156
8157         function hsl$1(hue) {
8158           return function(start, end) {
8159             var h = hue((start = hsl(start)).h, (end = hsl(end)).h),
8160                 s = nogamma(start.s, end.s),
8161                 l = nogamma(start.l, end.l),
8162                 opacity = nogamma(start.opacity, end.opacity);
8163             return function(t) {
8164               start.h = h(t);
8165               start.s = s(t);
8166               start.l = l(t);
8167               start.opacity = opacity(t);
8168               return start + "";
8169             };
8170           }
8171         }
8172
8173         var hsl$2 = hsl$1(hue);
8174         var hslLong = hsl$1(nogamma);
8175
8176         function lab$1(start, end) {
8177           var l = nogamma((start = lab(start)).l, (end = lab(end)).l),
8178               a = nogamma(start.a, end.a),
8179               b = nogamma(start.b, end.b),
8180               opacity = nogamma(start.opacity, end.opacity);
8181           return function(t) {
8182             start.l = l(t);
8183             start.a = a(t);
8184             start.b = b(t);
8185             start.opacity = opacity(t);
8186             return start + "";
8187           };
8188         }
8189
8190         function hcl$1(hue) {
8191           return function(start, end) {
8192             var h = hue((start = hcl(start)).h, (end = hcl(end)).h),
8193                 c = nogamma(start.c, end.c),
8194                 l = nogamma(start.l, end.l),
8195                 opacity = nogamma(start.opacity, end.opacity);
8196             return function(t) {
8197               start.h = h(t);
8198               start.c = c(t);
8199               start.l = l(t);
8200               start.opacity = opacity(t);
8201               return start + "";
8202             };
8203           }
8204         }
8205
8206         var hcl$2 = hcl$1(hue);
8207         var hclLong = hcl$1(nogamma);
8208
8209         function cubehelix$1(hue) {
8210           return (function cubehelixGamma(y) {
8211             y = +y;
8212
8213             function cubehelix$1(start, end) {
8214               var h = hue((start = cubehelix(start)).h, (end = cubehelix(end)).h),
8215                   s = nogamma(start.s, end.s),
8216                   l = nogamma(start.l, end.l),
8217                   opacity = nogamma(start.opacity, end.opacity);
8218               return function(t) {
8219                 start.h = h(t);
8220                 start.s = s(t);
8221                 start.l = l(Math.pow(t, y));
8222                 start.opacity = opacity(t);
8223                 return start + "";
8224               };
8225             }
8226
8227             cubehelix$1.gamma = cubehelixGamma;
8228
8229             return cubehelix$1;
8230           })(1);
8231         }
8232
8233         var cubehelix$2 = cubehelix$1(hue);
8234         var cubehelixLong = cubehelix$1(nogamma);
8235
8236         function piecewise(interpolate, values) {
8237           var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n);
8238           while (i < n) I[i] = interpolate(v, v = values[++i]);
8239           return function(t) {
8240             var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n)));
8241             return I[i](t - i);
8242           };
8243         }
8244
8245         function d3_quantize(interpolator, n) {
8246           var samples = new Array(n);
8247           for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1));
8248           return samples;
8249         }
8250
8251         var frame = 0, // is an animation frame pending?
8252             timeout = 0, // is a timeout pending?
8253             interval = 0, // are any timers active?
8254             pokeDelay = 1000, // how frequently we check for clock skew
8255             taskHead,
8256             taskTail,
8257             clockLast = 0,
8258             clockNow = 0,
8259             clockSkew = 0,
8260             clock = typeof performance === "object" && performance.now ? performance : Date,
8261             setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); };
8262
8263         function now() {
8264           return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew);
8265         }
8266
8267         function clearNow() {
8268           clockNow = 0;
8269         }
8270
8271         function Timer() {
8272           this._call =
8273           this._time =
8274           this._next = null;
8275         }
8276
8277         Timer.prototype = timer.prototype = {
8278           constructor: Timer,
8279           restart: function(callback, delay, time) {
8280             if (typeof callback !== "function") throw new TypeError("callback is not a function");
8281             time = (time == null ? now() : +time) + (delay == null ? 0 : +delay);
8282             if (!this._next && taskTail !== this) {
8283               if (taskTail) taskTail._next = this;
8284               else taskHead = this;
8285               taskTail = this;
8286             }
8287             this._call = callback;
8288             this._time = time;
8289             sleep();
8290           },
8291           stop: function() {
8292             if (this._call) {
8293               this._call = null;
8294               this._time = Infinity;
8295               sleep();
8296             }
8297           }
8298         };
8299
8300         function timer(callback, delay, time) {
8301           var t = new Timer;
8302           t.restart(callback, delay, time);
8303           return t;
8304         }
8305
8306         function timerFlush() {
8307           now(); // Get the current time, if not already set.
8308           ++frame; // Pretend we’ve set an alarm, if we haven’t already.
8309           var t = taskHead, e;
8310           while (t) {
8311             if ((e = clockNow - t._time) >= 0) t._call.call(null, e);
8312             t = t._next;
8313           }
8314           --frame;
8315         }
8316
8317         function wake() {
8318           clockNow = (clockLast = clock.now()) + clockSkew;
8319           frame = timeout = 0;
8320           try {
8321             timerFlush();
8322           } finally {
8323             frame = 0;
8324             nap();
8325             clockNow = 0;
8326           }
8327         }
8328
8329         function poke() {
8330           var now = clock.now(), delay = now - clockLast;
8331           if (delay > pokeDelay) clockSkew -= delay, clockLast = now;
8332         }
8333
8334         function nap() {
8335           var t0, t1 = taskHead, t2, time = Infinity;
8336           while (t1) {
8337             if (t1._call) {
8338               if (time > t1._time) time = t1._time;
8339               t0 = t1, t1 = t1._next;
8340             } else {
8341               t2 = t1._next, t1._next = null;
8342               t1 = t0 ? t0._next = t2 : taskHead = t2;
8343             }
8344           }
8345           taskTail = t0;
8346           sleep(time);
8347         }
8348
8349         function sleep(time) {
8350           if (frame) return; // Soonest alarm already set, or will be.
8351           if (timeout) timeout = clearTimeout(timeout);
8352           var delay = time - clockNow; // Strictly less than if we recomputed clockNow.
8353           if (delay > 24) {
8354             if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew);
8355             if (interval) interval = clearInterval(interval);
8356           } else {
8357             if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay);
8358             frame = 1, setFrame(wake);
8359           }
8360         }
8361
8362         function d3_timeout(callback, delay, time) {
8363           var t = new Timer;
8364           delay = delay == null ? 0 : +delay;
8365           t.restart(function(elapsed) {
8366             t.stop();
8367             callback(elapsed + delay);
8368           }, delay, time);
8369           return t;
8370         }
8371
8372         function interval$1(callback, delay, time) {
8373           var t = new Timer, total = delay;
8374           if (delay == null) return t.restart(callback, delay, time), t;
8375           delay = +delay, time = time == null ? now() : +time;
8376           t.restart(function tick(elapsed) {
8377             elapsed += total;
8378             t.restart(tick, total += delay, time);
8379             callback(elapsed);
8380           }, delay, time);
8381           return t;
8382         }
8383
8384         var emptyOn = dispatch("start", "end", "cancel", "interrupt");
8385         var emptyTween = [];
8386
8387         var CREATED = 0;
8388         var SCHEDULED = 1;
8389         var STARTING = 2;
8390         var STARTED = 3;
8391         var RUNNING = 4;
8392         var ENDING = 5;
8393         var ENDED = 6;
8394
8395         function schedule(node, name, id, index, group, timing) {
8396           var schedules = node.__transition;
8397           if (!schedules) node.__transition = {};
8398           else if (id in schedules) return;
8399           create$6(node, id, {
8400             name: name,
8401             index: index, // For context during callback.
8402             group: group, // For context during callback.
8403             on: emptyOn,
8404             tween: emptyTween,
8405             time: timing.time,
8406             delay: timing.delay,
8407             duration: timing.duration,
8408             ease: timing.ease,
8409             timer: null,
8410             state: CREATED
8411           });
8412         }
8413
8414         function init(node, id) {
8415           var schedule = get$2(node, id);
8416           if (schedule.state > CREATED) throw new Error("too late; already scheduled");
8417           return schedule;
8418         }
8419
8420         function set$1(node, id) {
8421           var schedule = get$2(node, id);
8422           if (schedule.state > STARTED) throw new Error("too late; already running");
8423           return schedule;
8424         }
8425
8426         function get$2(node, id) {
8427           var schedule = node.__transition;
8428           if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found");
8429           return schedule;
8430         }
8431
8432         function create$6(node, id, self) {
8433           var schedules = node.__transition,
8434               tween;
8435
8436           // Initialize the self timer when the transition is created.
8437           // Note the actual delay is not known until the first callback!
8438           schedules[id] = self;
8439           self.timer = timer(schedule, 0, self.time);
8440
8441           function schedule(elapsed) {
8442             self.state = SCHEDULED;
8443             self.timer.restart(start, self.delay, self.time);
8444
8445             // If the elapsed delay is less than our first sleep, start immediately.
8446             if (self.delay <= elapsed) start(elapsed - self.delay);
8447           }
8448
8449           function start(elapsed) {
8450             var i, j, n, o;
8451
8452             // If the state is not SCHEDULED, then we previously errored on start.
8453             if (self.state !== SCHEDULED) return stop();
8454
8455             for (i in schedules) {
8456               o = schedules[i];
8457               if (o.name !== self.name) continue;
8458
8459               // While this element already has a starting transition during this frame,
8460               // defer starting an interrupting transition until that transition has a
8461               // chance to tick (and possibly end); see d3/d3-transition#54!
8462               if (o.state === STARTED) return d3_timeout(start);
8463
8464               // Interrupt the active transition, if any.
8465               if (o.state === RUNNING) {
8466                 o.state = ENDED;
8467                 o.timer.stop();
8468                 o.on.call("interrupt", node, node.__data__, o.index, o.group);
8469                 delete schedules[i];
8470               }
8471
8472               // Cancel any pre-empted transitions.
8473               else if (+i < id) {
8474                 o.state = ENDED;
8475                 o.timer.stop();
8476                 o.on.call("cancel", node, node.__data__, o.index, o.group);
8477                 delete schedules[i];
8478               }
8479             }
8480
8481             // Defer the first tick to end of the current frame; see d3/d3#1576.
8482             // Note the transition may be canceled after start and before the first tick!
8483             // Note this must be scheduled before the start event; see d3/d3-transition#16!
8484             // Assuming this is successful, subsequent callbacks go straight to tick.
8485             d3_timeout(function() {
8486               if (self.state === STARTED) {
8487                 self.state = RUNNING;
8488                 self.timer.restart(tick, self.delay, self.time);
8489                 tick(elapsed);
8490               }
8491             });
8492
8493             // Dispatch the start event.
8494             // Note this must be done before the tween are initialized.
8495             self.state = STARTING;
8496             self.on.call("start", node, node.__data__, self.index, self.group);
8497             if (self.state !== STARTING) return; // interrupted
8498             self.state = STARTED;
8499
8500             // Initialize the tween, deleting null tween.
8501             tween = new Array(n = self.tween.length);
8502             for (i = 0, j = -1; i < n; ++i) {
8503               if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) {
8504                 tween[++j] = o;
8505               }
8506             }
8507             tween.length = j + 1;
8508           }
8509
8510           function tick(elapsed) {
8511             var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1),
8512                 i = -1,
8513                 n = tween.length;
8514
8515             while (++i < n) {
8516               tween[i].call(node, t);
8517             }
8518
8519             // Dispatch the end event.
8520             if (self.state === ENDING) {
8521               self.on.call("end", node, node.__data__, self.index, self.group);
8522               stop();
8523             }
8524           }
8525
8526           function stop() {
8527             self.state = ENDED;
8528             self.timer.stop();
8529             delete schedules[id];
8530             for (var i in schedules) return; // eslint-disable-line no-unused-vars
8531             delete node.__transition;
8532           }
8533         }
8534
8535         function interrupt(node, name) {
8536           var schedules = node.__transition,
8537               schedule,
8538               active,
8539               empty = true,
8540               i;
8541
8542           if (!schedules) return;
8543
8544           name = name == null ? null : name + "";
8545
8546           for (i in schedules) {
8547             if ((schedule = schedules[i]).name !== name) { empty = false; continue; }
8548             active = schedule.state > STARTING && schedule.state < ENDING;
8549             schedule.state = ENDED;
8550             schedule.timer.stop();
8551             schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group);
8552             delete schedules[i];
8553           }
8554
8555           if (empty) delete node.__transition;
8556         }
8557
8558         function selection_interrupt(name) {
8559           return this.each(function() {
8560             interrupt(this, name);
8561           });
8562         }
8563
8564         function tweenRemove(id, name) {
8565           var tween0, tween1;
8566           return function() {
8567             var schedule = set$1(this, id),
8568                 tween = schedule.tween;
8569
8570             // If this node shared tween with the previous node,
8571             // just assign the updated shared tween and we’re done!
8572             // Otherwise, copy-on-write.
8573             if (tween !== tween0) {
8574               tween1 = tween0 = tween;
8575               for (var i = 0, n = tween1.length; i < n; ++i) {
8576                 if (tween1[i].name === name) {
8577                   tween1 = tween1.slice();
8578                   tween1.splice(i, 1);
8579                   break;
8580                 }
8581               }
8582             }
8583
8584             schedule.tween = tween1;
8585           };
8586         }
8587
8588         function tweenFunction(id, name, value) {
8589           var tween0, tween1;
8590           if (typeof value !== "function") throw new Error;
8591           return function() {
8592             var schedule = set$1(this, id),
8593                 tween = schedule.tween;
8594
8595             // If this node shared tween with the previous node,
8596             // just assign the updated shared tween and we’re done!
8597             // Otherwise, copy-on-write.
8598             if (tween !== tween0) {
8599               tween1 = (tween0 = tween).slice();
8600               for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) {
8601                 if (tween1[i].name === name) {
8602                   tween1[i] = t;
8603                   break;
8604                 }
8605               }
8606               if (i === n) tween1.push(t);
8607             }
8608
8609             schedule.tween = tween1;
8610           };
8611         }
8612
8613         function transition_tween(name, value) {
8614           var id = this._id;
8615
8616           name += "";
8617
8618           if (arguments.length < 2) {
8619             var tween = get$2(this.node(), id).tween;
8620             for (var i = 0, n = tween.length, t; i < n; ++i) {
8621               if ((t = tween[i]).name === name) {
8622                 return t.value;
8623               }
8624             }
8625             return null;
8626           }
8627
8628           return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value));
8629         }
8630
8631         function tweenValue(transition, name, value) {
8632           var id = transition._id;
8633
8634           transition.each(function() {
8635             var schedule = set$1(this, id);
8636             (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments);
8637           });
8638
8639           return function(node) {
8640             return get$2(node, id).value[name];
8641           };
8642         }
8643
8644         function interpolate(a, b) {
8645           var c;
8646           return (typeof b === "number" ? d3_interpolateNumber
8647               : b instanceof color ? d3_interpolateRgb
8648               : (c = color(b)) ? (b = c, d3_interpolateRgb)
8649               : interpolateString)(a, b);
8650         }
8651
8652         function attrRemove$1(name) {
8653           return function() {
8654             this.removeAttribute(name);
8655           };
8656         }
8657
8658         function attrRemoveNS$1(fullname) {
8659           return function() {
8660             this.removeAttributeNS(fullname.space, fullname.local);
8661           };
8662         }
8663
8664         function attrConstant$1(name, interpolate, value1) {
8665           var string00,
8666               string1 = value1 + "",
8667               interpolate0;
8668           return function() {
8669             var string0 = this.getAttribute(name);
8670             return string0 === string1 ? null
8671                 : string0 === string00 ? interpolate0
8672                 : interpolate0 = interpolate(string00 = string0, value1);
8673           };
8674         }
8675
8676         function attrConstantNS$1(fullname, interpolate, value1) {
8677           var string00,
8678               string1 = value1 + "",
8679               interpolate0;
8680           return function() {
8681             var string0 = this.getAttributeNS(fullname.space, fullname.local);
8682             return string0 === string1 ? null
8683                 : string0 === string00 ? interpolate0
8684                 : interpolate0 = interpolate(string00 = string0, value1);
8685           };
8686         }
8687
8688         function attrFunction$1(name, interpolate, value) {
8689           var string00,
8690               string10,
8691               interpolate0;
8692           return function() {
8693             var string0, value1 = value(this), string1;
8694             if (value1 == null) return void this.removeAttribute(name);
8695             string0 = this.getAttribute(name);
8696             string1 = value1 + "";
8697             return string0 === string1 ? null
8698                 : string0 === string00 && string1 === string10 ? interpolate0
8699                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8700           };
8701         }
8702
8703         function attrFunctionNS$1(fullname, interpolate, value) {
8704           var string00,
8705               string10,
8706               interpolate0;
8707           return function() {
8708             var string0, value1 = value(this), string1;
8709             if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local);
8710             string0 = this.getAttributeNS(fullname.space, fullname.local);
8711             string1 = value1 + "";
8712             return string0 === string1 ? null
8713                 : string0 === string00 && string1 === string10 ? interpolate0
8714                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8715           };
8716         }
8717
8718         function transition_attr(name, value) {
8719           var fullname = namespace(name), i = fullname === "transform" ? interpolateTransformSvg : interpolate;
8720           return this.attrTween(name, typeof value === "function"
8721               ? (fullname.local ? attrFunctionNS$1 : attrFunction$1)(fullname, i, tweenValue(this, "attr." + name, value))
8722               : value == null ? (fullname.local ? attrRemoveNS$1 : attrRemove$1)(fullname)
8723               : (fullname.local ? attrConstantNS$1 : attrConstant$1)(fullname, i, value));
8724         }
8725
8726         function attrInterpolate(name, i) {
8727           return function(t) {
8728             this.setAttribute(name, i(t));
8729           };
8730         }
8731
8732         function attrInterpolateNS(fullname, i) {
8733           return function(t) {
8734             this.setAttributeNS(fullname.space, fullname.local, i(t));
8735           };
8736         }
8737
8738         function attrTweenNS(fullname, value) {
8739           var t0, i0;
8740           function tween() {
8741             var i = value.apply(this, arguments);
8742             if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i);
8743             return t0;
8744           }
8745           tween._value = value;
8746           return tween;
8747         }
8748
8749         function attrTween(name, value) {
8750           var t0, i0;
8751           function tween() {
8752             var i = value.apply(this, arguments);
8753             if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i);
8754             return t0;
8755           }
8756           tween._value = value;
8757           return tween;
8758         }
8759
8760         function transition_attrTween(name, value) {
8761           var key = "attr." + name;
8762           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
8763           if (value == null) return this.tween(key, null);
8764           if (typeof value !== "function") throw new Error;
8765           var fullname = namespace(name);
8766           return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value));
8767         }
8768
8769         function delayFunction(id, value) {
8770           return function() {
8771             init(this, id).delay = +value.apply(this, arguments);
8772           };
8773         }
8774
8775         function delayConstant(id, value) {
8776           return value = +value, function() {
8777             init(this, id).delay = value;
8778           };
8779         }
8780
8781         function transition_delay(value) {
8782           var id = this._id;
8783
8784           return arguments.length
8785               ? this.each((typeof value === "function"
8786                   ? delayFunction
8787                   : delayConstant)(id, value))
8788               : get$2(this.node(), id).delay;
8789         }
8790
8791         function durationFunction(id, value) {
8792           return function() {
8793             set$1(this, id).duration = +value.apply(this, arguments);
8794           };
8795         }
8796
8797         function durationConstant(id, value) {
8798           return value = +value, function() {
8799             set$1(this, id).duration = value;
8800           };
8801         }
8802
8803         function transition_duration(value) {
8804           var id = this._id;
8805
8806           return arguments.length
8807               ? this.each((typeof value === "function"
8808                   ? durationFunction
8809                   : durationConstant)(id, value))
8810               : get$2(this.node(), id).duration;
8811         }
8812
8813         function easeConstant(id, value) {
8814           if (typeof value !== "function") throw new Error;
8815           return function() {
8816             set$1(this, id).ease = value;
8817           };
8818         }
8819
8820         function transition_ease(value) {
8821           var id = this._id;
8822
8823           return arguments.length
8824               ? this.each(easeConstant(id, value))
8825               : get$2(this.node(), id).ease;
8826         }
8827
8828         function transition_filter(match) {
8829           if (typeof match !== "function") match = matcher(match);
8830
8831           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8832             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {
8833               if ((node = group[i]) && match.call(node, node.__data__, i, group)) {
8834                 subgroup.push(node);
8835               }
8836             }
8837           }
8838
8839           return new Transition(subgroups, this._parents, this._name, this._id);
8840         }
8841
8842         function transition_merge(transition) {
8843           if (transition._id !== this._id) throw new Error;
8844
8845           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) {
8846             for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {
8847               if (node = group0[i] || group1[i]) {
8848                 merge[i] = node;
8849               }
8850             }
8851           }
8852
8853           for (; j < m0; ++j) {
8854             merges[j] = groups0[j];
8855           }
8856
8857           return new Transition(merges, this._parents, this._name, this._id);
8858         }
8859
8860         function start(name) {
8861           return (name + "").trim().split(/^|\s+/).every(function(t) {
8862             var i = t.indexOf(".");
8863             if (i >= 0) t = t.slice(0, i);
8864             return !t || t === "start";
8865           });
8866         }
8867
8868         function onFunction(id, name, listener) {
8869           var on0, on1, sit = start(name) ? init : set$1;
8870           return function() {
8871             var schedule = sit(this, id),
8872                 on = schedule.on;
8873
8874             // If this node shared a dispatch with the previous node,
8875             // just assign the updated shared dispatch and we’re done!
8876             // Otherwise, copy-on-write.
8877             if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener);
8878
8879             schedule.on = on1;
8880           };
8881         }
8882
8883         function transition_on(name, listener) {
8884           var id = this._id;
8885
8886           return arguments.length < 2
8887               ? get$2(this.node(), id).on.on(name)
8888               : this.each(onFunction(id, name, listener));
8889         }
8890
8891         function removeFunction(id) {
8892           return function() {
8893             var parent = this.parentNode;
8894             for (var i in this.__transition) if (+i !== id) return;
8895             if (parent) parent.removeChild(this);
8896           };
8897         }
8898
8899         function transition_remove() {
8900           return this.on("end.remove", removeFunction(this._id));
8901         }
8902
8903         function transition_select(select) {
8904           var name = this._name,
8905               id = this._id;
8906
8907           if (typeof select !== "function") select = selector(select);
8908
8909           for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {
8910             for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {
8911               if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {
8912                 if ("__data__" in node) subnode.__data__ = node.__data__;
8913                 subgroup[i] = subnode;
8914                 schedule(subgroup[i], name, id, i, subgroup, get$2(node, id));
8915               }
8916             }
8917           }
8918
8919           return new Transition(subgroups, this._parents, name, id);
8920         }
8921
8922         function transition_selectAll(select) {
8923           var name = this._name,
8924               id = this._id;
8925
8926           if (typeof select !== "function") select = selectorAll(select);
8927
8928           for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {
8929             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
8930               if (node = group[i]) {
8931                 for (var children = select.call(node, node.__data__, i, group), child, inherit = get$2(node, id), k = 0, l = children.length; k < l; ++k) {
8932                   if (child = children[k]) {
8933                     schedule(child, name, id, k, children, inherit);
8934                   }
8935                 }
8936                 subgroups.push(children);
8937                 parents.push(node);
8938               }
8939             }
8940           }
8941
8942           return new Transition(subgroups, parents, name, id);
8943         }
8944
8945         var Selection$1 = selection.prototype.constructor;
8946
8947         function transition_selection() {
8948           return new Selection$1(this._groups, this._parents);
8949         }
8950
8951         function styleNull(name, interpolate) {
8952           var string00,
8953               string10,
8954               interpolate0;
8955           return function() {
8956             var string0 = styleValue(this, name),
8957                 string1 = (this.style.removeProperty(name), styleValue(this, name));
8958             return string0 === string1 ? null
8959                 : string0 === string00 && string1 === string10 ? interpolate0
8960                 : interpolate0 = interpolate(string00 = string0, string10 = string1);
8961           };
8962         }
8963
8964         function styleRemove$1(name) {
8965           return function() {
8966             this.style.removeProperty(name);
8967           };
8968         }
8969
8970         function styleConstant$1(name, interpolate, value1) {
8971           var string00,
8972               string1 = value1 + "",
8973               interpolate0;
8974           return function() {
8975             var string0 = styleValue(this, name);
8976             return string0 === string1 ? null
8977                 : string0 === string00 ? interpolate0
8978                 : interpolate0 = interpolate(string00 = string0, value1);
8979           };
8980         }
8981
8982         function styleFunction$1(name, interpolate, value) {
8983           var string00,
8984               string10,
8985               interpolate0;
8986           return function() {
8987             var string0 = styleValue(this, name),
8988                 value1 = value(this),
8989                 string1 = value1 + "";
8990             if (value1 == null) string1 = value1 = (this.style.removeProperty(name), styleValue(this, name));
8991             return string0 === string1 ? null
8992                 : string0 === string00 && string1 === string10 ? interpolate0
8993                 : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1));
8994           };
8995         }
8996
8997         function styleMaybeRemove(id, name) {
8998           var on0, on1, listener0, key = "style." + name, event = "end." + key, remove;
8999           return function() {
9000             var schedule = set$1(this, id),
9001                 on = schedule.on,
9002                 listener = schedule.value[key] == null ? remove || (remove = styleRemove$1(name)) : undefined;
9003
9004             // If this node shared a dispatch with the previous node,
9005             // just assign the updated shared dispatch and we’re done!
9006             // Otherwise, copy-on-write.
9007             if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener);
9008
9009             schedule.on = on1;
9010           };
9011         }
9012
9013         function transition_style(name, value, priority) {
9014           var i = (name += "") === "transform" ? interpolateTransformCss : interpolate;
9015           return value == null ? this
9016               .styleTween(name, styleNull(name, i))
9017               .on("end.style." + name, styleRemove$1(name))
9018             : typeof value === "function" ? this
9019               .styleTween(name, styleFunction$1(name, i, tweenValue(this, "style." + name, value)))
9020               .each(styleMaybeRemove(this._id, name))
9021             : this
9022               .styleTween(name, styleConstant$1(name, i, value), priority)
9023               .on("end.style." + name, null);
9024         }
9025
9026         function styleInterpolate(name, i, priority) {
9027           return function(t) {
9028             this.style.setProperty(name, i(t), priority);
9029           };
9030         }
9031
9032         function styleTween(name, value, priority) {
9033           var t, i0;
9034           function tween() {
9035             var i = value.apply(this, arguments);
9036             if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority);
9037             return t;
9038           }
9039           tween._value = value;
9040           return tween;
9041         }
9042
9043         function transition_styleTween(name, value, priority) {
9044           var key = "style." + (name += "");
9045           if (arguments.length < 2) return (key = this.tween(key)) && key._value;
9046           if (value == null) return this.tween(key, null);
9047           if (typeof value !== "function") throw new Error;
9048           return this.tween(key, styleTween(name, value, priority == null ? "" : priority));
9049         }
9050
9051         function textConstant$1(value) {
9052           return function() {
9053             this.textContent = value;
9054           };
9055         }
9056
9057         function textFunction$1(value) {
9058           return function() {
9059             var value1 = value(this);
9060             this.textContent = value1 == null ? "" : value1;
9061           };
9062         }
9063
9064         function transition_text(value) {
9065           return this.tween("text", typeof value === "function"
9066               ? textFunction$1(tweenValue(this, "text", value))
9067               : textConstant$1(value == null ? "" : value + ""));
9068         }
9069
9070         function transition_transition() {
9071           var name = this._name,
9072               id0 = this._id,
9073               id1 = newId();
9074
9075           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9076             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9077               if (node = group[i]) {
9078                 var inherit = get$2(node, id0);
9079                 schedule(node, name, id1, i, group, {
9080                   time: inherit.time + inherit.delay + inherit.duration,
9081                   delay: 0,
9082                   duration: inherit.duration,
9083                   ease: inherit.ease
9084                 });
9085               }
9086             }
9087           }
9088
9089           return new Transition(groups, this._parents, name, id1);
9090         }
9091
9092         function transition_end() {
9093           var on0, on1, that = this, id = that._id, size = that.size();
9094           return new Promise(function(resolve, reject) {
9095             var cancel = {value: reject},
9096                 end = {value: function() { if (--size === 0) resolve(); }};
9097
9098             that.each(function() {
9099               var schedule = set$1(this, id),
9100                   on = schedule.on;
9101
9102               // If this node shared a dispatch with the previous node,
9103               // just assign the updated shared dispatch and we’re done!
9104               // Otherwise, copy-on-write.
9105               if (on !== on0) {
9106                 on1 = (on0 = on).copy();
9107                 on1._.cancel.push(cancel);
9108                 on1._.interrupt.push(cancel);
9109                 on1._.end.push(end);
9110               }
9111
9112               schedule.on = on1;
9113             });
9114           });
9115         }
9116
9117         var id$4 = 0;
9118
9119         function Transition(groups, parents, name, id) {
9120           this._groups = groups;
9121           this._parents = parents;
9122           this._name = name;
9123           this._id = id;
9124         }
9125
9126         function transition(name) {
9127           return selection().transition(name);
9128         }
9129
9130         function newId() {
9131           return ++id$4;
9132         }
9133
9134         var selection_prototype = selection.prototype;
9135
9136         Transition.prototype = transition.prototype = {
9137           constructor: Transition,
9138           select: transition_select,
9139           selectAll: transition_selectAll,
9140           filter: transition_filter,
9141           merge: transition_merge,
9142           selection: transition_selection,
9143           transition: transition_transition,
9144           call: selection_prototype.call,
9145           nodes: selection_prototype.nodes,
9146           node: selection_prototype.node,
9147           size: selection_prototype.size,
9148           empty: selection_prototype.empty,
9149           each: selection_prototype.each,
9150           on: transition_on,
9151           attr: transition_attr,
9152           attrTween: transition_attrTween,
9153           style: transition_style,
9154           styleTween: transition_styleTween,
9155           text: transition_text,
9156           remove: transition_remove,
9157           tween: transition_tween,
9158           delay: transition_delay,
9159           duration: transition_duration,
9160           ease: transition_ease,
9161           end: transition_end
9162         };
9163
9164         function linear$1(t) {
9165           return +t;
9166         }
9167
9168         function quadIn(t) {
9169           return t * t;
9170         }
9171
9172         function quadOut(t) {
9173           return t * (2 - t);
9174         }
9175
9176         function quadInOut(t) {
9177           return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2;
9178         }
9179
9180         function cubicIn(t) {
9181           return t * t * t;
9182         }
9183
9184         function cubicOut(t) {
9185           return --t * t * t + 1;
9186         }
9187
9188         function cubicInOut(t) {
9189           return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2;
9190         }
9191
9192         var exponent = 3;
9193
9194         var polyIn = (function custom(e) {
9195           e = +e;
9196
9197           function polyIn(t) {
9198             return Math.pow(t, e);
9199           }
9200
9201           polyIn.exponent = custom;
9202
9203           return polyIn;
9204         })(exponent);
9205
9206         var polyOut = (function custom(e) {
9207           e = +e;
9208
9209           function polyOut(t) {
9210             return 1 - Math.pow(1 - t, e);
9211           }
9212
9213           polyOut.exponent = custom;
9214
9215           return polyOut;
9216         })(exponent);
9217
9218         var polyInOut = (function custom(e) {
9219           e = +e;
9220
9221           function polyInOut(t) {
9222             return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2;
9223           }
9224
9225           polyInOut.exponent = custom;
9226
9227           return polyInOut;
9228         })(exponent);
9229
9230         var pi = Math.PI,
9231             halfPi = pi / 2;
9232
9233         function sinIn(t) {
9234           return 1 - Math.cos(t * halfPi);
9235         }
9236
9237         function sinOut(t) {
9238           return Math.sin(t * halfPi);
9239         }
9240
9241         function sinInOut(t) {
9242           return (1 - Math.cos(pi * t)) / 2;
9243         }
9244
9245         function expIn(t) {
9246           return Math.pow(2, 10 * t - 10);
9247         }
9248
9249         function expOut(t) {
9250           return 1 - Math.pow(2, -10 * t);
9251         }
9252
9253         function expInOut(t) {
9254           return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2;
9255         }
9256
9257         function circleIn(t) {
9258           return 1 - Math.sqrt(1 - t * t);
9259         }
9260
9261         function circleOut(t) {
9262           return Math.sqrt(1 - --t * t);
9263         }
9264
9265         function circleInOut(t) {
9266           return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2;
9267         }
9268
9269         var b1 = 4 / 11,
9270             b2 = 6 / 11,
9271             b3 = 8 / 11,
9272             b4 = 3 / 4,
9273             b5 = 9 / 11,
9274             b6 = 10 / 11,
9275             b7 = 15 / 16,
9276             b8 = 21 / 22,
9277             b9 = 63 / 64,
9278             b0 = 1 / b1 / b1;
9279
9280         function bounceIn(t) {
9281           return 1 - bounceOut(1 - t);
9282         }
9283
9284         function bounceOut(t) {
9285           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;
9286         }
9287
9288         function bounceInOut(t) {
9289           return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2;
9290         }
9291
9292         var overshoot = 1.70158;
9293
9294         var backIn = (function custom(s) {
9295           s = +s;
9296
9297           function backIn(t) {
9298             return t * t * ((s + 1) * t - s);
9299           }
9300
9301           backIn.overshoot = custom;
9302
9303           return backIn;
9304         })(overshoot);
9305
9306         var backOut = (function custom(s) {
9307           s = +s;
9308
9309           function backOut(t) {
9310             return --t * t * ((s + 1) * t + s) + 1;
9311           }
9312
9313           backOut.overshoot = custom;
9314
9315           return backOut;
9316         })(overshoot);
9317
9318         var backInOut = (function custom(s) {
9319           s = +s;
9320
9321           function backInOut(t) {
9322             return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2;
9323           }
9324
9325           backInOut.overshoot = custom;
9326
9327           return backInOut;
9328         })(overshoot);
9329
9330         var tau = 2 * Math.PI,
9331             amplitude = 1,
9332             period = 0.3;
9333
9334         var elasticIn = (function custom(a, p) {
9335           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9336
9337           function elasticIn(t) {
9338             return a * Math.pow(2, 10 * --t) * Math.sin((s - t) / p);
9339           }
9340
9341           elasticIn.amplitude = function(a) { return custom(a, p * tau); };
9342           elasticIn.period = function(p) { return custom(a, p); };
9343
9344           return elasticIn;
9345         })(amplitude, period);
9346
9347         var elasticOut = (function custom(a, p) {
9348           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9349
9350           function elasticOut(t) {
9351             return 1 - a * Math.pow(2, -10 * (t = +t)) * Math.sin((t + s) / p);
9352           }
9353
9354           elasticOut.amplitude = function(a) { return custom(a, p * tau); };
9355           elasticOut.period = function(p) { return custom(a, p); };
9356
9357           return elasticOut;
9358         })(amplitude, period);
9359
9360         var elasticInOut = (function custom(a, p) {
9361           var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau);
9362
9363           function elasticInOut(t) {
9364             return ((t = t * 2 - 1) < 0
9365                 ? a * Math.pow(2, 10 * t) * Math.sin((s - t) / p)
9366                 : 2 - a * Math.pow(2, -10 * t) * Math.sin((s + t) / p)) / 2;
9367           }
9368
9369           elasticInOut.amplitude = function(a) { return custom(a, p * tau); };
9370           elasticInOut.period = function(p) { return custom(a, p); };
9371
9372           return elasticInOut;
9373         })(amplitude, period);
9374
9375         var defaultTiming = {
9376           time: null, // Set on use.
9377           delay: 0,
9378           duration: 250,
9379           ease: cubicInOut
9380         };
9381
9382         function inherit(node, id) {
9383           var timing;
9384           while (!(timing = node.__transition) || !(timing = timing[id])) {
9385             if (!(node = node.parentNode)) {
9386               return defaultTiming.time = now(), defaultTiming;
9387             }
9388           }
9389           return timing;
9390         }
9391
9392         function selection_transition(name) {
9393           var id,
9394               timing;
9395
9396           if (name instanceof Transition) {
9397             id = name._id, name = name._name;
9398           } else {
9399             id = newId(), (timing = defaultTiming).time = now(), name = name == null ? null : name + "";
9400           }
9401
9402           for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) {
9403             for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {
9404               if (node = group[i]) {
9405                 schedule(node, name, id, i, group, timing || inherit(node, id));
9406               }
9407             }
9408           }
9409
9410           return new Transition(groups, this._parents, name, id);
9411         }
9412
9413         selection.prototype.interrupt = selection_interrupt;
9414         selection.prototype.transition = selection_transition;
9415
9416         var root$2 = [null];
9417
9418         function active(node, name) {
9419           var schedules = node.__transition,
9420               schedule,
9421               i;
9422
9423           if (schedules) {
9424             name = name == null ? null : name + "";
9425             for (i in schedules) {
9426               if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) {
9427                 return new Transition([[node]], root$2, name, +i);
9428               }
9429             }
9430           }
9431
9432           return null;
9433         }
9434
9435         function constant$4(x) {
9436           return function() {
9437             return x;
9438           };
9439         }
9440
9441         function BrushEvent(target, type, selection) {
9442           this.target = target;
9443           this.type = type;
9444           this.selection = selection;
9445         }
9446
9447         function nopropagation$1() {
9448           event.stopImmediatePropagation();
9449         }
9450
9451         function noevent$1() {
9452           event.preventDefault();
9453           event.stopImmediatePropagation();
9454         }
9455
9456         var MODE_DRAG = {name: "drag"},
9457             MODE_SPACE = {name: "space"},
9458             MODE_HANDLE = {name: "handle"},
9459             MODE_CENTER = {name: "center"};
9460
9461         var X = {
9462           name: "x",
9463           handles: ["e", "w"].map(type),
9464           input: function(x, e) { return x && [[x[0], e[0][1]], [x[1], e[1][1]]]; },
9465           output: function(xy) { return xy && [xy[0][0], xy[1][0]]; }
9466         };
9467
9468         var Y = {
9469           name: "y",
9470           handles: ["n", "s"].map(type),
9471           input: function(y, e) { return y && [[e[0][0], y[0]], [e[1][0], y[1]]]; },
9472           output: function(xy) { return xy && [xy[0][1], xy[1][1]]; }
9473         };
9474
9475         var XY = {
9476           name: "xy",
9477           handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(type),
9478           input: function(xy) { return xy; },
9479           output: function(xy) { return xy; }
9480         };
9481
9482         var cursors = {
9483           overlay: "crosshair",
9484           selection: "move",
9485           n: "ns-resize",
9486           e: "ew-resize",
9487           s: "ns-resize",
9488           w: "ew-resize",
9489           nw: "nwse-resize",
9490           ne: "nesw-resize",
9491           se: "nwse-resize",
9492           sw: "nesw-resize"
9493         };
9494
9495         var flipX = {
9496           e: "w",
9497           w: "e",
9498           nw: "ne",
9499           ne: "nw",
9500           se: "sw",
9501           sw: "se"
9502         };
9503
9504         var flipY = {
9505           n: "s",
9506           s: "n",
9507           nw: "sw",
9508           ne: "se",
9509           se: "ne",
9510           sw: "nw"
9511         };
9512
9513         var signsX = {
9514           overlay: +1,
9515           selection: +1,
9516           n: null,
9517           e: +1,
9518           s: null,
9519           w: -1,
9520           nw: -1,
9521           ne: +1,
9522           se: +1,
9523           sw: -1
9524         };
9525
9526         var signsY = {
9527           overlay: +1,
9528           selection: +1,
9529           n: -1,
9530           e: null,
9531           s: +1,
9532           w: null,
9533           nw: -1,
9534           ne: -1,
9535           se: +1,
9536           sw: +1
9537         };
9538
9539         function type(t) {
9540           return {type: t};
9541         }
9542
9543         // Ignore right-click, since that should open the context menu.
9544         function defaultFilter$1() {
9545           return !event.button;
9546         }
9547
9548         function defaultExtent() {
9549           var svg = this.ownerSVGElement || this;
9550           return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]];
9551         }
9552
9553         // Like d3.local, but with the name “__brush” rather than auto-generated.
9554         function local$1(node) {
9555           while (!node.__brush) if (!(node = node.parentNode)) return;
9556           return node.__brush;
9557         }
9558
9559         function empty$1(extent) {
9560           return extent[0][0] === extent[1][0]
9561               || extent[0][1] === extent[1][1];
9562         }
9563
9564         function brushSelection(node) {
9565           var state = node.__brush;
9566           return state ? state.dim.output(state.selection) : null;
9567         }
9568
9569         function brushX() {
9570           return brush$1(X);
9571         }
9572
9573         function brushY() {
9574           return brush$1(Y);
9575         }
9576
9577         function brush() {
9578           return brush$1(XY);
9579         }
9580
9581         function brush$1(dim) {
9582           var extent = defaultExtent,
9583               filter = defaultFilter$1,
9584               listeners = dispatch(brush, "start", "brush", "end"),
9585               handleSize = 6,
9586               touchending;
9587
9588           function brush(group) {
9589             var overlay = group
9590                 .property("__brush", initialize)
9591               .selectAll(".overlay")
9592               .data([type("overlay")]);
9593
9594             overlay.enter().append("rect")
9595                 .attr("class", "overlay")
9596                 .attr("pointer-events", "all")
9597                 .attr("cursor", cursors.overlay)
9598               .merge(overlay)
9599                 .each(function() {
9600                   var extent = local$1(this).extent;
9601                   d3_select(this)
9602                       .attr("x", extent[0][0])
9603                       .attr("y", extent[0][1])
9604                       .attr("width", extent[1][0] - extent[0][0])
9605                       .attr("height", extent[1][1] - extent[0][1]);
9606                 });
9607
9608             group.selectAll(".selection")
9609               .data([type("selection")])
9610               .enter().append("rect")
9611                 .attr("class", "selection")
9612                 .attr("cursor", cursors.selection)
9613                 .attr("fill", "#777")
9614                 .attr("fill-opacity", 0.3)
9615                 .attr("stroke", "#fff")
9616                 .attr("shape-rendering", "crispEdges");
9617
9618             var handle = group.selectAll(".handle")
9619               .data(dim.handles, function(d) { return d.type; });
9620
9621             handle.exit().remove();
9622
9623             handle.enter().append("rect")
9624                 .attr("class", function(d) { return "handle handle--" + d.type; })
9625                 .attr("cursor", function(d) { return cursors[d.type]; });
9626
9627             group
9628                 .each(redraw)
9629                 .attr("fill", "none")
9630                 .attr("pointer-events", "all")
9631                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)")
9632                 .on("mousedown.brush touchstart.brush", started);
9633           }
9634
9635           brush.move = function(group, selection) {
9636             if (group.selection) {
9637               group
9638                   .on("start.brush", function() { emitter(this, arguments).beforestart().start(); })
9639                   .on("interrupt.brush end.brush", function() { emitter(this, arguments).end(); })
9640                   .tween("brush", function() {
9641                     var that = this,
9642                         state = that.__brush,
9643                         emit = emitter(that, arguments),
9644                         selection0 = state.selection,
9645                         selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent),
9646                         i = d3_interpolate(selection0, selection1);
9647
9648                     function tween(t) {
9649                       state.selection = t === 1 && empty$1(selection1) ? null : i(t);
9650                       redraw.call(that);
9651                       emit.brush();
9652                     }
9653
9654                     return selection0 && selection1 ? tween : tween(1);
9655                   });
9656             } else {
9657               group
9658                   .each(function() {
9659                     var that = this,
9660                         args = arguments,
9661                         state = that.__brush,
9662                         selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent),
9663                         emit = emitter(that, args).beforestart();
9664
9665                     interrupt(that);
9666                     state.selection = selection1 == null || empty$1(selection1) ? null : selection1;
9667                     redraw.call(that);
9668                     emit.start().brush().end();
9669                   });
9670             }
9671           };
9672
9673           function redraw() {
9674             var group = d3_select(this),
9675                 selection = local$1(this).selection;
9676
9677             if (selection) {
9678               group.selectAll(".selection")
9679                   .style("display", null)
9680                   .attr("x", selection[0][0])
9681                   .attr("y", selection[0][1])
9682                   .attr("width", selection[1][0] - selection[0][0])
9683                   .attr("height", selection[1][1] - selection[0][1]);
9684
9685               group.selectAll(".handle")
9686                   .style("display", null)
9687                   .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; })
9688                   .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; })
9689                   .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; })
9690                   .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; });
9691             }
9692
9693             else {
9694               group.selectAll(".selection,.handle")
9695                   .style("display", "none")
9696                   .attr("x", null)
9697                   .attr("y", null)
9698                   .attr("width", null)
9699                   .attr("height", null);
9700             }
9701           }
9702
9703           function emitter(that, args) {
9704             return that.__brush.emitter || new Emitter(that, args);
9705           }
9706
9707           function Emitter(that, args) {
9708             this.that = that;
9709             this.args = args;
9710             this.state = that.__brush;
9711             this.active = 0;
9712           }
9713
9714           Emitter.prototype = {
9715             beforestart: function() {
9716               if (++this.active === 1) this.state.emitter = this, this.starting = true;
9717               return this;
9718             },
9719             start: function() {
9720               if (this.starting) this.starting = false, this.emit("start");
9721               return this;
9722             },
9723             brush: function() {
9724               this.emit("brush");
9725               return this;
9726             },
9727             end: function() {
9728               if (--this.active === 0) delete this.state.emitter, this.emit("end");
9729               return this;
9730             },
9731             emit: function(type) {
9732               customEvent(new BrushEvent(brush, type, dim.output(this.state.selection)), listeners.apply, listeners, [type, this.that, this.args]);
9733             }
9734           };
9735
9736           function started() {
9737             if (event.touches) { if (event.changedTouches.length < event.touches.length) return noevent$1(); }
9738             else if (touchending) return;
9739             if (!filter.apply(this, arguments)) return;
9740
9741             var that = this,
9742                 type = event.target.__data__.type,
9743                 mode = (event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (event.altKey ? MODE_CENTER : MODE_HANDLE),
9744                 signX = dim === Y ? null : signsX[type],
9745                 signY = dim === X ? null : signsY[type],
9746                 state = local$1(that),
9747                 extent = state.extent,
9748                 selection = state.selection,
9749                 W = extent[0][0], w0, w1,
9750                 N = extent[0][1], n0, n1,
9751                 E = extent[1][0], e0, e1,
9752                 S = extent[1][1], s0, s1,
9753                 dx,
9754                 dy,
9755                 moving,
9756                 shifting = signX && signY && event.shiftKey,
9757                 lockX,
9758                 lockY,
9759                 point0 = d3_mouse(that),
9760                 point = point0,
9761                 emit = emitter(that, arguments).beforestart();
9762
9763             if (type === "overlay") {
9764               state.selection = selection = [
9765                 [w0 = dim === Y ? W : point0[0], n0 = dim === X ? N : point0[1]],
9766                 [e0 = dim === Y ? E : w0, s0 = dim === X ? S : n0]
9767               ];
9768             } else {
9769               w0 = selection[0][0];
9770               n0 = selection[0][1];
9771               e0 = selection[1][0];
9772               s0 = selection[1][1];
9773             }
9774
9775             w1 = w0;
9776             n1 = n0;
9777             e1 = e0;
9778             s1 = s0;
9779
9780             var group = d3_select(that)
9781                 .attr("pointer-events", "none");
9782
9783             var overlay = group.selectAll(".overlay")
9784                 .attr("cursor", cursors[type]);
9785
9786             if (event.touches) {
9787               group
9788                   .on("touchmove.brush", moved, true)
9789                   .on("touchend.brush touchcancel.brush", ended, true);
9790             } else {
9791               var view = d3_select(event.view)
9792                   .on("keydown.brush", keydowned, true)
9793                   .on("keyup.brush", keyupped, true)
9794                   .on("mousemove.brush", moved, true)
9795                   .on("mouseup.brush", ended, true);
9796
9797               dragDisable(event.view);
9798             }
9799
9800             nopropagation$1();
9801             interrupt(that);
9802             redraw.call(that);
9803             emit.start();
9804
9805             function moved() {
9806               var point1 = d3_mouse(that);
9807               if (shifting && !lockX && !lockY) {
9808                 if (Math.abs(point1[0] - point[0]) > Math.abs(point1[1] - point[1])) lockY = true;
9809                 else lockX = true;
9810               }
9811               point = point1;
9812               moving = true;
9813               noevent$1();
9814               move();
9815             }
9816
9817             function move() {
9818               var t;
9819
9820               dx = point[0] - point0[0];
9821               dy = point[1] - point0[1];
9822
9823               switch (mode) {
9824                 case MODE_SPACE:
9825                 case MODE_DRAG: {
9826                   if (signX) dx = Math.max(W - w0, Math.min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx;
9827                   if (signY) dy = Math.max(N - n0, Math.min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy;
9828                   break;
9829                 }
9830                 case MODE_HANDLE: {
9831                   if (signX < 0) dx = Math.max(W - w0, Math.min(E - w0, dx)), w1 = w0 + dx, e1 = e0;
9832                   else if (signX > 0) dx = Math.max(W - e0, Math.min(E - e0, dx)), w1 = w0, e1 = e0 + dx;
9833                   if (signY < 0) dy = Math.max(N - n0, Math.min(S - n0, dy)), n1 = n0 + dy, s1 = s0;
9834                   else if (signY > 0) dy = Math.max(N - s0, Math.min(S - s0, dy)), n1 = n0, s1 = s0 + dy;
9835                   break;
9836                 }
9837                 case MODE_CENTER: {
9838                   if (signX) w1 = Math.max(W, Math.min(E, w0 - dx * signX)), e1 = Math.max(W, Math.min(E, e0 + dx * signX));
9839                   if (signY) n1 = Math.max(N, Math.min(S, n0 - dy * signY)), s1 = Math.max(N, Math.min(S, s0 + dy * signY));
9840                   break;
9841                 }
9842               }
9843
9844               if (e1 < w1) {
9845                 signX *= -1;
9846                 t = w0, w0 = e0, e0 = t;
9847                 t = w1, w1 = e1, e1 = t;
9848                 if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]);
9849               }
9850
9851               if (s1 < n1) {
9852                 signY *= -1;
9853                 t = n0, n0 = s0, s0 = t;
9854                 t = n1, n1 = s1, s1 = t;
9855                 if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]);
9856               }
9857
9858               if (state.selection) selection = state.selection; // May be set by brush.move!
9859               if (lockX) w1 = selection[0][0], e1 = selection[1][0];
9860               if (lockY) n1 = selection[0][1], s1 = selection[1][1];
9861
9862               if (selection[0][0] !== w1
9863                   || selection[0][1] !== n1
9864                   || selection[1][0] !== e1
9865                   || selection[1][1] !== s1) {
9866                 state.selection = [[w1, n1], [e1, s1]];
9867                 redraw.call(that);
9868                 emit.brush();
9869               }
9870             }
9871
9872             function ended() {
9873               nopropagation$1();
9874               if (event.touches) {
9875                 if (event.touches.length) return;
9876                 if (touchending) clearTimeout(touchending);
9877                 touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed!
9878                 group.on("touchmove.brush touchend.brush touchcancel.brush", null);
9879               } else {
9880                 yesdrag(event.view, moving);
9881                 view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null);
9882               }
9883               group.attr("pointer-events", "all");
9884               overlay.attr("cursor", cursors.overlay);
9885               if (state.selection) selection = state.selection; // May be set by brush.move (on start)!
9886               if (empty$1(selection)) state.selection = null, redraw.call(that);
9887               emit.end();
9888             }
9889
9890             function keydowned() {
9891               switch (event.keyCode) {
9892                 case 16: { // SHIFT
9893                   shifting = signX && signY;
9894                   break;
9895                 }
9896                 case 18: { // ALT
9897                   if (mode === MODE_HANDLE) {
9898                     if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9899                     if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9900                     mode = MODE_CENTER;
9901                     move();
9902                   }
9903                   break;
9904                 }
9905                 case 32: { // SPACE; takes priority over ALT
9906                   if (mode === MODE_HANDLE || mode === MODE_CENTER) {
9907                     if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx;
9908                     if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy;
9909                     mode = MODE_SPACE;
9910                     overlay.attr("cursor", cursors.selection);
9911                     move();
9912                   }
9913                   break;
9914                 }
9915                 default: return;
9916               }
9917               noevent$1();
9918             }
9919
9920             function keyupped() {
9921               switch (event.keyCode) {
9922                 case 16: { // SHIFT
9923                   if (shifting) {
9924                     lockX = lockY = shifting = false;
9925                     move();
9926                   }
9927                   break;
9928                 }
9929                 case 18: { // ALT
9930                   if (mode === MODE_CENTER) {
9931                     if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9932                     if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9933                     mode = MODE_HANDLE;
9934                     move();
9935                   }
9936                   break;
9937                 }
9938                 case 32: { // SPACE
9939                   if (mode === MODE_SPACE) {
9940                     if (event.altKey) {
9941                       if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX;
9942                       if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY;
9943                       mode = MODE_CENTER;
9944                     } else {
9945                       if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1;
9946                       if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1;
9947                       mode = MODE_HANDLE;
9948                     }
9949                     overlay.attr("cursor", cursors[type]);
9950                     move();
9951                   }
9952                   break;
9953                 }
9954                 default: return;
9955               }
9956               noevent$1();
9957             }
9958           }
9959
9960           function initialize() {
9961             var state = this.__brush || {selection: null};
9962             state.extent = extent.apply(this, arguments);
9963             state.dim = dim;
9964             return state;
9965           }
9966
9967           brush.extent = function(_) {
9968             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$4([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), brush) : extent;
9969           };
9970
9971           brush.filter = function(_) {
9972             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$4(!!_), brush) : filter;
9973           };
9974
9975           brush.handleSize = function(_) {
9976             return arguments.length ? (handleSize = +_, brush) : handleSize;
9977           };
9978
9979           brush.on = function() {
9980             var value = listeners.on.apply(listeners, arguments);
9981             return value === listeners ? brush : value;
9982           };
9983
9984           return brush;
9985         }
9986
9987         var cos = Math.cos;
9988         var sin = Math.sin;
9989         var pi$1 = Math.PI;
9990         var halfPi$1 = pi$1 / 2;
9991         var tau$1 = pi$1 * 2;
9992         var max$3 = Math.max;
9993
9994         function compareValue(compare) {
9995           return function(a, b) {
9996             return compare(
9997               a.source.value + a.target.value,
9998               b.source.value + b.target.value
9999             );
10000           };
10001         }
10002
10003         function chord() {
10004           var padAngle = 0,
10005               sortGroups = null,
10006               sortSubgroups = null,
10007               sortChords = null;
10008
10009           function chord(matrix) {
10010             var n = matrix.length,
10011                 groupSums = [],
10012                 groupIndex = d3_range(n),
10013                 subgroupIndex = [],
10014                 chords = [],
10015                 groups = chords.groups = new Array(n),
10016                 subgroups = new Array(n * n),
10017                 k,
10018                 x,
10019                 x0,
10020                 dx,
10021                 i,
10022                 j;
10023
10024             // Compute the sum.
10025             k = 0, i = -1; while (++i < n) {
10026               x = 0, j = -1; while (++j < n) {
10027                 x += matrix[i][j];
10028               }
10029               groupSums.push(x);
10030               subgroupIndex.push(d3_range(n));
10031               k += x;
10032             }
10033
10034             // Sort groups…
10035             if (sortGroups) groupIndex.sort(function(a, b) {
10036               return sortGroups(groupSums[a], groupSums[b]);
10037             });
10038
10039             // Sort subgroups…
10040             if (sortSubgroups) subgroupIndex.forEach(function(d, i) {
10041               d.sort(function(a, b) {
10042                 return sortSubgroups(matrix[i][a], matrix[i][b]);
10043               });
10044             });
10045
10046             // Convert the sum to scaling factor for [0, 2pi].
10047             // TODO Allow start and end angle to be specified?
10048             // TODO Allow padding to be specified as percentage?
10049             k = max$3(0, tau$1 - padAngle * n) / k;
10050             dx = k ? padAngle : tau$1 / n;
10051
10052             // Compute the start and end angle for each group and subgroup.
10053             // Note: Opera has a bug reordering object literal properties!
10054             x = 0, i = -1; while (++i < n) {
10055               x0 = x, j = -1; while (++j < n) {
10056                 var di = groupIndex[i],
10057                     dj = subgroupIndex[di][j],
10058                     v = matrix[di][dj],
10059                     a0 = x,
10060                     a1 = x += v * k;
10061                 subgroups[dj * n + di] = {
10062                   index: di,
10063                   subindex: dj,
10064                   startAngle: a0,
10065                   endAngle: a1,
10066                   value: v
10067                 };
10068               }
10069               groups[di] = {
10070                 index: di,
10071                 startAngle: x0,
10072                 endAngle: x,
10073                 value: groupSums[di]
10074               };
10075               x += dx;
10076             }
10077
10078             // Generate chords for each (non-empty) subgroup-subgroup link.
10079             i = -1; while (++i < n) {
10080               j = i - 1; while (++j < n) {
10081                 var source = subgroups[j * n + i],
10082                     target = subgroups[i * n + j];
10083                 if (source.value || target.value) {
10084                   chords.push(source.value < target.value
10085                       ? {source: target, target: source}
10086                       : {source: source, target: target});
10087                 }
10088               }
10089             }
10090
10091             return sortChords ? chords.sort(sortChords) : chords;
10092           }
10093
10094           chord.padAngle = function(_) {
10095             return arguments.length ? (padAngle = max$3(0, _), chord) : padAngle;
10096           };
10097
10098           chord.sortGroups = function(_) {
10099             return arguments.length ? (sortGroups = _, chord) : sortGroups;
10100           };
10101
10102           chord.sortSubgroups = function(_) {
10103             return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups;
10104           };
10105
10106           chord.sortChords = function(_) {
10107             return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._;
10108           };
10109
10110           return chord;
10111         }
10112
10113         var slice$6 = Array.prototype.slice;
10114
10115         function constant$5(x) {
10116           return function() {
10117             return x;
10118           };
10119         }
10120
10121         var pi$2 = Math.PI,
10122             tau$2 = 2 * pi$2,
10123             epsilon$1 = 1e-6,
10124             tauEpsilon = tau$2 - epsilon$1;
10125
10126         function Path() {
10127           this._x0 = this._y0 = // start of current subpath
10128           this._x1 = this._y1 = null; // end of current subpath
10129           this._ = "";
10130         }
10131
10132         function path() {
10133           return new Path;
10134         }
10135
10136         Path.prototype = path.prototype = {
10137           constructor: Path,
10138           moveTo: function(x, y) {
10139             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y);
10140           },
10141           closePath: function() {
10142             if (this._x1 !== null) {
10143               this._x1 = this._x0, this._y1 = this._y0;
10144               this._ += "Z";
10145             }
10146           },
10147           lineTo: function(x, y) {
10148             this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y);
10149           },
10150           quadraticCurveTo: function(x1, y1, x, y) {
10151             this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10152           },
10153           bezierCurveTo: function(x1, y1, x2, y2, x, y) {
10154             this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y);
10155           },
10156           arcTo: function(x1, y1, x2, y2, r) {
10157             x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;
10158             var x0 = this._x1,
10159                 y0 = this._y1,
10160                 x21 = x2 - x1,
10161                 y21 = y2 - y1,
10162                 x01 = x0 - x1,
10163                 y01 = y0 - y1,
10164                 l01_2 = x01 * x01 + y01 * y01;
10165
10166             // Is the radius negative? Error.
10167             if (r < 0) throw new Error("negative radius: " + r);
10168
10169             // Is this path empty? Move to (x1,y1).
10170             if (this._x1 === null) {
10171               this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1);
10172             }
10173
10174             // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.
10175             else if (!(l01_2 > epsilon$1));
10176
10177             // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?
10178             // Equivalently, is (x1,y1) coincident with (x2,y2)?
10179             // Or, is the radius zero? Line to (x1,y1).
10180             else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon$1) || !r) {
10181               this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1);
10182             }
10183
10184             // Otherwise, draw an arc!
10185             else {
10186               var x20 = x2 - x0,
10187                   y20 = y2 - y0,
10188                   l21_2 = x21 * x21 + y21 * y21,
10189                   l20_2 = x20 * x20 + y20 * y20,
10190                   l21 = Math.sqrt(l21_2),
10191                   l01 = Math.sqrt(l01_2),
10192                   l = r * Math.tan((pi$2 - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),
10193                   t01 = l / l01,
10194                   t21 = l / l21;
10195
10196               // If the start tangent is not coincident with (x0,y0), line to.
10197               if (Math.abs(t01 - 1) > epsilon$1) {
10198                 this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01);
10199               }
10200
10201               this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21);
10202             }
10203           },
10204           arc: function(x, y, r, a0, a1, ccw) {
10205             x = +x, y = +y, r = +r;
10206             var dx = r * Math.cos(a0),
10207                 dy = r * Math.sin(a0),
10208                 x0 = x + dx,
10209                 y0 = y + dy,
10210                 cw = 1 ^ ccw,
10211                 da = ccw ? a0 - a1 : a1 - a0;
10212
10213             // Is the radius negative? Error.
10214             if (r < 0) throw new Error("negative radius: " + r);
10215
10216             // Is this path empty? Move to (x0,y0).
10217             if (this._x1 === null) {
10218               this._ += "M" + x0 + "," + y0;
10219             }
10220
10221             // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).
10222             else if (Math.abs(this._x1 - x0) > epsilon$1 || Math.abs(this._y1 - y0) > epsilon$1) {
10223               this._ += "L" + x0 + "," + y0;
10224             }
10225
10226             // Is this arc empty? We’re done.
10227             if (!r) return;
10228
10229             // Does the angle go the wrong way? Flip the direction.
10230             if (da < 0) da = da % tau$2 + tau$2;
10231
10232             // Is this a complete circle? Draw two arcs to complete the circle.
10233             if (da > tauEpsilon) {
10234               this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0);
10235             }
10236
10237             // Is this arc non-empty? Draw an arc!
10238             else if (da > epsilon$1) {
10239               this._ += "A" + r + "," + r + ",0," + (+(da >= pi$2)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1));
10240             }
10241           },
10242           rect: function(x, y, w, h) {
10243             this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z";
10244           },
10245           toString: function() {
10246             return this._;
10247           }
10248         };
10249
10250         function defaultSource(d) {
10251           return d.source;
10252         }
10253
10254         function defaultTarget(d) {
10255           return d.target;
10256         }
10257
10258         function defaultRadius(d) {
10259           return d.radius;
10260         }
10261
10262         function defaultStartAngle(d) {
10263           return d.startAngle;
10264         }
10265
10266         function defaultEndAngle(d) {
10267           return d.endAngle;
10268         }
10269
10270         function ribbon() {
10271           var source = defaultSource,
10272               target = defaultTarget,
10273               radius = defaultRadius,
10274               startAngle = defaultStartAngle,
10275               endAngle = defaultEndAngle,
10276               context = null;
10277
10278           function ribbon() {
10279             var buffer,
10280                 argv = slice$6.call(arguments),
10281                 s = source.apply(this, argv),
10282                 t = target.apply(this, argv),
10283                 sr = +radius.apply(this, (argv[0] = s, argv)),
10284                 sa0 = startAngle.apply(this, argv) - halfPi$1,
10285                 sa1 = endAngle.apply(this, argv) - halfPi$1,
10286                 sx0 = sr * cos(sa0),
10287                 sy0 = sr * sin(sa0),
10288                 tr = +radius.apply(this, (argv[0] = t, argv)),
10289                 ta0 = startAngle.apply(this, argv) - halfPi$1,
10290                 ta1 = endAngle.apply(this, argv) - halfPi$1;
10291
10292             if (!context) context = buffer = path();
10293
10294             context.moveTo(sx0, sy0);
10295             context.arc(0, 0, sr, sa0, sa1);
10296             if (sa0 !== ta0 || sa1 !== ta1) { // TODO sr !== tr?
10297               context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0));
10298               context.arc(0, 0, tr, ta0, ta1);
10299             }
10300             context.quadraticCurveTo(0, 0, sx0, sy0);
10301             context.closePath();
10302
10303             if (buffer) return context = null, buffer + "" || null;
10304           }
10305
10306           ribbon.radius = function(_) {
10307             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$5(+_), ribbon) : radius;
10308           };
10309
10310           ribbon.startAngle = function(_) {
10311             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : startAngle;
10312           };
10313
10314           ribbon.endAngle = function(_) {
10315             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$5(+_), ribbon) : endAngle;
10316           };
10317
10318           ribbon.source = function(_) {
10319             return arguments.length ? (source = _, ribbon) : source;
10320           };
10321
10322           ribbon.target = function(_) {
10323             return arguments.length ? (target = _, ribbon) : target;
10324           };
10325
10326           ribbon.context = function(_) {
10327             return arguments.length ? ((context = _ == null ? null : _), ribbon) : context;
10328           };
10329
10330           return ribbon;
10331         }
10332
10333         var prefix = "$";
10334
10335         function Map$1() {}
10336
10337         Map$1.prototype = map$3.prototype = {
10338           constructor: Map$1,
10339           has: function(key) {
10340             return (prefix + key) in this;
10341           },
10342           get: function(key) {
10343             return this[prefix + key];
10344           },
10345           set: function(key, value) {
10346             this[prefix + key] = value;
10347             return this;
10348           },
10349           remove: function(key) {
10350             var property = prefix + key;
10351             return property in this && delete this[property];
10352           },
10353           clear: function() {
10354             for (var property in this) if (property[0] === prefix) delete this[property];
10355           },
10356           keys: function() {
10357             var keys = [];
10358             for (var property in this) if (property[0] === prefix) keys.push(property.slice(1));
10359             return keys;
10360           },
10361           values: function() {
10362             var values = [];
10363             for (var property in this) if (property[0] === prefix) values.push(this[property]);
10364             return values;
10365           },
10366           entries: function() {
10367             var entries = [];
10368             for (var property in this) if (property[0] === prefix) entries.push({key: property.slice(1), value: this[property]});
10369             return entries;
10370           },
10371           size: function() {
10372             var size = 0;
10373             for (var property in this) if (property[0] === prefix) ++size;
10374             return size;
10375           },
10376           empty: function() {
10377             for (var property in this) if (property[0] === prefix) return false;
10378             return true;
10379           },
10380           each: function(f) {
10381             for (var property in this) if (property[0] === prefix) f(this[property], property.slice(1), this);
10382           }
10383         };
10384
10385         function map$3(object, f) {
10386           var map = new Map$1;
10387
10388           // Copy constructor.
10389           if (object instanceof Map$1) object.each(function(value, key) { map.set(key, value); });
10390
10391           // Index array by numeric index or specified key function.
10392           else if (Array.isArray(object)) {
10393             var i = -1,
10394                 n = object.length,
10395                 o;
10396
10397             if (f == null) while (++i < n) map.set(i, object[i]);
10398             else while (++i < n) map.set(f(o = object[i], i, object), o);
10399           }
10400
10401           // Convert object to map.
10402           else if (object) for (var key in object) map.set(key, object[key]);
10403
10404           return map;
10405         }
10406
10407         function nest() {
10408           var keys = [],
10409               sortKeys = [],
10410               sortValues,
10411               rollup,
10412               nest;
10413
10414           function apply(array, depth, createResult, setResult) {
10415             if (depth >= keys.length) {
10416               if (sortValues != null) array.sort(sortValues);
10417               return rollup != null ? rollup(array) : array;
10418             }
10419
10420             var i = -1,
10421                 n = array.length,
10422                 key = keys[depth++],
10423                 keyValue,
10424                 value,
10425                 valuesByKey = map$3(),
10426                 values,
10427                 result = createResult();
10428
10429             while (++i < n) {
10430               if (values = valuesByKey.get(keyValue = key(value = array[i]) + "")) {
10431                 values.push(value);
10432               } else {
10433                 valuesByKey.set(keyValue, [value]);
10434               }
10435             }
10436
10437             valuesByKey.each(function(values, key) {
10438               setResult(result, key, apply(values, depth, createResult, setResult));
10439             });
10440
10441             return result;
10442           }
10443
10444           function entries(map, depth) {
10445             if (++depth > keys.length) return map;
10446             var array, sortKey = sortKeys[depth - 1];
10447             if (rollup != null && depth >= keys.length) array = map.entries();
10448             else array = [], map.each(function(v, k) { array.push({key: k, values: entries(v, depth)}); });
10449             return sortKey != null ? array.sort(function(a, b) { return sortKey(a.key, b.key); }) : array;
10450           }
10451
10452           return nest = {
10453             object: function(array) { return apply(array, 0, createObject, setObject); },
10454             map: function(array) { return apply(array, 0, createMap, setMap); },
10455             entries: function(array) { return entries(apply(array, 0, createMap, setMap), 0); },
10456             key: function(d) { keys.push(d); return nest; },
10457             sortKeys: function(order) { sortKeys[keys.length - 1] = order; return nest; },
10458             sortValues: function(order) { sortValues = order; return nest; },
10459             rollup: function(f) { rollup = f; return nest; }
10460           };
10461         }
10462
10463         function createObject() {
10464           return {};
10465         }
10466
10467         function setObject(object, key, value) {
10468           object[key] = value;
10469         }
10470
10471         function createMap() {
10472           return map$3();
10473         }
10474
10475         function setMap(map, key, value) {
10476           map.set(key, value);
10477         }
10478
10479         function Set$1() {}
10480
10481         var proto = map$3.prototype;
10482
10483         Set$1.prototype = set$2.prototype = {
10484           constructor: Set$1,
10485           has: proto.has,
10486           add: function(value) {
10487             value += "";
10488             this[prefix + value] = value;
10489             return this;
10490           },
10491           remove: proto.remove,
10492           clear: proto.clear,
10493           values: proto.keys,
10494           size: proto.size,
10495           empty: proto.empty,
10496           each: proto.each
10497         };
10498
10499         function set$2(object, f) {
10500           var set = new Set$1;
10501
10502           // Copy constructor.
10503           if (object instanceof Set$1) object.each(function(value) { set.add(value); });
10504
10505           // Otherwise, assume it’s an array.
10506           else if (object) {
10507             var i = -1, n = object.length;
10508             if (f == null) while (++i < n) set.add(object[i]);
10509             else while (++i < n) set.add(f(object[i], i, object));
10510           }
10511
10512           return set;
10513         }
10514
10515         function keys$3(map) {
10516           var keys = [];
10517           for (var key in map) keys.push(key);
10518           return keys;
10519         }
10520
10521         function values(map) {
10522           var values = [];
10523           for (var key in map) values.push(map[key]);
10524           return values;
10525         }
10526
10527         function entries(map) {
10528           var entries = [];
10529           for (var key in map) entries.push({key: key, value: map[key]});
10530           return entries;
10531         }
10532
10533         var array$3 = Array.prototype;
10534
10535         var slice$7 = array$3.slice;
10536
10537         function ascending$1(a, b) {
10538           return a - b;
10539         }
10540
10541         function area(ring) {
10542           var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1];
10543           while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1];
10544           return area;
10545         }
10546
10547         function constant$6(x) {
10548           return function() {
10549             return x;
10550           };
10551         }
10552
10553         function contains$1(ring, hole) {
10554           var i = -1, n = hole.length, c;
10555           while (++i < n) if (c = ringContains(ring, hole[i])) return c;
10556           return 0;
10557         }
10558
10559         function ringContains(ring, point) {
10560           var x = point[0], y = point[1], contains = -1;
10561           for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) {
10562             var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1];
10563             if (segmentContains(pi, pj, point)) return 0;
10564             if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains;
10565           }
10566           return contains;
10567         }
10568
10569         function segmentContains(a, b, c) {
10570           var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]);
10571         }
10572
10573         function collinear(a, b, c) {
10574           return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]);
10575         }
10576
10577         function within(p, q, r) {
10578           return p <= q && q <= r || r <= q && q <= p;
10579         }
10580
10581         function noop$3() {}
10582
10583         var cases = [
10584           [],
10585           [[[1.0, 1.5], [0.5, 1.0]]],
10586           [[[1.5, 1.0], [1.0, 1.5]]],
10587           [[[1.5, 1.0], [0.5, 1.0]]],
10588           [[[1.0, 0.5], [1.5, 1.0]]],
10589           [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]],
10590           [[[1.0, 0.5], [1.0, 1.5]]],
10591           [[[1.0, 0.5], [0.5, 1.0]]],
10592           [[[0.5, 1.0], [1.0, 0.5]]],
10593           [[[1.0, 1.5], [1.0, 0.5]]],
10594           [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]],
10595           [[[1.5, 1.0], [1.0, 0.5]]],
10596           [[[0.5, 1.0], [1.5, 1.0]]],
10597           [[[1.0, 1.5], [1.5, 1.0]]],
10598           [[[0.5, 1.0], [1.0, 1.5]]],
10599           []
10600         ];
10601
10602         function contours() {
10603           var dx = 1,
10604               dy = 1,
10605               threshold = thresholdSturges,
10606               smooth = smoothLinear;
10607
10608           function contours(values) {
10609             var tz = threshold(values);
10610
10611             // Convert number of thresholds into uniform thresholds.
10612             if (!Array.isArray(tz)) {
10613               var domain = extent(values), start = domain[0], stop = domain[1];
10614               tz = tickStep(start, stop, tz);
10615               tz = d3_range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz);
10616             } else {
10617               tz = tz.slice().sort(ascending$1);
10618             }
10619
10620             return tz.map(function(value) {
10621               return contour(values, value);
10622             });
10623           }
10624
10625           // Accumulate, smooth contour rings, assign holes to exterior rings.
10626           // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js
10627           function contour(values, value) {
10628             var polygons = [],
10629                 holes = [];
10630
10631             isorings(values, value, function(ring) {
10632               smooth(ring, values, value);
10633               if (area(ring) > 0) polygons.push([ring]);
10634               else holes.push(ring);
10635             });
10636
10637             holes.forEach(function(hole) {
10638               for (var i = 0, n = polygons.length, polygon; i < n; ++i) {
10639                 if (contains$1((polygon = polygons[i])[0], hole) !== -1) {
10640                   polygon.push(hole);
10641                   return;
10642                 }
10643               }
10644             });
10645
10646             return {
10647               type: "MultiPolygon",
10648               value: value,
10649               coordinates: polygons
10650             };
10651           }
10652
10653           // Marching squares with isolines stitched into rings.
10654           // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js
10655           function isorings(values, value, callback) {
10656             var fragmentByStart = new Array,
10657                 fragmentByEnd = new Array,
10658                 x, y, t0, t1, t2, t3;
10659
10660             // Special case for the first row (y = -1, t2 = t3 = 0).
10661             x = y = -1;
10662             t1 = values[0] >= value;
10663             cases[t1 << 1].forEach(stitch);
10664             while (++x < dx - 1) {
10665               t0 = t1, t1 = values[x + 1] >= value;
10666               cases[t0 | t1 << 1].forEach(stitch);
10667             }
10668             cases[t1 << 0].forEach(stitch);
10669
10670             // General case for the intermediate rows.
10671             while (++y < dy - 1) {
10672               x = -1;
10673               t1 = values[y * dx + dx] >= value;
10674               t2 = values[y * dx] >= value;
10675               cases[t1 << 1 | t2 << 2].forEach(stitch);
10676               while (++x < dx - 1) {
10677                 t0 = t1, t1 = values[y * dx + dx + x + 1] >= value;
10678                 t3 = t2, t2 = values[y * dx + x + 1] >= value;
10679                 cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch);
10680               }
10681               cases[t1 | t2 << 3].forEach(stitch);
10682             }
10683
10684             // Special case for the last row (y = dy - 1, t0 = t1 = 0).
10685             x = -1;
10686             t2 = values[y * dx] >= value;
10687             cases[t2 << 2].forEach(stitch);
10688             while (++x < dx - 1) {
10689               t3 = t2, t2 = values[y * dx + x + 1] >= value;
10690               cases[t2 << 2 | t3 << 3].forEach(stitch);
10691             }
10692             cases[t2 << 3].forEach(stitch);
10693
10694             function stitch(line) {
10695               var start = [line[0][0] + x, line[0][1] + y],
10696                   end = [line[1][0] + x, line[1][1] + y],
10697                   startIndex = index(start),
10698                   endIndex = index(end),
10699                   f, g;
10700               if (f = fragmentByEnd[startIndex]) {
10701                 if (g = fragmentByStart[endIndex]) {
10702                   delete fragmentByEnd[f.end];
10703                   delete fragmentByStart[g.start];
10704                   if (f === g) {
10705                     f.ring.push(end);
10706                     callback(f.ring);
10707                   } else {
10708                     fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)};
10709                   }
10710                 } else {
10711                   delete fragmentByEnd[f.end];
10712                   f.ring.push(end);
10713                   fragmentByEnd[f.end = endIndex] = f;
10714                 }
10715               } else if (f = fragmentByStart[endIndex]) {
10716                 if (g = fragmentByEnd[startIndex]) {
10717                   delete fragmentByStart[f.start];
10718                   delete fragmentByEnd[g.end];
10719                   if (f === g) {
10720                     f.ring.push(end);
10721                     callback(f.ring);
10722                   } else {
10723                     fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)};
10724                   }
10725                 } else {
10726                   delete fragmentByStart[f.start];
10727                   f.ring.unshift(start);
10728                   fragmentByStart[f.start = startIndex] = f;
10729                 }
10730               } else {
10731                 fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]};
10732               }
10733             }
10734           }
10735
10736           function index(point) {
10737             return point[0] * 2 + point[1] * (dx + 1) * 4;
10738           }
10739
10740           function smoothLinear(ring, values, value) {
10741             ring.forEach(function(point) {
10742               var x = point[0],
10743                   y = point[1],
10744                   xt = x | 0,
10745                   yt = y | 0,
10746                   v0,
10747                   v1 = values[yt * dx + xt];
10748               if (x > 0 && x < dx && xt === x) {
10749                 v0 = values[yt * dx + xt - 1];
10750                 point[0] = x + (value - v0) / (v1 - v0) - 0.5;
10751               }
10752               if (y > 0 && y < dy && yt === y) {
10753                 v0 = values[(yt - 1) * dx + xt];
10754                 point[1] = y + (value - v0) / (v1 - v0) - 0.5;
10755               }
10756             });
10757           }
10758
10759           contours.contour = contour;
10760
10761           contours.size = function(_) {
10762             if (!arguments.length) return [dx, dy];
10763             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10764             if (!(_0 > 0) || !(_1 > 0)) throw new Error("invalid size");
10765             return dx = _0, dy = _1, contours;
10766           };
10767
10768           contours.thresholds = function(_) {
10769             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), contours) : threshold;
10770           };
10771
10772           contours.smooth = function(_) {
10773             return arguments.length ? (smooth = _ ? smoothLinear : noop$3, contours) : smooth === smoothLinear;
10774           };
10775
10776           return contours;
10777         }
10778
10779         // TODO Optimize edge cases.
10780         // TODO Optimize index calculation.
10781         // TODO Optimize arguments.
10782         function blurX(source, target, r) {
10783           var n = source.width,
10784               m = source.height,
10785               w = (r << 1) + 1;
10786           for (var j = 0; j < m; ++j) {
10787             for (var i = 0, sr = 0; i < n + r; ++i) {
10788               if (i < n) {
10789                 sr += source.data[i + j * n];
10790               }
10791               if (i >= r) {
10792                 if (i >= w) {
10793                   sr -= source.data[i - w + j * n];
10794                 }
10795                 target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w);
10796               }
10797             }
10798           }
10799         }
10800
10801         // TODO Optimize edge cases.
10802         // TODO Optimize index calculation.
10803         // TODO Optimize arguments.
10804         function blurY(source, target, r) {
10805           var n = source.width,
10806               m = source.height,
10807               w = (r << 1) + 1;
10808           for (var i = 0; i < n; ++i) {
10809             for (var j = 0, sr = 0; j < m + r; ++j) {
10810               if (j < m) {
10811                 sr += source.data[i + j * n];
10812               }
10813               if (j >= r) {
10814                 if (j >= w) {
10815                   sr -= source.data[i + (j - w) * n];
10816                 }
10817                 target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w);
10818               }
10819             }
10820           }
10821         }
10822
10823         function defaultX(d) {
10824           return d[0];
10825         }
10826
10827         function defaultY(d) {
10828           return d[1];
10829         }
10830
10831         function defaultWeight() {
10832           return 1;
10833         }
10834
10835         function density() {
10836           var x = defaultX,
10837               y = defaultY,
10838               weight = defaultWeight,
10839               dx = 960,
10840               dy = 500,
10841               r = 20, // blur radius
10842               k = 2, // log2(grid cell size)
10843               o = r * 3, // grid offset, to pad for blur
10844               n = (dx + o * 2) >> k, // grid width
10845               m = (dy + o * 2) >> k, // grid height
10846               threshold = constant$6(20);
10847
10848           function density(data) {
10849             var values0 = new Float32Array(n * m),
10850                 values1 = new Float32Array(n * m);
10851
10852             data.forEach(function(d, i, data) {
10853               var xi = (+x(d, i, data) + o) >> k,
10854                   yi = (+y(d, i, data) + o) >> k,
10855                   wi = +weight(d, i, data);
10856               if (xi >= 0 && xi < n && yi >= 0 && yi < m) {
10857                 values0[xi + yi * n] += wi;
10858               }
10859             });
10860
10861             // TODO Optimize.
10862             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10863             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10864             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10865             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10866             blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k);
10867             blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k);
10868
10869             var tz = threshold(values0);
10870
10871             // Convert number of thresholds into uniform thresholds.
10872             if (!Array.isArray(tz)) {
10873               var stop = max$2(values0);
10874               tz = tickStep(0, stop, tz);
10875               tz = d3_range(0, Math.floor(stop / tz) * tz, tz);
10876               tz.shift();
10877             }
10878
10879             return contours()
10880                 .thresholds(tz)
10881                 .size([n, m])
10882               (values0)
10883                 .map(transform);
10884           }
10885
10886           function transform(geometry) {
10887             geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel.
10888             geometry.coordinates.forEach(transformPolygon);
10889             return geometry;
10890           }
10891
10892           function transformPolygon(coordinates) {
10893             coordinates.forEach(transformRing);
10894           }
10895
10896           function transformRing(coordinates) {
10897             coordinates.forEach(transformPoint);
10898           }
10899
10900           // TODO Optimize.
10901           function transformPoint(coordinates) {
10902             coordinates[0] = coordinates[0] * Math.pow(2, k) - o;
10903             coordinates[1] = coordinates[1] * Math.pow(2, k) - o;
10904           }
10905
10906           function resize() {
10907             o = r * 3;
10908             n = (dx + o * 2) >> k;
10909             m = (dy + o * 2) >> k;
10910             return density;
10911           }
10912
10913           density.x = function(_) {
10914             return arguments.length ? (x = typeof _ === "function" ? _ : constant$6(+_), density) : x;
10915           };
10916
10917           density.y = function(_) {
10918             return arguments.length ? (y = typeof _ === "function" ? _ : constant$6(+_), density) : y;
10919           };
10920
10921           density.weight = function(_) {
10922             return arguments.length ? (weight = typeof _ === "function" ? _ : constant$6(+_), density) : weight;
10923           };
10924
10925           density.size = function(_) {
10926             if (!arguments.length) return [dx, dy];
10927             var _0 = Math.ceil(_[0]), _1 = Math.ceil(_[1]);
10928             if (!(_0 >= 0) && !(_0 >= 0)) throw new Error("invalid size");
10929             return dx = _0, dy = _1, resize();
10930           };
10931
10932           density.cellSize = function(_) {
10933             if (!arguments.length) return 1 << k;
10934             if (!((_ = +_) >= 1)) throw new Error("invalid cell size");
10935             return k = Math.floor(Math.log(_) / Math.LN2), resize();
10936           };
10937
10938           density.thresholds = function(_) {
10939             return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant$6(slice$7.call(_)) : constant$6(_), density) : threshold;
10940           };
10941
10942           density.bandwidth = function(_) {
10943             if (!arguments.length) return Math.sqrt(r * (r + 1));
10944             if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth");
10945             return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize();
10946           };
10947
10948           return density;
10949         }
10950
10951         var EOL = {},
10952             EOF = {},
10953             QUOTE = 34,
10954             NEWLINE = 10,
10955             RETURN = 13;
10956
10957         function objectConverter(columns) {
10958           return new Function("d", "return {" + columns.map(function(name, i) {
10959             return JSON.stringify(name) + ": d[" + i + "]";
10960           }).join(",") + "}");
10961         }
10962
10963         function customConverter(columns, f) {
10964           var object = objectConverter(columns);
10965           return function(row, i) {
10966             return f(object(row), i, columns);
10967           };
10968         }
10969
10970         // Compute unique columns in order of discovery.
10971         function inferColumns(rows) {
10972           var columnSet = Object.create(null),
10973               columns = [];
10974
10975           rows.forEach(function(row) {
10976             for (var column in row) {
10977               if (!(column in columnSet)) {
10978                 columns.push(columnSet[column] = column);
10979               }
10980             }
10981           });
10982
10983           return columns;
10984         }
10985
10986         function pad(value, width) {
10987           var s = value + "", length = s.length;
10988           return length < width ? new Array(width - length + 1).join(0) + s : s;
10989         }
10990
10991         function formatYear(year) {
10992           return year < 0 ? "-" + pad(-year, 6)
10993             : year > 9999 ? "+" + pad(year, 6)
10994             : pad(year, 4);
10995         }
10996
10997         function formatDate(date) {
10998           var hours = date.getUTCHours(),
10999               minutes = date.getUTCMinutes(),
11000               seconds = date.getUTCSeconds(),
11001               milliseconds = date.getUTCMilliseconds();
11002           return isNaN(date) ? "Invalid Date"
11003               : formatYear(date.getUTCFullYear(), 4) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2)
11004               + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z"
11005               : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z"
11006               : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z"
11007               : "");
11008         }
11009
11010         function dsvFormat(delimiter) {
11011           var reFormat = new RegExp("[\"" + delimiter + "\n\r]"),
11012               DELIMITER = delimiter.charCodeAt(0);
11013
11014           function parse(text, f) {
11015             var convert, columns, rows = parseRows(text, function(row, i) {
11016               if (convert) return convert(row, i - 1);
11017               columns = row, convert = f ? customConverter(row, f) : objectConverter(row);
11018             });
11019             rows.columns = columns || [];
11020             return rows;
11021           }
11022
11023           function parseRows(text, f) {
11024             var rows = [], // output rows
11025                 N = text.length,
11026                 I = 0, // current character index
11027                 n = 0, // current line number
11028                 t, // current token
11029                 eof = N <= 0, // current token followed by EOF?
11030                 eol = false; // current token followed by EOL?
11031
11032             // Strip the trailing newline.
11033             if (text.charCodeAt(N - 1) === NEWLINE) --N;
11034             if (text.charCodeAt(N - 1) === RETURN) --N;
11035
11036             function token() {
11037               if (eof) return EOF;
11038               if (eol) return eol = false, EOL;
11039
11040               // Unescape quotes.
11041               var i, j = I, c;
11042               if (text.charCodeAt(j) === QUOTE) {
11043                 while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE);
11044                 if ((i = I) >= N) eof = true;
11045                 else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true;
11046                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11047                 return text.slice(j + 1, i - 1).replace(/""/g, "\"");
11048               }
11049
11050               // Find next delimiter or newline.
11051               while (I < N) {
11052                 if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true;
11053                 else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; }
11054                 else if (c !== DELIMITER) continue;
11055                 return text.slice(j, i);
11056               }
11057
11058               // Return last token before EOF.
11059               return eof = true, text.slice(j, N);
11060             }
11061
11062             while ((t = token()) !== EOF) {
11063               var row = [];
11064               while (t !== EOL && t !== EOF) row.push(t), t = token();
11065               if (f && (row = f(row, n++)) == null) continue;
11066               rows.push(row);
11067             }
11068
11069             return rows;
11070           }
11071
11072           function preformatBody(rows, columns) {
11073             return rows.map(function(row) {
11074               return columns.map(function(column) {
11075                 return formatValue(row[column]);
11076               }).join(delimiter);
11077             });
11078           }
11079
11080           function format(rows, columns) {
11081             if (columns == null) columns = inferColumns(rows);
11082             return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n");
11083           }
11084
11085           function formatBody(rows, columns) {
11086             if (columns == null) columns = inferColumns(rows);
11087             return preformatBody(rows, columns).join("\n");
11088           }
11089
11090           function formatRows(rows) {
11091             return rows.map(formatRow).join("\n");
11092           }
11093
11094           function formatRow(row) {
11095             return row.map(formatValue).join(delimiter);
11096           }
11097
11098           function formatValue(value) {
11099             return value == null ? ""
11100                 : value instanceof Date ? formatDate(value)
11101                 : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\""
11102                 : value;
11103           }
11104
11105           return {
11106             parse: parse,
11107             parseRows: parseRows,
11108             format: format,
11109             formatBody: formatBody,
11110             formatRows: formatRows
11111           };
11112         }
11113
11114         var csv = dsvFormat(",");
11115
11116         var csvParse = csv.parse;
11117         var csvParseRows = csv.parseRows;
11118         var csvFormat = csv.format;
11119         var csvFormatBody = csv.formatBody;
11120         var csvFormatRows = csv.formatRows;
11121
11122         var tsv = dsvFormat("\t");
11123
11124         var tsvParse = tsv.parse;
11125         var tsvParseRows = tsv.parseRows;
11126         var tsvFormat = tsv.format;
11127         var tsvFormatBody = tsv.formatBody;
11128         var tsvFormatRows = tsv.formatRows;
11129
11130         function autoType(object) {
11131           for (var key in object) {
11132             var value = object[key].trim(), number;
11133             if (!value) value = null;
11134             else if (value === "true") value = true;
11135             else if (value === "false") value = false;
11136             else if (value === "NaN") value = NaN;
11137             else if (!isNaN(number = +value)) value = number;
11138             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);
11139             else continue;
11140             object[key] = value;
11141           }
11142           return object;
11143         }
11144
11145         function responseBlob(response) {
11146           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11147           return response.blob();
11148         }
11149
11150         function blob(input, init) {
11151           return fetch(input, init).then(responseBlob);
11152         }
11153
11154         function responseArrayBuffer(response) {
11155           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11156           return response.arrayBuffer();
11157         }
11158
11159         function buffer(input, init) {
11160           return fetch(input, init).then(responseArrayBuffer);
11161         }
11162
11163         function responseText(response) {
11164           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11165           return response.text();
11166         }
11167
11168         function d3_text(input, init) {
11169           return fetch(input, init).then(responseText);
11170         }
11171
11172         function dsvParse(parse) {
11173           return function(input, init, row) {
11174             if (arguments.length === 2 && typeof init === "function") row = init, init = undefined;
11175             return d3_text(input, init).then(function(response) {
11176               return parse(response, row);
11177             });
11178           };
11179         }
11180
11181         function dsv(delimiter, input, init, row) {
11182           if (arguments.length === 3 && typeof init === "function") row = init, init = undefined;
11183           var format = dsvFormat(delimiter);
11184           return d3_text(input, init).then(function(response) {
11185             return format.parse(response, row);
11186           });
11187         }
11188
11189         var csv$1 = dsvParse(csvParse);
11190         var tsv$1 = dsvParse(tsvParse);
11191
11192         function image(input, init) {
11193           return new Promise(function(resolve, reject) {
11194             var image = new Image;
11195             for (var key in init) image[key] = init[key];
11196             image.onerror = reject;
11197             image.onload = function() { resolve(image); };
11198             image.src = input;
11199           });
11200         }
11201
11202         function responseJson(response) {
11203           if (!response.ok) throw new Error(response.status + " " + response.statusText);
11204           return response.json();
11205         }
11206
11207         function d3_json(input, init) {
11208           return fetch(input, init).then(responseJson);
11209         }
11210
11211         function parser(type) {
11212           return function(input, init)  {
11213             return d3_text(input, init).then(function(text) {
11214               return (new DOMParser).parseFromString(text, type);
11215             });
11216           };
11217         }
11218
11219         var d3_xml = parser("application/xml");
11220
11221         var html = parser("text/html");
11222
11223         var svg = parser("image/svg+xml");
11224
11225         function center$1(x, y) {
11226           var nodes;
11227
11228           if (x == null) x = 0;
11229           if (y == null) y = 0;
11230
11231           function force() {
11232             var i,
11233                 n = nodes.length,
11234                 node,
11235                 sx = 0,
11236                 sy = 0;
11237
11238             for (i = 0; i < n; ++i) {
11239               node = nodes[i], sx += node.x, sy += node.y;
11240             }
11241
11242             for (sx = sx / n - x, sy = sy / n - y, i = 0; i < n; ++i) {
11243               node = nodes[i], node.x -= sx, node.y -= sy;
11244             }
11245           }
11246
11247           force.initialize = function(_) {
11248             nodes = _;
11249           };
11250
11251           force.x = function(_) {
11252             return arguments.length ? (x = +_, force) : x;
11253           };
11254
11255           force.y = function(_) {
11256             return arguments.length ? (y = +_, force) : y;
11257           };
11258
11259           return force;
11260         }
11261
11262         function constant$7(x) {
11263           return function() {
11264             return x;
11265           };
11266         }
11267
11268         function jiggle() {
11269           return (Math.random() - 0.5) * 1e-6;
11270         }
11271
11272         function tree_add(d) {
11273           var x = +this._x.call(null, d),
11274               y = +this._y.call(null, d);
11275           return add(this.cover(x, y), x, y, d);
11276         }
11277
11278         function add(tree, x, y, d) {
11279           if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points
11280
11281           var parent,
11282               node = tree._root,
11283               leaf = {data: d},
11284               x0 = tree._x0,
11285               y0 = tree._y0,
11286               x1 = tree._x1,
11287               y1 = tree._y1,
11288               xm,
11289               ym,
11290               xp,
11291               yp,
11292               right,
11293               bottom,
11294               i,
11295               j;
11296
11297           // If the tree is empty, initialize the root as a leaf.
11298           if (!node) return tree._root = leaf, tree;
11299
11300           // Find the existing leaf for the new point, or add it.
11301           while (node.length) {
11302             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11303             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11304             if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree;
11305           }
11306
11307           // Is the new point is exactly coincident with the existing point?
11308           xp = +tree._x.call(null, node.data);
11309           yp = +tree._y.call(null, node.data);
11310           if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree;
11311
11312           // Otherwise, split the leaf node until the old and new point are separated.
11313           do {
11314             parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4);
11315             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11316             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11317           } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm)));
11318           return parent[j] = node, parent[i] = leaf, tree;
11319         }
11320
11321         function addAll(data) {
11322           var d, i, n = data.length,
11323               x,
11324               y,
11325               xz = new Array(n),
11326               yz = new Array(n),
11327               x0 = Infinity,
11328               y0 = Infinity,
11329               x1 = -Infinity,
11330               y1 = -Infinity;
11331
11332           // Compute the points and their extent.
11333           for (i = 0; i < n; ++i) {
11334             if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue;
11335             xz[i] = x;
11336             yz[i] = y;
11337             if (x < x0) x0 = x;
11338             if (x > x1) x1 = x;
11339             if (y < y0) y0 = y;
11340             if (y > y1) y1 = y;
11341           }
11342
11343           // If there were no (valid) points, abort.
11344           if (x0 > x1 || y0 > y1) return this;
11345
11346           // Expand the tree to cover the new points.
11347           this.cover(x0, y0).cover(x1, y1);
11348
11349           // Add the new points.
11350           for (i = 0; i < n; ++i) {
11351             add(this, xz[i], yz[i], data[i]);
11352           }
11353
11354           return this;
11355         }
11356
11357         function tree_cover(x, y) {
11358           if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points
11359
11360           var x0 = this._x0,
11361               y0 = this._y0,
11362               x1 = this._x1,
11363               y1 = this._y1;
11364
11365           // If the quadtree has no extent, initialize them.
11366           // Integer extent are necessary so that if we later double the extent,
11367           // the existing quadrant boundaries don’t change due to floating point error!
11368           if (isNaN(x0)) {
11369             x1 = (x0 = Math.floor(x)) + 1;
11370             y1 = (y0 = Math.floor(y)) + 1;
11371           }
11372
11373           // Otherwise, double repeatedly to cover.
11374           else {
11375             var z = x1 - x0,
11376                 node = this._root,
11377                 parent,
11378                 i;
11379
11380             while (x0 > x || x >= x1 || y0 > y || y >= y1) {
11381               i = (y < y0) << 1 | (x < x0);
11382               parent = new Array(4), parent[i] = node, node = parent, z *= 2;
11383               switch (i) {
11384                 case 0: x1 = x0 + z, y1 = y0 + z; break;
11385                 case 1: x0 = x1 - z, y1 = y0 + z; break;
11386                 case 2: x1 = x0 + z, y0 = y1 - z; break;
11387                 case 3: x0 = x1 - z, y0 = y1 - z; break;
11388               }
11389             }
11390
11391             if (this._root && this._root.length) this._root = node;
11392           }
11393
11394           this._x0 = x0;
11395           this._y0 = y0;
11396           this._x1 = x1;
11397           this._y1 = y1;
11398           return this;
11399         }
11400
11401         function tree_data() {
11402           var data = [];
11403           this.visit(function(node) {
11404             if (!node.length) do data.push(node.data); while (node = node.next)
11405           });
11406           return data;
11407         }
11408
11409         function tree_extent(_) {
11410           return arguments.length
11411               ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1])
11412               : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]];
11413         }
11414
11415         function Quad(node, x0, y0, x1, y1) {
11416           this.node = node;
11417           this.x0 = x0;
11418           this.y0 = y0;
11419           this.x1 = x1;
11420           this.y1 = y1;
11421         }
11422
11423         function tree_find(x, y, radius) {
11424           var data,
11425               x0 = this._x0,
11426               y0 = this._y0,
11427               x1,
11428               y1,
11429               x2,
11430               y2,
11431               x3 = this._x1,
11432               y3 = this._y1,
11433               quads = [],
11434               node = this._root,
11435               q,
11436               i;
11437
11438           if (node) quads.push(new Quad(node, x0, y0, x3, y3));
11439           if (radius == null) radius = Infinity;
11440           else {
11441             x0 = x - radius, y0 = y - radius;
11442             x3 = x + radius, y3 = y + radius;
11443             radius *= radius;
11444           }
11445
11446           while (q = quads.pop()) {
11447
11448             // Stop searching if this quadrant can’t contain a closer node.
11449             if (!(node = q.node)
11450                 || (x1 = q.x0) > x3
11451                 || (y1 = q.y0) > y3
11452                 || (x2 = q.x1) < x0
11453                 || (y2 = q.y1) < y0) continue;
11454
11455             // Bisect the current quadrant.
11456             if (node.length) {
11457               var xm = (x1 + x2) / 2,
11458                   ym = (y1 + y2) / 2;
11459
11460               quads.push(
11461                 new Quad(node[3], xm, ym, x2, y2),
11462                 new Quad(node[2], x1, ym, xm, y2),
11463                 new Quad(node[1], xm, y1, x2, ym),
11464                 new Quad(node[0], x1, y1, xm, ym)
11465               );
11466
11467               // Visit the closest quadrant first.
11468               if (i = (y >= ym) << 1 | (x >= xm)) {
11469                 q = quads[quads.length - 1];
11470                 quads[quads.length - 1] = quads[quads.length - 1 - i];
11471                 quads[quads.length - 1 - i] = q;
11472               }
11473             }
11474
11475             // Visit this point. (Visiting coincident points isn’t necessary!)
11476             else {
11477               var dx = x - +this._x.call(null, node.data),
11478                   dy = y - +this._y.call(null, node.data),
11479                   d2 = dx * dx + dy * dy;
11480               if (d2 < radius) {
11481                 var d = Math.sqrt(radius = d2);
11482                 x0 = x - d, y0 = y - d;
11483                 x3 = x + d, y3 = y + d;
11484                 data = node.data;
11485               }
11486             }
11487           }
11488
11489           return data;
11490         }
11491
11492         function tree_remove(d) {
11493           if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points
11494
11495           var parent,
11496               node = this._root,
11497               retainer,
11498               previous,
11499               next,
11500               x0 = this._x0,
11501               y0 = this._y0,
11502               x1 = this._x1,
11503               y1 = this._y1,
11504               x,
11505               y,
11506               xm,
11507               ym,
11508               right,
11509               bottom,
11510               i,
11511               j;
11512
11513           // If the tree is empty, initialize the root as a leaf.
11514           if (!node) return this;
11515
11516           // Find the leaf node for the point.
11517           // While descending, also retain the deepest parent with a non-removed sibling.
11518           if (node.length) while (true) {
11519             if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm;
11520             if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym;
11521             if (!(parent = node, node = node[i = bottom << 1 | right])) return this;
11522             if (!node.length) break;
11523             if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i;
11524           }
11525
11526           // Find the point to remove.
11527           while (node.data !== d) if (!(previous = node, node = node.next)) return this;
11528           if (next = node.next) delete node.next;
11529
11530           // If there are multiple coincident points, remove just the point.
11531           if (previous) return (next ? previous.next = next : delete previous.next), this;
11532
11533           // If this is the root point, remove it.
11534           if (!parent) return this._root = next, this;
11535
11536           // Remove this leaf.
11537           next ? parent[i] = next : delete parent[i];
11538
11539           // If the parent now contains exactly one leaf, collapse superfluous parents.
11540           if ((node = parent[0] || parent[1] || parent[2] || parent[3])
11541               && node === (parent[3] || parent[2] || parent[1] || parent[0])
11542               && !node.length) {
11543             if (retainer) retainer[j] = node;
11544             else this._root = node;
11545           }
11546
11547           return this;
11548         }
11549
11550         function removeAll(data) {
11551           for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]);
11552           return this;
11553         }
11554
11555         function tree_root() {
11556           return this._root;
11557         }
11558
11559         function tree_size() {
11560           var size = 0;
11561           this.visit(function(node) {
11562             if (!node.length) do ++size; while (node = node.next)
11563           });
11564           return size;
11565         }
11566
11567         function tree_visit(callback) {
11568           var quads = [], q, node = this._root, child, x0, y0, x1, y1;
11569           if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1));
11570           while (q = quads.pop()) {
11571             if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) {
11572               var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11573               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11574               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11575               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11576               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11577             }
11578           }
11579           return this;
11580         }
11581
11582         function tree_visitAfter(callback) {
11583           var quads = [], next = [], q;
11584           if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1));
11585           while (q = quads.pop()) {
11586             var node = q.node;
11587             if (node.length) {
11588               var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2;
11589               if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym));
11590               if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym));
11591               if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1));
11592               if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1));
11593             }
11594             next.push(q);
11595           }
11596           while (q = next.pop()) {
11597             callback(q.node, q.x0, q.y0, q.x1, q.y1);
11598           }
11599           return this;
11600         }
11601
11602         function defaultX$1(d) {
11603           return d[0];
11604         }
11605
11606         function tree_x(_) {
11607           return arguments.length ? (this._x = _, this) : this._x;
11608         }
11609
11610         function defaultY$1(d) {
11611           return d[1];
11612         }
11613
11614         function tree_y(_) {
11615           return arguments.length ? (this._y = _, this) : this._y;
11616         }
11617
11618         function quadtree(nodes, x, y) {
11619           var tree = new Quadtree(x == null ? defaultX$1 : x, y == null ? defaultY$1 : y, NaN, NaN, NaN, NaN);
11620           return nodes == null ? tree : tree.addAll(nodes);
11621         }
11622
11623         function Quadtree(x, y, x0, y0, x1, y1) {
11624           this._x = x;
11625           this._y = y;
11626           this._x0 = x0;
11627           this._y0 = y0;
11628           this._x1 = x1;
11629           this._y1 = y1;
11630           this._root = undefined;
11631         }
11632
11633         function leaf_copy(leaf) {
11634           var copy = {data: leaf.data}, next = copy;
11635           while (leaf = leaf.next) next = next.next = {data: leaf.data};
11636           return copy;
11637         }
11638
11639         var treeProto = quadtree.prototype = Quadtree.prototype;
11640
11641         treeProto.copy = function() {
11642           var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1),
11643               node = this._root,
11644               nodes,
11645               child;
11646
11647           if (!node) return copy;
11648
11649           if (!node.length) return copy._root = leaf_copy(node), copy;
11650
11651           nodes = [{source: node, target: copy._root = new Array(4)}];
11652           while (node = nodes.pop()) {
11653             for (var i = 0; i < 4; ++i) {
11654               if (child = node.source[i]) {
11655                 if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)});
11656                 else node.target[i] = leaf_copy(child);
11657               }
11658             }
11659           }
11660
11661           return copy;
11662         };
11663
11664         treeProto.add = tree_add;
11665         treeProto.addAll = addAll;
11666         treeProto.cover = tree_cover;
11667         treeProto.data = tree_data;
11668         treeProto.extent = tree_extent;
11669         treeProto.find = tree_find;
11670         treeProto.remove = tree_remove;
11671         treeProto.removeAll = removeAll;
11672         treeProto.root = tree_root;
11673         treeProto.size = tree_size;
11674         treeProto.visit = tree_visit;
11675         treeProto.visitAfter = tree_visitAfter;
11676         treeProto.x = tree_x;
11677         treeProto.y = tree_y;
11678
11679         function x(d) {
11680           return d.x + d.vx;
11681         }
11682
11683         function y(d) {
11684           return d.y + d.vy;
11685         }
11686
11687         function collide(radius) {
11688           var nodes,
11689               radii,
11690               strength = 1,
11691               iterations = 1;
11692
11693           if (typeof radius !== "function") radius = constant$7(radius == null ? 1 : +radius);
11694
11695           function force() {
11696             var i, n = nodes.length,
11697                 tree,
11698                 node,
11699                 xi,
11700                 yi,
11701                 ri,
11702                 ri2;
11703
11704             for (var k = 0; k < iterations; ++k) {
11705               tree = quadtree(nodes, x, y).visitAfter(prepare);
11706               for (i = 0; i < n; ++i) {
11707                 node = nodes[i];
11708                 ri = radii[node.index], ri2 = ri * ri;
11709                 xi = node.x + node.vx;
11710                 yi = node.y + node.vy;
11711                 tree.visit(apply);
11712               }
11713             }
11714
11715             function apply(quad, x0, y0, x1, y1) {
11716               var data = quad.data, rj = quad.r, r = ri + rj;
11717               if (data) {
11718                 if (data.index > node.index) {
11719                   var x = xi - data.x - data.vx,
11720                       y = yi - data.y - data.vy,
11721                       l = x * x + y * y;
11722                   if (l < r * r) {
11723                     if (x === 0) x = jiggle(), l += x * x;
11724                     if (y === 0) y = jiggle(), l += y * y;
11725                     l = (r - (l = Math.sqrt(l))) / l * strength;
11726                     node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj));
11727                     node.vy += (y *= l) * r;
11728                     data.vx -= x * (r = 1 - r);
11729                     data.vy -= y * r;
11730                   }
11731                 }
11732                 return;
11733               }
11734               return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r;
11735             }
11736           }
11737
11738           function prepare(quad) {
11739             if (quad.data) return quad.r = radii[quad.data.index];
11740             for (var i = quad.r = 0; i < 4; ++i) {
11741               if (quad[i] && quad[i].r > quad.r) {
11742                 quad.r = quad[i].r;
11743               }
11744             }
11745           }
11746
11747           function initialize() {
11748             if (!nodes) return;
11749             var i, n = nodes.length, node;
11750             radii = new Array(n);
11751             for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes);
11752           }
11753
11754           force.initialize = function(_) {
11755             nodes = _;
11756             initialize();
11757           };
11758
11759           force.iterations = function(_) {
11760             return arguments.length ? (iterations = +_, force) : iterations;
11761           };
11762
11763           force.strength = function(_) {
11764             return arguments.length ? (strength = +_, force) : strength;
11765           };
11766
11767           force.radius = function(_) {
11768             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
11769           };
11770
11771           return force;
11772         }
11773
11774         function index(d) {
11775           return d.index;
11776         }
11777
11778         function find(nodeById, nodeId) {
11779           var node = nodeById.get(nodeId);
11780           if (!node) throw new Error("missing: " + nodeId);
11781           return node;
11782         }
11783
11784         function link(links) {
11785           var id = index,
11786               strength = defaultStrength,
11787               strengths,
11788               distance = constant$7(30),
11789               distances,
11790               nodes,
11791               count,
11792               bias,
11793               iterations = 1;
11794
11795           if (links == null) links = [];
11796
11797           function defaultStrength(link) {
11798             return 1 / Math.min(count[link.source.index], count[link.target.index]);
11799           }
11800
11801           function force(alpha) {
11802             for (var k = 0, n = links.length; k < iterations; ++k) {
11803               for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) {
11804                 link = links[i], source = link.source, target = link.target;
11805                 x = target.x + target.vx - source.x - source.vx || jiggle();
11806                 y = target.y + target.vy - source.y - source.vy || jiggle();
11807                 l = Math.sqrt(x * x + y * y);
11808                 l = (l - distances[i]) / l * alpha * strengths[i];
11809                 x *= l, y *= l;
11810                 target.vx -= x * (b = bias[i]);
11811                 target.vy -= y * b;
11812                 source.vx += x * (b = 1 - b);
11813                 source.vy += y * b;
11814               }
11815             }
11816           }
11817
11818           function initialize() {
11819             if (!nodes) return;
11820
11821             var i,
11822                 n = nodes.length,
11823                 m = links.length,
11824                 nodeById = map$3(nodes, id),
11825                 link;
11826
11827             for (i = 0, count = new Array(n); i < m; ++i) {
11828               link = links[i], link.index = i;
11829               if (typeof link.source !== "object") link.source = find(nodeById, link.source);
11830               if (typeof link.target !== "object") link.target = find(nodeById, link.target);
11831               count[link.source.index] = (count[link.source.index] || 0) + 1;
11832               count[link.target.index] = (count[link.target.index] || 0) + 1;
11833             }
11834
11835             for (i = 0, bias = new Array(m); i < m; ++i) {
11836               link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]);
11837             }
11838
11839             strengths = new Array(m), initializeStrength();
11840             distances = new Array(m), initializeDistance();
11841           }
11842
11843           function initializeStrength() {
11844             if (!nodes) return;
11845
11846             for (var i = 0, n = links.length; i < n; ++i) {
11847               strengths[i] = +strength(links[i], i, links);
11848             }
11849           }
11850
11851           function initializeDistance() {
11852             if (!nodes) return;
11853
11854             for (var i = 0, n = links.length; i < n; ++i) {
11855               distances[i] = +distance(links[i], i, links);
11856             }
11857           }
11858
11859           force.initialize = function(_) {
11860             nodes = _;
11861             initialize();
11862           };
11863
11864           force.links = function(_) {
11865             return arguments.length ? (links = _, initialize(), force) : links;
11866           };
11867
11868           force.id = function(_) {
11869             return arguments.length ? (id = _, force) : id;
11870           };
11871
11872           force.iterations = function(_) {
11873             return arguments.length ? (iterations = +_, force) : iterations;
11874           };
11875
11876           force.strength = function(_) {
11877             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initializeStrength(), force) : strength;
11878           };
11879
11880           force.distance = function(_) {
11881             return arguments.length ? (distance = typeof _ === "function" ? _ : constant$7(+_), initializeDistance(), force) : distance;
11882           };
11883
11884           return force;
11885         }
11886
11887         function x$1(d) {
11888           return d.x;
11889         }
11890
11891         function y$1(d) {
11892           return d.y;
11893         }
11894
11895         var initialRadius = 10,
11896             initialAngle = Math.PI * (3 - Math.sqrt(5));
11897
11898         function simulation(nodes) {
11899           var simulation,
11900               alpha = 1,
11901               alphaMin = 0.001,
11902               alphaDecay = 1 - Math.pow(alphaMin, 1 / 300),
11903               alphaTarget = 0,
11904               velocityDecay = 0.6,
11905               forces = map$3(),
11906               stepper = timer(step),
11907               event = dispatch("tick", "end");
11908
11909           if (nodes == null) nodes = [];
11910
11911           function step() {
11912             tick();
11913             event.call("tick", simulation);
11914             if (alpha < alphaMin) {
11915               stepper.stop();
11916               event.call("end", simulation);
11917             }
11918           }
11919
11920           function tick(iterations) {
11921             var i, n = nodes.length, node;
11922
11923             if (iterations === undefined) iterations = 1;
11924
11925             for (var k = 0; k < iterations; ++k) {
11926               alpha += (alphaTarget - alpha) * alphaDecay;
11927
11928               forces.each(function (force) {
11929                 force(alpha);
11930               });
11931
11932               for (i = 0; i < n; ++i) {
11933                 node = nodes[i];
11934                 if (node.fx == null) node.x += node.vx *= velocityDecay;
11935                 else node.x = node.fx, node.vx = 0;
11936                 if (node.fy == null) node.y += node.vy *= velocityDecay;
11937                 else node.y = node.fy, node.vy = 0;
11938               }
11939             }
11940
11941             return simulation;
11942           }
11943
11944           function initializeNodes() {
11945             for (var i = 0, n = nodes.length, node; i < n; ++i) {
11946               node = nodes[i], node.index = i;
11947               if (node.fx != null) node.x = node.fx;
11948               if (node.fy != null) node.y = node.fy;
11949               if (isNaN(node.x) || isNaN(node.y)) {
11950                 var radius = initialRadius * Math.sqrt(i), angle = i * initialAngle;
11951                 node.x = radius * Math.cos(angle);
11952                 node.y = radius * Math.sin(angle);
11953               }
11954               if (isNaN(node.vx) || isNaN(node.vy)) {
11955                 node.vx = node.vy = 0;
11956               }
11957             }
11958           }
11959
11960           function initializeForce(force) {
11961             if (force.initialize) force.initialize(nodes);
11962             return force;
11963           }
11964
11965           initializeNodes();
11966
11967           return simulation = {
11968             tick: tick,
11969
11970             restart: function() {
11971               return stepper.restart(step), simulation;
11972             },
11973
11974             stop: function() {
11975               return stepper.stop(), simulation;
11976             },
11977
11978             nodes: function(_) {
11979               return arguments.length ? (nodes = _, initializeNodes(), forces.each(initializeForce), simulation) : nodes;
11980             },
11981
11982             alpha: function(_) {
11983               return arguments.length ? (alpha = +_, simulation) : alpha;
11984             },
11985
11986             alphaMin: function(_) {
11987               return arguments.length ? (alphaMin = +_, simulation) : alphaMin;
11988             },
11989
11990             alphaDecay: function(_) {
11991               return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay;
11992             },
11993
11994             alphaTarget: function(_) {
11995               return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget;
11996             },
11997
11998             velocityDecay: function(_) {
11999               return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay;
12000             },
12001
12002             force: function(name, _) {
12003               return arguments.length > 1 ? ((_ == null ? forces.remove(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name);
12004             },
12005
12006             find: function(x, y, radius) {
12007               var i = 0,
12008                   n = nodes.length,
12009                   dx,
12010                   dy,
12011                   d2,
12012                   node,
12013                   closest;
12014
12015               if (radius == null) radius = Infinity;
12016               else radius *= radius;
12017
12018               for (i = 0; i < n; ++i) {
12019                 node = nodes[i];
12020                 dx = x - node.x;
12021                 dy = y - node.y;
12022                 d2 = dx * dx + dy * dy;
12023                 if (d2 < radius) closest = node, radius = d2;
12024               }
12025
12026               return closest;
12027             },
12028
12029             on: function(name, _) {
12030               return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name);
12031             }
12032           };
12033         }
12034
12035         function manyBody() {
12036           var nodes,
12037               node,
12038               alpha,
12039               strength = constant$7(-30),
12040               strengths,
12041               distanceMin2 = 1,
12042               distanceMax2 = Infinity,
12043               theta2 = 0.81;
12044
12045           function force(_) {
12046             var i, n = nodes.length, tree = quadtree(nodes, x$1, y$1).visitAfter(accumulate);
12047             for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply);
12048           }
12049
12050           function initialize() {
12051             if (!nodes) return;
12052             var i, n = nodes.length, node;
12053             strengths = new Array(n);
12054             for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes);
12055           }
12056
12057           function accumulate(quad) {
12058             var strength = 0, q, c, weight = 0, x, y, i;
12059
12060             // For internal nodes, accumulate forces from child quadrants.
12061             if (quad.length) {
12062               for (x = y = i = 0; i < 4; ++i) {
12063                 if ((q = quad[i]) && (c = Math.abs(q.value))) {
12064                   strength += q.value, weight += c, x += c * q.x, y += c * q.y;
12065                 }
12066               }
12067               quad.x = x / weight;
12068               quad.y = y / weight;
12069             }
12070
12071             // For leaf nodes, accumulate forces from coincident quadrants.
12072             else {
12073               q = quad;
12074               q.x = q.data.x;
12075               q.y = q.data.y;
12076               do strength += strengths[q.data.index];
12077               while (q = q.next);
12078             }
12079
12080             quad.value = strength;
12081           }
12082
12083           function apply(quad, x1, _, x2) {
12084             if (!quad.value) return true;
12085
12086             var x = quad.x - node.x,
12087                 y = quad.y - node.y,
12088                 w = x2 - x1,
12089                 l = x * x + y * y;
12090
12091             // Apply the Barnes-Hut approximation if possible.
12092             // Limit forces for very close nodes; randomize direction if coincident.
12093             if (w * w / theta2 < l) {
12094               if (l < distanceMax2) {
12095                 if (x === 0) x = jiggle(), l += x * x;
12096                 if (y === 0) y = jiggle(), l += y * y;
12097                 if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12098                 node.vx += x * quad.value * alpha / l;
12099                 node.vy += y * quad.value * alpha / l;
12100               }
12101               return true;
12102             }
12103
12104             // Otherwise, process points directly.
12105             else if (quad.length || l >= distanceMax2) return;
12106
12107             // Limit forces for very close nodes; randomize direction if coincident.
12108             if (quad.data !== node || quad.next) {
12109               if (x === 0) x = jiggle(), l += x * x;
12110               if (y === 0) y = jiggle(), l += y * y;
12111               if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l);
12112             }
12113
12114             do if (quad.data !== node) {
12115               w = strengths[quad.data.index] * alpha / l;
12116               node.vx += x * w;
12117               node.vy += y * w;
12118             } while (quad = quad.next);
12119           }
12120
12121           force.initialize = function(_) {
12122             nodes = _;
12123             initialize();
12124           };
12125
12126           force.strength = function(_) {
12127             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12128           };
12129
12130           force.distanceMin = function(_) {
12131             return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2);
12132           };
12133
12134           force.distanceMax = function(_) {
12135             return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2);
12136           };
12137
12138           force.theta = function(_) {
12139             return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2);
12140           };
12141
12142           return force;
12143         }
12144
12145         function radial(radius, x, y) {
12146           var nodes,
12147               strength = constant$7(0.1),
12148               strengths,
12149               radiuses;
12150
12151           if (typeof radius !== "function") radius = constant$7(+radius);
12152           if (x == null) x = 0;
12153           if (y == null) y = 0;
12154
12155           function force(alpha) {
12156             for (var i = 0, n = nodes.length; i < n; ++i) {
12157               var node = nodes[i],
12158                   dx = node.x - x || 1e-6,
12159                   dy = node.y - y || 1e-6,
12160                   r = Math.sqrt(dx * dx + dy * dy),
12161                   k = (radiuses[i] - r) * strengths[i] * alpha / r;
12162               node.vx += dx * k;
12163               node.vy += dy * k;
12164             }
12165           }
12166
12167           function initialize() {
12168             if (!nodes) return;
12169             var i, n = nodes.length;
12170             strengths = new Array(n);
12171             radiuses = new Array(n);
12172             for (i = 0; i < n; ++i) {
12173               radiuses[i] = +radius(nodes[i], i, nodes);
12174               strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes);
12175             }
12176           }
12177
12178           force.initialize = function(_) {
12179             nodes = _, initialize();
12180           };
12181
12182           force.strength = function(_) {
12183             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12184           };
12185
12186           force.radius = function(_) {
12187             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : radius;
12188           };
12189
12190           force.x = function(_) {
12191             return arguments.length ? (x = +_, force) : x;
12192           };
12193
12194           force.y = function(_) {
12195             return arguments.length ? (y = +_, force) : y;
12196           };
12197
12198           return force;
12199         }
12200
12201         function x$2(x) {
12202           var strength = constant$7(0.1),
12203               nodes,
12204               strengths,
12205               xz;
12206
12207           if (typeof x !== "function") x = constant$7(x == null ? 0 : +x);
12208
12209           function force(alpha) {
12210             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12211               node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha;
12212             }
12213           }
12214
12215           function initialize() {
12216             if (!nodes) return;
12217             var i, n = nodes.length;
12218             strengths = new Array(n);
12219             xz = new Array(n);
12220             for (i = 0; i < n; ++i) {
12221               strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12222             }
12223           }
12224
12225           force.initialize = function(_) {
12226             nodes = _;
12227             initialize();
12228           };
12229
12230           force.strength = function(_) {
12231             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12232           };
12233
12234           force.x = function(_) {
12235             return arguments.length ? (x = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : x;
12236           };
12237
12238           return force;
12239         }
12240
12241         function y$2(y) {
12242           var strength = constant$7(0.1),
12243               nodes,
12244               strengths,
12245               yz;
12246
12247           if (typeof y !== "function") y = constant$7(y == null ? 0 : +y);
12248
12249           function force(alpha) {
12250             for (var i = 0, n = nodes.length, node; i < n; ++i) {
12251               node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha;
12252             }
12253           }
12254
12255           function initialize() {
12256             if (!nodes) return;
12257             var i, n = nodes.length;
12258             strengths = new Array(n);
12259             yz = new Array(n);
12260             for (i = 0; i < n; ++i) {
12261               strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes);
12262             }
12263           }
12264
12265           force.initialize = function(_) {
12266             nodes = _;
12267             initialize();
12268           };
12269
12270           force.strength = function(_) {
12271             return arguments.length ? (strength = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : strength;
12272           };
12273
12274           force.y = function(_) {
12275             return arguments.length ? (y = typeof _ === "function" ? _ : constant$7(+_), initialize(), force) : y;
12276           };
12277
12278           return force;
12279         }
12280
12281         // Computes the decimal coefficient and exponent of the specified number x with
12282         // significant digits p, where x is positive and p is in [1, 21] or undefined.
12283         // For example, formatDecimal(1.23) returns ["123", 0].
12284         function formatDecimal(x, p) {
12285           if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity
12286           var i, coefficient = x.slice(0, i);
12287
12288           // The string returned by toExponential either has the form \d\.\d+e[-+]\d+
12289           // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3).
12290           return [
12291             coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient,
12292             +x.slice(i + 1)
12293           ];
12294         }
12295
12296         function exponent$1(x) {
12297           return x = formatDecimal(Math.abs(x)), x ? x[1] : NaN;
12298         }
12299
12300         function formatGroup(grouping, thousands) {
12301           return function(value, width) {
12302             var i = value.length,
12303                 t = [],
12304                 j = 0,
12305                 g = grouping[0],
12306                 length = 0;
12307
12308             while (i > 0 && g > 0) {
12309               if (length + g + 1 > width) g = Math.max(1, width - length);
12310               t.push(value.substring(i -= g, i + g));
12311               if ((length += g + 1) > width) break;
12312               g = grouping[j = (j + 1) % grouping.length];
12313             }
12314
12315             return t.reverse().join(thousands);
12316           };
12317         }
12318
12319         function formatNumerals(numerals) {
12320           return function(value) {
12321             return value.replace(/[0-9]/g, function(i) {
12322               return numerals[+i];
12323             });
12324           };
12325         }
12326
12327         // [[fill]align][sign][symbol][0][width][,][.precision][~][type]
12328         var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;
12329
12330         function formatSpecifier(specifier) {
12331           return new FormatSpecifier(specifier);
12332         }
12333
12334         formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof
12335
12336         function FormatSpecifier(specifier) {
12337           if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier);
12338           var match;
12339           this.fill = match[1] || " ";
12340           this.align = match[2] || ">";
12341           this.sign = match[3] || "-";
12342           this.symbol = match[4] || "";
12343           this.zero = !!match[5];
12344           this.width = match[6] && +match[6];
12345           this.comma = !!match[7];
12346           this.precision = match[8] && +match[8].slice(1);
12347           this.trim = !!match[9];
12348           this.type = match[10] || "";
12349         }
12350
12351         FormatSpecifier.prototype.toString = function() {
12352           return this.fill
12353               + this.align
12354               + this.sign
12355               + this.symbol
12356               + (this.zero ? "0" : "")
12357               + (this.width == null ? "" : Math.max(1, this.width | 0))
12358               + (this.comma ? "," : "")
12359               + (this.precision == null ? "" : "." + Math.max(0, this.precision | 0))
12360               + (this.trim ? "~" : "")
12361               + this.type;
12362         };
12363
12364         // Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k.
12365         function formatTrim(s) {
12366           out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) {
12367             switch (s[i]) {
12368               case ".": i0 = i1 = i; break;
12369               case "0": if (i0 === 0) i0 = i; i1 = i; break;
12370               default: if (i0 > 0) { if (!+s[i]) break out; i0 = 0; } break;
12371             }
12372           }
12373           return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s;
12374         }
12375
12376         var prefixExponent;
12377
12378         function formatPrefixAuto(x, p) {
12379           var d = formatDecimal(x, p);
12380           if (!d) return x + "";
12381           var coefficient = d[0],
12382               exponent = d[1],
12383               i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1,
12384               n = coefficient.length;
12385           return i === n ? coefficient
12386               : i > n ? coefficient + new Array(i - n + 1).join("0")
12387               : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i)
12388               : "0." + new Array(1 - i).join("0") + formatDecimal(x, Math.max(0, p + i - 1))[0]; // less than 1y!
12389         }
12390
12391         function formatRounded(x, p) {
12392           var d = formatDecimal(x, p);
12393           if (!d) return x + "";
12394           var coefficient = d[0],
12395               exponent = d[1];
12396           return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient
12397               : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1)
12398               : coefficient + new Array(exponent - coefficient.length + 2).join("0");
12399         }
12400
12401         var formatTypes = {
12402           "%": function(x, p) { return (x * 100).toFixed(p); },
12403           "b": function(x) { return Math.round(x).toString(2); },
12404           "c": function(x) { return x + ""; },
12405           "d": function(x) { return Math.round(x).toString(10); },
12406           "e": function(x, p) { return x.toExponential(p); },
12407           "f": function(x, p) { return x.toFixed(p); },
12408           "g": function(x, p) { return x.toPrecision(p); },
12409           "o": function(x) { return Math.round(x).toString(8); },
12410           "p": function(x, p) { return formatRounded(x * 100, p); },
12411           "r": formatRounded,
12412           "s": formatPrefixAuto,
12413           "X": function(x) { return Math.round(x).toString(16).toUpperCase(); },
12414           "x": function(x) { return Math.round(x).toString(16); }
12415         };
12416
12417         function identity$3(x) {
12418           return x;
12419         }
12420
12421         var prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"];
12422
12423         function formatLocale(locale) {
12424           var group = locale.grouping && locale.thousands ? formatGroup(locale.grouping, locale.thousands) : identity$3,
12425               currency = locale.currency,
12426               decimal = locale.decimal,
12427               numerals = locale.numerals ? formatNumerals(locale.numerals) : identity$3,
12428               percent = locale.percent || "%";
12429
12430           function newFormat(specifier) {
12431             specifier = formatSpecifier(specifier);
12432
12433             var fill = specifier.fill,
12434                 align = specifier.align,
12435                 sign = specifier.sign,
12436                 symbol = specifier.symbol,
12437                 zero = specifier.zero,
12438                 width = specifier.width,
12439                 comma = specifier.comma,
12440                 precision = specifier.precision,
12441                 trim = specifier.trim,
12442                 type = specifier.type;
12443
12444             // The "n" type is an alias for ",g".
12445             if (type === "n") comma = true, type = "g";
12446
12447             // The "" type, and any invalid type, is an alias for ".12~g".
12448             else if (!formatTypes[type]) precision == null && (precision = 12), trim = true, type = "g";
12449
12450             // If zero fill is specified, padding goes after sign and before digits.
12451             if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "=";
12452
12453             // Compute the prefix and suffix.
12454             // For SI-prefix, the suffix is lazily computed.
12455             var prefix = symbol === "$" ? currency[0] : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "",
12456                 suffix = symbol === "$" ? currency[1] : /[%p]/.test(type) ? percent : "";
12457
12458             // What format function should we use?
12459             // Is this an integer type?
12460             // Can this type generate exponential notation?
12461             var formatType = formatTypes[type],
12462                 maybeSuffix = /[defgprs%]/.test(type);
12463
12464             // Set the default precision if not specified,
12465             // or clamp the specified precision to the supported range.
12466             // For significant precision, it must be in [1, 21].
12467             // For fixed precision, it must be in [0, 20].
12468             precision = precision == null ? 6
12469                 : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision))
12470                 : Math.max(0, Math.min(20, precision));
12471
12472             function format(value) {
12473               var valuePrefix = prefix,
12474                   valueSuffix = suffix,
12475                   i, n, c;
12476
12477               if (type === "c") {
12478                 valueSuffix = formatType(value) + valueSuffix;
12479                 value = "";
12480               } else {
12481                 value = +value;
12482
12483                 // Perform the initial formatting.
12484                 var valueNegative = value < 0;
12485                 value = formatType(Math.abs(value), precision);
12486
12487                 // Trim insignificant zeros.
12488                 if (trim) value = formatTrim(value);
12489
12490                 // If a negative value rounds to zero during formatting, treat as positive.
12491                 if (valueNegative && +value === 0) valueNegative = false;
12492
12493                 // Compute the prefix and suffix.
12494                 valuePrefix = (valueNegative ? (sign === "(" ? sign : "-") : sign === "-" || sign === "(" ? "" : sign) + valuePrefix;
12495                 valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : "");
12496
12497                 // Break the formatted value into the integer “value” part that can be
12498                 // grouped, and fractional or exponential “suffix” part that is not.
12499                 if (maybeSuffix) {
12500                   i = -1, n = value.length;
12501                   while (++i < n) {
12502                     if (c = value.charCodeAt(i), 48 > c || c > 57) {
12503                       valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix;
12504                       value = value.slice(0, i);
12505                       break;
12506                     }
12507                   }
12508                 }
12509               }
12510
12511               // If the fill character is not "0", grouping is applied before padding.
12512               if (comma && !zero) value = group(value, Infinity);
12513
12514               // Compute the padding.
12515               var length = valuePrefix.length + value.length + valueSuffix.length,
12516                   padding = length < width ? new Array(width - length + 1).join(fill) : "";
12517
12518               // If the fill character is "0", grouping is applied after padding.
12519               if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = "";
12520
12521               // Reconstruct the final output based on the desired alignment.
12522               switch (align) {
12523                 case "<": value = valuePrefix + value + valueSuffix + padding; break;
12524                 case "=": value = valuePrefix + padding + value + valueSuffix; break;
12525                 case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break;
12526                 default: value = padding + valuePrefix + value + valueSuffix; break;
12527               }
12528
12529               return numerals(value);
12530             }
12531
12532             format.toString = function() {
12533               return specifier + "";
12534             };
12535
12536             return format;
12537           }
12538
12539           function formatPrefix(specifier, value) {
12540             var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)),
12541                 e = Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3,
12542                 k = Math.pow(10, -e),
12543                 prefix = prefixes[8 + e / 3];
12544             return function(value) {
12545               return f(k * value) + prefix;
12546             };
12547           }
12548
12549           return {
12550             format: newFormat,
12551             formatPrefix: formatPrefix
12552           };
12553         }
12554
12555         var locale;
12556         var format;
12557         var formatPrefix;
12558
12559         defaultLocale({
12560           decimal: ".",
12561           thousands: ",",
12562           grouping: [3],
12563           currency: ["$", ""]
12564         });
12565
12566         function defaultLocale(definition) {
12567           locale = formatLocale(definition);
12568           format = locale.format;
12569           formatPrefix = locale.formatPrefix;
12570           return locale;
12571         }
12572
12573         function precisionFixed(step) {
12574           return Math.max(0, -exponent$1(Math.abs(step)));
12575         }
12576
12577         function precisionPrefix(step, value) {
12578           return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent$1(value) / 3))) * 3 - exponent$1(Math.abs(step)));
12579         }
12580
12581         function precisionRound(step, max) {
12582           step = Math.abs(step), max = Math.abs(max) - step;
12583           return Math.max(0, exponent$1(max) - exponent$1(step)) + 1;
12584         }
12585
12586         // Adds floating point numbers with twice the normal precision.
12587         // Reference: J. R. Shewchuk, Adaptive Precision Floating-Point Arithmetic and
12588         // Fast Robust Geometric Predicates, Discrete & Computational Geometry 18(3)
12589         // 305–363 (1997).
12590         // Code adapted from GeographicLib by Charles F. F. Karney,
12591         // http://geographiclib.sourceforge.net/
12592
12593         function adder() {
12594           return new Adder;
12595         }
12596
12597         function Adder() {
12598           this.reset();
12599         }
12600
12601         Adder.prototype = {
12602           constructor: Adder,
12603           reset: function() {
12604             this.s = // rounded value
12605             this.t = 0; // exact error
12606           },
12607           add: function(y) {
12608             add$1(temp, y, this.t);
12609             add$1(this, temp.s, this.s);
12610             if (this.s) this.t += temp.t;
12611             else this.s = temp.t;
12612           },
12613           valueOf: function() {
12614             return this.s;
12615           }
12616         };
12617
12618         var temp = new Adder;
12619
12620         function add$1(adder, a, b) {
12621           var x = adder.s = a + b,
12622               bv = x - a,
12623               av = x - bv;
12624           adder.t = (a - av) + (b - bv);
12625         }
12626
12627         var epsilon$2 = 1e-6;
12628         var epsilon2$1 = 1e-12;
12629         var pi$3 = Math.PI;
12630         var halfPi$2 = pi$3 / 2;
12631         var quarterPi = pi$3 / 4;
12632         var tau$3 = pi$3 * 2;
12633
12634         var degrees$1 = 180 / pi$3;
12635         var radians = pi$3 / 180;
12636
12637         var abs$2 = Math.abs;
12638         var atan = Math.atan;
12639         var atan2 = Math.atan2;
12640         var cos$1 = Math.cos;
12641         var ceil = Math.ceil;
12642         var exp = Math.exp;
12643         var log = Math.log;
12644         var pow = Math.pow;
12645         var sin$1 = Math.sin;
12646         var sign$2 = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; };
12647         var sqrt = Math.sqrt;
12648         var tan = Math.tan;
12649
12650         function acos(x) {
12651           return x > 1 ? 0 : x < -1 ? pi$3 : Math.acos(x);
12652         }
12653
12654         function asin(x) {
12655           return x > 1 ? halfPi$2 : x < -1 ? -halfPi$2 : Math.asin(x);
12656         }
12657
12658         function haversin(x) {
12659           return (x = sin$1(x / 2)) * x;
12660         }
12661
12662         function noop$4() {}
12663
12664         function streamGeometry(geometry, stream) {
12665           if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) {
12666             streamGeometryType[geometry.type](geometry, stream);
12667           }
12668         }
12669
12670         var streamObjectType = {
12671           Feature: function(object, stream) {
12672             streamGeometry(object.geometry, stream);
12673           },
12674           FeatureCollection: function(object, stream) {
12675             var features = object.features, i = -1, n = features.length;
12676             while (++i < n) streamGeometry(features[i].geometry, stream);
12677           }
12678         };
12679
12680         var streamGeometryType = {
12681           Sphere: function(object, stream) {
12682             stream.sphere();
12683           },
12684           Point: function(object, stream) {
12685             object = object.coordinates;
12686             stream.point(object[0], object[1], object[2]);
12687           },
12688           MultiPoint: function(object, stream) {
12689             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12690             while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]);
12691           },
12692           LineString: function(object, stream) {
12693             streamLine(object.coordinates, stream, 0);
12694           },
12695           MultiLineString: function(object, stream) {
12696             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12697             while (++i < n) streamLine(coordinates[i], stream, 0);
12698           },
12699           Polygon: function(object, stream) {
12700             streamPolygon(object.coordinates, stream);
12701           },
12702           MultiPolygon: function(object, stream) {
12703             var coordinates = object.coordinates, i = -1, n = coordinates.length;
12704             while (++i < n) streamPolygon(coordinates[i], stream);
12705           },
12706           GeometryCollection: function(object, stream) {
12707             var geometries = object.geometries, i = -1, n = geometries.length;
12708             while (++i < n) streamGeometry(geometries[i], stream);
12709           }
12710         };
12711
12712         function streamLine(coordinates, stream, closed) {
12713           var i = -1, n = coordinates.length - closed, coordinate;
12714           stream.lineStart();
12715           while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]);
12716           stream.lineEnd();
12717         }
12718
12719         function streamPolygon(coordinates, stream) {
12720           var i = -1, n = coordinates.length;
12721           stream.polygonStart();
12722           while (++i < n) streamLine(coordinates[i], stream, 1);
12723           stream.polygonEnd();
12724         }
12725
12726         function d3_geoStream(object, stream) {
12727           if (object && streamObjectType.hasOwnProperty(object.type)) {
12728             streamObjectType[object.type](object, stream);
12729           } else {
12730             streamGeometry(object, stream);
12731           }
12732         }
12733
12734         var areaRingSum = adder();
12735
12736         var areaSum = adder(),
12737             lambda00,
12738             phi00,
12739             lambda0,
12740             cosPhi0,
12741             sinPhi0;
12742
12743         var areaStream = {
12744           point: noop$4,
12745           lineStart: noop$4,
12746           lineEnd: noop$4,
12747           polygonStart: function() {
12748             areaRingSum.reset();
12749             areaStream.lineStart = areaRingStart;
12750             areaStream.lineEnd = areaRingEnd;
12751           },
12752           polygonEnd: function() {
12753             var areaRing = +areaRingSum;
12754             areaSum.add(areaRing < 0 ? tau$3 + areaRing : areaRing);
12755             this.lineStart = this.lineEnd = this.point = noop$4;
12756           },
12757           sphere: function() {
12758             areaSum.add(tau$3);
12759           }
12760         };
12761
12762         function areaRingStart() {
12763           areaStream.point = areaPointFirst;
12764         }
12765
12766         function areaRingEnd() {
12767           areaPoint(lambda00, phi00);
12768         }
12769
12770         function areaPointFirst(lambda, phi) {
12771           areaStream.point = areaPoint;
12772           lambda00 = lambda, phi00 = phi;
12773           lambda *= radians, phi *= radians;
12774           lambda0 = lambda, cosPhi0 = cos$1(phi = phi / 2 + quarterPi), sinPhi0 = sin$1(phi);
12775         }
12776
12777         function areaPoint(lambda, phi) {
12778           lambda *= radians, phi *= radians;
12779           phi = phi / 2 + quarterPi; // half the angular distance from south pole
12780
12781           // Spherical excess E for a spherical triangle with vertices: south pole,
12782           // previous point, current point.  Uses a formula derived from Cagnoli’s
12783           // theorem.  See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2).
12784           var dLambda = lambda - lambda0,
12785               sdLambda = dLambda >= 0 ? 1 : -1,
12786               adLambda = sdLambda * dLambda,
12787               cosPhi = cos$1(phi),
12788               sinPhi = sin$1(phi),
12789               k = sinPhi0 * sinPhi,
12790               u = cosPhi0 * cosPhi + k * cos$1(adLambda),
12791               v = k * sdLambda * sin$1(adLambda);
12792           areaRingSum.add(atan2(v, u));
12793
12794           // Advance the previous points.
12795           lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi;
12796         }
12797
12798         function d3_geoArea(object) {
12799           areaSum.reset();
12800           d3_geoStream(object, areaStream);
12801           return areaSum * 2;
12802         }
12803
12804         function spherical(cartesian) {
12805           return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])];
12806         }
12807
12808         function cartesian(spherical) {
12809           var lambda = spherical[0], phi = spherical[1], cosPhi = cos$1(phi);
12810           return [cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi)];
12811         }
12812
12813         function cartesianDot(a, b) {
12814           return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
12815         }
12816
12817         function cartesianCross(a, b) {
12818           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]];
12819         }
12820
12821         // TODO return a
12822         function cartesianAddInPlace(a, b) {
12823           a[0] += b[0], a[1] += b[1], a[2] += b[2];
12824         }
12825
12826         function cartesianScale(vector, k) {
12827           return [vector[0] * k, vector[1] * k, vector[2] * k];
12828         }
12829
12830         // TODO return d
12831         function cartesianNormalizeInPlace(d) {
12832           var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
12833           d[0] /= l, d[1] /= l, d[2] /= l;
12834         }
12835
12836         var lambda0$1, phi0, lambda1, phi1, // bounds
12837             lambda2, // previous lambda-coordinate
12838             lambda00$1, phi00$1, // first point
12839             p0, // previous 3D point
12840             deltaSum = adder(),
12841             ranges,
12842             range;
12843
12844         var boundsStream = {
12845           point: boundsPoint,
12846           lineStart: boundsLineStart,
12847           lineEnd: boundsLineEnd,
12848           polygonStart: function() {
12849             boundsStream.point = boundsRingPoint;
12850             boundsStream.lineStart = boundsRingStart;
12851             boundsStream.lineEnd = boundsRingEnd;
12852             deltaSum.reset();
12853             areaStream.polygonStart();
12854           },
12855           polygonEnd: function() {
12856             areaStream.polygonEnd();
12857             boundsStream.point = boundsPoint;
12858             boundsStream.lineStart = boundsLineStart;
12859             boundsStream.lineEnd = boundsLineEnd;
12860             if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90);
12861             else if (deltaSum > epsilon$2) phi1 = 90;
12862             else if (deltaSum < -epsilon$2) phi0 = -90;
12863             range[0] = lambda0$1, range[1] = lambda1;
12864           }
12865         };
12866
12867         function boundsPoint(lambda, phi) {
12868           ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12869           if (phi < phi0) phi0 = phi;
12870           if (phi > phi1) phi1 = phi;
12871         }
12872
12873         function linePoint(lambda, phi) {
12874           var p = cartesian([lambda * radians, phi * radians]);
12875           if (p0) {
12876             var normal = cartesianCross(p0, p),
12877                 equatorial = [normal[1], -normal[0], 0],
12878                 inflection = cartesianCross(equatorial, normal);
12879             cartesianNormalizeInPlace(inflection);
12880             inflection = spherical(inflection);
12881             var delta = lambda - lambda2,
12882                 sign = delta > 0 ? 1 : -1,
12883                 lambdai = inflection[0] * degrees$1 * sign,
12884                 phii,
12885                 antimeridian = abs$2(delta) > 180;
12886             if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12887               phii = inflection[1] * degrees$1;
12888               if (phii > phi1) phi1 = phii;
12889             } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) {
12890               phii = -inflection[1] * degrees$1;
12891               if (phii < phi0) phi0 = phii;
12892             } else {
12893               if (phi < phi0) phi0 = phi;
12894               if (phi > phi1) phi1 = phi;
12895             }
12896             if (antimeridian) {
12897               if (lambda < lambda2) {
12898                 if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12899               } else {
12900                 if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12901               }
12902             } else {
12903               if (lambda1 >= lambda0$1) {
12904                 if (lambda < lambda0$1) lambda0$1 = lambda;
12905                 if (lambda > lambda1) lambda1 = lambda;
12906               } else {
12907                 if (lambda > lambda2) {
12908                   if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda;
12909                 } else {
12910                   if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda;
12911                 }
12912               }
12913             }
12914           } else {
12915             ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]);
12916           }
12917           if (phi < phi0) phi0 = phi;
12918           if (phi > phi1) phi1 = phi;
12919           p0 = p, lambda2 = lambda;
12920         }
12921
12922         function boundsLineStart() {
12923           boundsStream.point = linePoint;
12924         }
12925
12926         function boundsLineEnd() {
12927           range[0] = lambda0$1, range[1] = lambda1;
12928           boundsStream.point = boundsPoint;
12929           p0 = null;
12930         }
12931
12932         function boundsRingPoint(lambda, phi) {
12933           if (p0) {
12934             var delta = lambda - lambda2;
12935             deltaSum.add(abs$2(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta);
12936           } else {
12937             lambda00$1 = lambda, phi00$1 = phi;
12938           }
12939           areaStream.point(lambda, phi);
12940           linePoint(lambda, phi);
12941         }
12942
12943         function boundsRingStart() {
12944           areaStream.lineStart();
12945         }
12946
12947         function boundsRingEnd() {
12948           boundsRingPoint(lambda00$1, phi00$1);
12949           areaStream.lineEnd();
12950           if (abs$2(deltaSum) > epsilon$2) lambda0$1 = -(lambda1 = 180);
12951           range[0] = lambda0$1, range[1] = lambda1;
12952           p0 = null;
12953         }
12954
12955         // Finds the left-right distance between two longitudes.
12956         // This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want
12957         // the distance between ±180° to be 360°.
12958         function angle(lambda0, lambda1) {
12959           return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1;
12960         }
12961
12962         function rangeCompare(a, b) {
12963           return a[0] - b[0];
12964         }
12965
12966         function rangeContains(range, x) {
12967           return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
12968         }
12969
12970         function d3_geoBounds(feature) {
12971           var i, n, a, b, merged, deltaMax, delta;
12972
12973           phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity);
12974           ranges = [];
12975           d3_geoStream(feature, boundsStream);
12976
12977           // First, sort ranges by their minimum longitudes.
12978           if (n = ranges.length) {
12979             ranges.sort(rangeCompare);
12980
12981             // Then, merge any ranges that overlap.
12982             for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) {
12983               b = ranges[i];
12984               if (rangeContains(a, b[0]) || rangeContains(a, b[1])) {
12985                 if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
12986                 if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
12987               } else {
12988                 merged.push(a = b);
12989               }
12990             }
12991
12992             // Finally, find the largest gap between the merged ranges.
12993             // The final bounding box will be the inverse of this gap.
12994             for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) {
12995               b = merged[i];
12996               if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1];
12997             }
12998           }
12999
13000           ranges = range = null;
13001
13002           return lambda0$1 === Infinity || phi0 === Infinity
13003               ? [[NaN, NaN], [NaN, NaN]]
13004               : [[lambda0$1, phi0], [lambda1, phi1]];
13005         }
13006
13007         var W0, W1,
13008             X0, Y0, Z0,
13009             X1, Y1, Z1,
13010             X2, Y2, Z2,
13011             lambda00$2, phi00$2, // first point
13012             x0, y0, z0; // previous point
13013
13014         var centroidStream = {
13015           sphere: noop$4,
13016           point: centroidPoint,
13017           lineStart: centroidLineStart,
13018           lineEnd: centroidLineEnd,
13019           polygonStart: function() {
13020             centroidStream.lineStart = centroidRingStart;
13021             centroidStream.lineEnd = centroidRingEnd;
13022           },
13023           polygonEnd: function() {
13024             centroidStream.lineStart = centroidLineStart;
13025             centroidStream.lineEnd = centroidLineEnd;
13026           }
13027         };
13028
13029         // Arithmetic mean of Cartesian vectors.
13030         function centroidPoint(lambda, phi) {
13031           lambda *= radians, phi *= radians;
13032           var cosPhi = cos$1(phi);
13033           centroidPointCartesian(cosPhi * cos$1(lambda), cosPhi * sin$1(lambda), sin$1(phi));
13034         }
13035
13036         function centroidPointCartesian(x, y, z) {
13037           ++W0;
13038           X0 += (x - X0) / W0;
13039           Y0 += (y - Y0) / W0;
13040           Z0 += (z - Z0) / W0;
13041         }
13042
13043         function centroidLineStart() {
13044           centroidStream.point = centroidLinePointFirst;
13045         }
13046
13047         function centroidLinePointFirst(lambda, phi) {
13048           lambda *= radians, phi *= radians;
13049           var cosPhi = cos$1(phi);
13050           x0 = cosPhi * cos$1(lambda);
13051           y0 = cosPhi * sin$1(lambda);
13052           z0 = sin$1(phi);
13053           centroidStream.point = centroidLinePoint;
13054           centroidPointCartesian(x0, y0, z0);
13055         }
13056
13057         function centroidLinePoint(lambda, phi) {
13058           lambda *= radians, phi *= radians;
13059           var cosPhi = cos$1(phi),
13060               x = cosPhi * cos$1(lambda),
13061               y = cosPhi * sin$1(lambda),
13062               z = sin$1(phi),
13063               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);
13064           W1 += w;
13065           X1 += w * (x0 + (x0 = x));
13066           Y1 += w * (y0 + (y0 = y));
13067           Z1 += w * (z0 + (z0 = z));
13068           centroidPointCartesian(x0, y0, z0);
13069         }
13070
13071         function centroidLineEnd() {
13072           centroidStream.point = centroidPoint;
13073         }
13074
13075         // See J. E. Brock, The Inertia Tensor for a Spherical Triangle,
13076         // J. Applied Mechanics 42, 239 (1975).
13077         function centroidRingStart() {
13078           centroidStream.point = centroidRingPointFirst;
13079         }
13080
13081         function centroidRingEnd() {
13082           centroidRingPoint(lambda00$2, phi00$2);
13083           centroidStream.point = centroidPoint;
13084         }
13085
13086         function centroidRingPointFirst(lambda, phi) {
13087           lambda00$2 = lambda, phi00$2 = phi;
13088           lambda *= radians, phi *= radians;
13089           centroidStream.point = centroidRingPoint;
13090           var cosPhi = cos$1(phi);
13091           x0 = cosPhi * cos$1(lambda);
13092           y0 = cosPhi * sin$1(lambda);
13093           z0 = sin$1(phi);
13094           centroidPointCartesian(x0, y0, z0);
13095         }
13096
13097         function centroidRingPoint(lambda, phi) {
13098           lambda *= radians, phi *= radians;
13099           var cosPhi = cos$1(phi),
13100               x = cosPhi * cos$1(lambda),
13101               y = cosPhi * sin$1(lambda),
13102               z = sin$1(phi),
13103               cx = y0 * z - z0 * y,
13104               cy = z0 * x - x0 * z,
13105               cz = x0 * y - y0 * x,
13106               m = sqrt(cx * cx + cy * cy + cz * cz),
13107               w = asin(m), // line weight = angle
13108               v = m && -w / m; // area weight multiplier
13109           X2 += v * cx;
13110           Y2 += v * cy;
13111           Z2 += v * cz;
13112           W1 += w;
13113           X1 += w * (x0 + (x0 = x));
13114           Y1 += w * (y0 + (y0 = y));
13115           Z1 += w * (z0 + (z0 = z));
13116           centroidPointCartesian(x0, y0, z0);
13117         }
13118
13119         function d3_geoCentroid(object) {
13120           W0 = W1 =
13121           X0 = Y0 = Z0 =
13122           X1 = Y1 = Z1 =
13123           X2 = Y2 = Z2 = 0;
13124           d3_geoStream(object, centroidStream);
13125
13126           var x = X2,
13127               y = Y2,
13128               z = Z2,
13129               m = x * x + y * y + z * z;
13130
13131           // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid.
13132           if (m < epsilon2$1) {
13133             x = X1, y = Y1, z = Z1;
13134             // If the feature has zero length, fall back to arithmetic mean of point vectors.
13135             if (W1 < epsilon$2) x = X0, y = Y0, z = Z0;
13136             m = x * x + y * y + z * z;
13137             // If the feature still has an undefined ccentroid, then return.
13138             if (m < epsilon2$1) return [NaN, NaN];
13139           }
13140
13141           return [atan2(y, x) * degrees$1, asin(z / sqrt(m)) * degrees$1];
13142         }
13143
13144         function constant$8(x) {
13145           return function() {
13146             return x;
13147           };
13148         }
13149
13150         function compose(a, b) {
13151
13152           function compose(x, y) {
13153             return x = a(x, y), b(x[0], x[1]);
13154           }
13155
13156           if (a.invert && b.invert) compose.invert = function(x, y) {
13157             return x = b.invert(x, y), x && a.invert(x[0], x[1]);
13158           };
13159
13160           return compose;
13161         }
13162
13163         function rotationIdentity(lambda, phi) {
13164           return [abs$2(lambda) > pi$3 ? lambda + Math.round(-lambda / tau$3) * tau$3 : lambda, phi];
13165         }
13166
13167         rotationIdentity.invert = rotationIdentity;
13168
13169         function rotateRadians(deltaLambda, deltaPhi, deltaGamma) {
13170           return (deltaLambda %= tau$3) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma))
13171             : rotationLambda(deltaLambda))
13172             : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma)
13173             : rotationIdentity);
13174         }
13175
13176         function forwardRotationLambda(deltaLambda) {
13177           return function(lambda, phi) {
13178             return lambda += deltaLambda, [lambda > pi$3 ? lambda - tau$3 : lambda < -pi$3 ? lambda + tau$3 : lambda, phi];
13179           };
13180         }
13181
13182         function rotationLambda(deltaLambda) {
13183           var rotation = forwardRotationLambda(deltaLambda);
13184           rotation.invert = forwardRotationLambda(-deltaLambda);
13185           return rotation;
13186         }
13187
13188         function rotationPhiGamma(deltaPhi, deltaGamma) {
13189           var cosDeltaPhi = cos$1(deltaPhi),
13190               sinDeltaPhi = sin$1(deltaPhi),
13191               cosDeltaGamma = cos$1(deltaGamma),
13192               sinDeltaGamma = sin$1(deltaGamma);
13193
13194           function rotation(lambda, phi) {
13195             var cosPhi = cos$1(phi),
13196                 x = cos$1(lambda) * cosPhi,
13197                 y = sin$1(lambda) * cosPhi,
13198                 z = sin$1(phi),
13199                 k = z * cosDeltaPhi + x * sinDeltaPhi;
13200             return [
13201               atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi),
13202               asin(k * cosDeltaGamma + y * sinDeltaGamma)
13203             ];
13204           }
13205
13206           rotation.invert = function(lambda, phi) {
13207             var cosPhi = cos$1(phi),
13208                 x = cos$1(lambda) * cosPhi,
13209                 y = sin$1(lambda) * cosPhi,
13210                 z = sin$1(phi),
13211                 k = z * cosDeltaGamma - y * sinDeltaGamma;
13212             return [
13213               atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi),
13214               asin(k * cosDeltaPhi - x * sinDeltaPhi)
13215             ];
13216           };
13217
13218           return rotation;
13219         }
13220
13221         function rotation(rotate) {
13222           rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0);
13223
13224           function forward(coordinates) {
13225             coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians);
13226             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13227           }
13228
13229           forward.invert = function(coordinates) {
13230             coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians);
13231             return coordinates[0] *= degrees$1, coordinates[1] *= degrees$1, coordinates;
13232           };
13233
13234           return forward;
13235         }
13236
13237         // Generates a circle centered at [0°, 0°], with a given radius and precision.
13238         function circleStream(stream, radius, delta, direction, t0, t1) {
13239           if (!delta) return;
13240           var cosRadius = cos$1(radius),
13241               sinRadius = sin$1(radius),
13242               step = direction * delta;
13243           if (t0 == null) {
13244             t0 = radius + direction * tau$3;
13245             t1 = radius - step / 2;
13246           } else {
13247             t0 = circleRadius(cosRadius, t0);
13248             t1 = circleRadius(cosRadius, t1);
13249             if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau$3;
13250           }
13251           for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) {
13252             point = spherical([cosRadius, -sinRadius * cos$1(t), -sinRadius * sin$1(t)]);
13253             stream.point(point[0], point[1]);
13254           }
13255         }
13256
13257         // Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0].
13258         function circleRadius(cosRadius, point) {
13259           point = cartesian(point), point[0] -= cosRadius;
13260           cartesianNormalizeInPlace(point);
13261           var radius = acos(-point[1]);
13262           return ((-point[2] < 0 ? -radius : radius) + tau$3 - epsilon$2) % tau$3;
13263         }
13264
13265         function circle() {
13266           var center = constant$8([0, 0]),
13267               radius = constant$8(90),
13268               precision = constant$8(6),
13269               ring,
13270               rotate,
13271               stream = {point: point};
13272
13273           function point(x, y) {
13274             ring.push(x = rotate(x, y));
13275             x[0] *= degrees$1, x[1] *= degrees$1;
13276           }
13277
13278           function circle() {
13279             var c = center.apply(this, arguments),
13280                 r = radius.apply(this, arguments) * radians,
13281                 p = precision.apply(this, arguments) * radians;
13282             ring = [];
13283             rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert;
13284             circleStream(stream, r, p, 1);
13285             c = {type: "Polygon", coordinates: [ring]};
13286             ring = rotate = null;
13287             return c;
13288           }
13289
13290           circle.center = function(_) {
13291             return arguments.length ? (center = typeof _ === "function" ? _ : constant$8([+_[0], +_[1]]), circle) : center;
13292           };
13293
13294           circle.radius = function(_) {
13295             return arguments.length ? (radius = typeof _ === "function" ? _ : constant$8(+_), circle) : radius;
13296           };
13297
13298           circle.precision = function(_) {
13299             return arguments.length ? (precision = typeof _ === "function" ? _ : constant$8(+_), circle) : precision;
13300           };
13301
13302           return circle;
13303         }
13304
13305         function clipBuffer() {
13306           var lines = [],
13307               line;
13308           return {
13309             point: function(x, y) {
13310               line.push([x, y]);
13311             },
13312             lineStart: function() {
13313               lines.push(line = []);
13314             },
13315             lineEnd: noop$4,
13316             rejoin: function() {
13317               if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
13318             },
13319             result: function() {
13320               var result = lines;
13321               lines = [];
13322               line = null;
13323               return result;
13324             }
13325           };
13326         }
13327
13328         function pointEqual(a, b) {
13329           return abs$2(a[0] - b[0]) < epsilon$2 && abs$2(a[1] - b[1]) < epsilon$2;
13330         }
13331
13332         function Intersection(point, points, other, entry) {
13333           this.x = point;
13334           this.z = points;
13335           this.o = other; // another intersection
13336           this.e = entry; // is an entry?
13337           this.v = false; // visited
13338           this.n = this.p = null; // next & previous
13339         }
13340
13341         // A generalized polygon clipping algorithm: given a polygon that has been cut
13342         // into its visible line segments, and rejoins the segments by interpolating
13343         // along the clip edge.
13344         function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) {
13345           var subject = [],
13346               clip = [],
13347               i,
13348               n;
13349
13350           segments.forEach(function(segment) {
13351             if ((n = segment.length - 1) <= 0) return;
13352             var n, p0 = segment[0], p1 = segment[n], x;
13353
13354             // If the first and last points of a segment are coincident, then treat as a
13355             // closed ring. TODO if all rings are closed, then the winding order of the
13356             // exterior ring should be checked.
13357             if (pointEqual(p0, p1)) {
13358               stream.lineStart();
13359               for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]);
13360               stream.lineEnd();
13361               return;
13362             }
13363
13364             subject.push(x = new Intersection(p0, segment, null, true));
13365             clip.push(x.o = new Intersection(p0, null, x, false));
13366             subject.push(x = new Intersection(p1, segment, null, false));
13367             clip.push(x.o = new Intersection(p1, null, x, true));
13368           });
13369
13370           if (!subject.length) return;
13371
13372           clip.sort(compareIntersection);
13373           link$1(subject);
13374           link$1(clip);
13375
13376           for (i = 0, n = clip.length; i < n; ++i) {
13377             clip[i].e = startInside = !startInside;
13378           }
13379
13380           var start = subject[0],
13381               points,
13382               point;
13383
13384           while (1) {
13385             // Find first unvisited intersection.
13386             var current = start,
13387                 isSubject = true;
13388             while (current.v) if ((current = current.n) === start) return;
13389             points = current.z;
13390             stream.lineStart();
13391             do {
13392               current.v = current.o.v = true;
13393               if (current.e) {
13394                 if (isSubject) {
13395                   for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]);
13396                 } else {
13397                   interpolate(current.x, current.n.x, 1, stream);
13398                 }
13399                 current = current.n;
13400               } else {
13401                 if (isSubject) {
13402                   points = current.p.z;
13403                   for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]);
13404                 } else {
13405                   interpolate(current.x, current.p.x, -1, stream);
13406                 }
13407                 current = current.p;
13408               }
13409               current = current.o;
13410               points = current.z;
13411               isSubject = !isSubject;
13412             } while (!current.v);
13413             stream.lineEnd();
13414           }
13415         }
13416
13417         function link$1(array) {
13418           if (!(n = array.length)) return;
13419           var n,
13420               i = 0,
13421               a = array[0],
13422               b;
13423           while (++i < n) {
13424             a.n = b = array[i];
13425             b.p = a;
13426             a = b;
13427           }
13428           a.n = b = array[0];
13429           b.p = a;
13430         }
13431
13432         var sum$1 = adder();
13433
13434         function polygonContains(polygon, point) {
13435           var lambda = point[0],
13436               phi = point[1],
13437               sinPhi = sin$1(phi),
13438               normal = [sin$1(lambda), -cos$1(lambda), 0],
13439               angle = 0,
13440               winding = 0;
13441
13442           sum$1.reset();
13443
13444           if (sinPhi === 1) phi = halfPi$2 + epsilon$2;
13445           else if (sinPhi === -1) phi = -halfPi$2 - epsilon$2;
13446
13447           for (var i = 0, n = polygon.length; i < n; ++i) {
13448             if (!(m = (ring = polygon[i]).length)) continue;
13449             var ring,
13450                 m,
13451                 point0 = ring[m - 1],
13452                 lambda0 = point0[0],
13453                 phi0 = point0[1] / 2 + quarterPi,
13454                 sinPhi0 = sin$1(phi0),
13455                 cosPhi0 = cos$1(phi0);
13456
13457             for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) {
13458               var point1 = ring[j],
13459                   lambda1 = point1[0],
13460                   phi1 = point1[1] / 2 + quarterPi,
13461                   sinPhi1 = sin$1(phi1),
13462                   cosPhi1 = cos$1(phi1),
13463                   delta = lambda1 - lambda0,
13464                   sign = delta >= 0 ? 1 : -1,
13465                   absDelta = sign * delta,
13466                   antimeridian = absDelta > pi$3,
13467                   k = sinPhi0 * sinPhi1;
13468
13469               sum$1.add(atan2(k * sign * sin$1(absDelta), cosPhi0 * cosPhi1 + k * cos$1(absDelta)));
13470               angle += antimeridian ? delta + sign * tau$3 : delta;
13471
13472               // Are the longitudes either side of the point’s meridian (lambda),
13473               // and are the latitudes smaller than the parallel (phi)?
13474               if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) {
13475                 var arc = cartesianCross(cartesian(point0), cartesian(point1));
13476                 cartesianNormalizeInPlace(arc);
13477                 var intersection = cartesianCross(normal, arc);
13478                 cartesianNormalizeInPlace(intersection);
13479                 var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]);
13480                 if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) {
13481                   winding += antimeridian ^ delta >= 0 ? 1 : -1;
13482                 }
13483               }
13484             }
13485           }
13486
13487           // First, determine whether the South pole is inside or outside:
13488           //
13489           // It is inside if:
13490           // * the polygon winds around it in a clockwise direction.
13491           // * the polygon does not (cumulatively) wind around it, but has a negative
13492           //   (counter-clockwise) area.
13493           //
13494           // Second, count the (signed) number of times a segment crosses a lambda
13495           // from the point to the South pole.  If it is zero, then the point is the
13496           // same side as the South pole.
13497
13498           return (angle < -epsilon$2 || angle < epsilon$2 && sum$1 < -epsilon$2) ^ (winding & 1);
13499         }
13500
13501         function clip(pointVisible, clipLine, interpolate, start) {
13502           return function(sink) {
13503             var line = clipLine(sink),
13504                 ringBuffer = clipBuffer(),
13505                 ringSink = clipLine(ringBuffer),
13506                 polygonStarted = false,
13507                 polygon,
13508                 segments,
13509                 ring;
13510
13511             var clip = {
13512               point: point,
13513               lineStart: lineStart,
13514               lineEnd: lineEnd,
13515               polygonStart: function() {
13516                 clip.point = pointRing;
13517                 clip.lineStart = ringStart;
13518                 clip.lineEnd = ringEnd;
13519                 segments = [];
13520                 polygon = [];
13521               },
13522               polygonEnd: function() {
13523                 clip.point = point;
13524                 clip.lineStart = lineStart;
13525                 clip.lineEnd = lineEnd;
13526                 segments = merge(segments);
13527                 var startInside = polygonContains(polygon, start);
13528                 if (segments.length) {
13529                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13530                   clipRejoin(segments, compareIntersection, startInside, interpolate, sink);
13531                 } else if (startInside) {
13532                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13533                   sink.lineStart();
13534                   interpolate(null, null, 1, sink);
13535                   sink.lineEnd();
13536                 }
13537                 if (polygonStarted) sink.polygonEnd(), polygonStarted = false;
13538                 segments = polygon = null;
13539               },
13540               sphere: function() {
13541                 sink.polygonStart();
13542                 sink.lineStart();
13543                 interpolate(null, null, 1, sink);
13544                 sink.lineEnd();
13545                 sink.polygonEnd();
13546               }
13547             };
13548
13549             function point(lambda, phi) {
13550               if (pointVisible(lambda, phi)) sink.point(lambda, phi);
13551             }
13552
13553             function pointLine(lambda, phi) {
13554               line.point(lambda, phi);
13555             }
13556
13557             function lineStart() {
13558               clip.point = pointLine;
13559               line.lineStart();
13560             }
13561
13562             function lineEnd() {
13563               clip.point = point;
13564               line.lineEnd();
13565             }
13566
13567             function pointRing(lambda, phi) {
13568               ring.push([lambda, phi]);
13569               ringSink.point(lambda, phi);
13570             }
13571
13572             function ringStart() {
13573               ringSink.lineStart();
13574               ring = [];
13575             }
13576
13577             function ringEnd() {
13578               pointRing(ring[0][0], ring[0][1]);
13579               ringSink.lineEnd();
13580
13581               var clean = ringSink.clean(),
13582                   ringSegments = ringBuffer.result(),
13583                   i, n = ringSegments.length, m,
13584                   segment,
13585                   point;
13586
13587               ring.pop();
13588               polygon.push(ring);
13589               ring = null;
13590
13591               if (!n) return;
13592
13593               // No intersections.
13594               if (clean & 1) {
13595                 segment = ringSegments[0];
13596                 if ((m = segment.length - 1) > 0) {
13597                   if (!polygonStarted) sink.polygonStart(), polygonStarted = true;
13598                   sink.lineStart();
13599                   for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]);
13600                   sink.lineEnd();
13601                 }
13602                 return;
13603               }
13604
13605               // Rejoin connected segments.
13606               // TODO reuse ringBuffer.rejoin()?
13607               if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
13608
13609               segments.push(ringSegments.filter(validSegment));
13610             }
13611
13612             return clip;
13613           };
13614         }
13615
13616         function validSegment(segment) {
13617           return segment.length > 1;
13618         }
13619
13620         // Intersections are sorted along the clip edge. For both antimeridian cutting
13621         // and circle clipping, the same comparison is used.
13622         function compareIntersection(a, b) {
13623           return ((a = a.x)[0] < 0 ? a[1] - halfPi$2 - epsilon$2 : halfPi$2 - a[1])
13624                - ((b = b.x)[0] < 0 ? b[1] - halfPi$2 - epsilon$2 : halfPi$2 - b[1]);
13625         }
13626
13627         var clipAntimeridian = clip(
13628           function() { return true; },
13629           clipAntimeridianLine,
13630           clipAntimeridianInterpolate,
13631           [-pi$3, -halfPi$2]
13632         );
13633
13634         // Takes a line and cuts into visible segments. Return values: 0 - there were
13635         // intersections or the line was empty; 1 - no intersections; 2 - there were
13636         // intersections, and the first and last segments should be rejoined.
13637         function clipAntimeridianLine(stream) {
13638           var lambda0 = NaN,
13639               phi0 = NaN,
13640               sign0 = NaN,
13641               clean; // no intersections
13642
13643           return {
13644             lineStart: function() {
13645               stream.lineStart();
13646               clean = 1;
13647             },
13648             point: function(lambda1, phi1) {
13649               var sign1 = lambda1 > 0 ? pi$3 : -pi$3,
13650                   delta = abs$2(lambda1 - lambda0);
13651               if (abs$2(delta - pi$3) < epsilon$2) { // line crosses a pole
13652                 stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi$2 : -halfPi$2);
13653                 stream.point(sign0, phi0);
13654                 stream.lineEnd();
13655                 stream.lineStart();
13656                 stream.point(sign1, phi0);
13657                 stream.point(lambda1, phi0);
13658                 clean = 0;
13659               } else if (sign0 !== sign1 && delta >= pi$3) { // line crosses antimeridian
13660                 if (abs$2(lambda0 - sign0) < epsilon$2) lambda0 -= sign0 * epsilon$2; // handle degeneracies
13661                 if (abs$2(lambda1 - sign1) < epsilon$2) lambda1 -= sign1 * epsilon$2;
13662                 phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1);
13663                 stream.point(sign0, phi0);
13664                 stream.lineEnd();
13665                 stream.lineStart();
13666                 stream.point(sign1, phi0);
13667                 clean = 0;
13668               }
13669               stream.point(lambda0 = lambda1, phi0 = phi1);
13670               sign0 = sign1;
13671             },
13672             lineEnd: function() {
13673               stream.lineEnd();
13674               lambda0 = phi0 = NaN;
13675             },
13676             clean: function() {
13677               return 2 - clean; // if intersections, rejoin first and last segments
13678             }
13679           };
13680         }
13681
13682         function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) {
13683           var cosPhi0,
13684               cosPhi1,
13685               sinLambda0Lambda1 = sin$1(lambda0 - lambda1);
13686           return abs$2(sinLambda0Lambda1) > epsilon$2
13687               ? atan((sin$1(phi0) * (cosPhi1 = cos$1(phi1)) * sin$1(lambda1)
13688                   - sin$1(phi1) * (cosPhi0 = cos$1(phi0)) * sin$1(lambda0))
13689                   / (cosPhi0 * cosPhi1 * sinLambda0Lambda1))
13690               : (phi0 + phi1) / 2;
13691         }
13692
13693         function clipAntimeridianInterpolate(from, to, direction, stream) {
13694           var phi;
13695           if (from == null) {
13696             phi = direction * halfPi$2;
13697             stream.point(-pi$3, phi);
13698             stream.point(0, phi);
13699             stream.point(pi$3, phi);
13700             stream.point(pi$3, 0);
13701             stream.point(pi$3, -phi);
13702             stream.point(0, -phi);
13703             stream.point(-pi$3, -phi);
13704             stream.point(-pi$3, 0);
13705             stream.point(-pi$3, phi);
13706           } else if (abs$2(from[0] - to[0]) > epsilon$2) {
13707             var lambda = from[0] < to[0] ? pi$3 : -pi$3;
13708             phi = direction * lambda / 2;
13709             stream.point(-lambda, phi);
13710             stream.point(0, phi);
13711             stream.point(lambda, phi);
13712           } else {
13713             stream.point(to[0], to[1]);
13714           }
13715         }
13716
13717         function clipCircle(radius) {
13718           var cr = cos$1(radius),
13719               delta = 6 * radians,
13720               smallRadius = cr > 0,
13721               notHemisphere = abs$2(cr) > epsilon$2; // TODO optimise for this common case
13722
13723           function interpolate(from, to, direction, stream) {
13724             circleStream(stream, radius, delta, direction, from, to);
13725           }
13726
13727           function visible(lambda, phi) {
13728             return cos$1(lambda) * cos$1(phi) > cr;
13729           }
13730
13731           // Takes a line and cuts into visible segments. Return values used for polygon
13732           // clipping: 0 - there were intersections or the line was empty; 1 - no
13733           // intersections 2 - there were intersections, and the first and last segments
13734           // should be rejoined.
13735           function clipLine(stream) {
13736             var point0, // previous point
13737                 c0, // code for previous point
13738                 v0, // visibility of previous point
13739                 v00, // visibility of first point
13740                 clean; // no intersections
13741             return {
13742               lineStart: function() {
13743                 v00 = v0 = false;
13744                 clean = 1;
13745               },
13746               point: function(lambda, phi) {
13747                 var point1 = [lambda, phi],
13748                     point2,
13749                     v = visible(lambda, phi),
13750                     c = smallRadius
13751                       ? v ? 0 : code(lambda, phi)
13752                       : v ? code(lambda + (lambda < 0 ? pi$3 : -pi$3), phi) : 0;
13753                 if (!point0 && (v00 = v0 = v)) stream.lineStart();
13754                 // Handle degeneracies.
13755                 // TODO ignore if not clipping polygons.
13756                 if (v !== v0) {
13757                   point2 = intersect(point0, point1);
13758                   if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) {
13759                     point1[0] += epsilon$2;
13760                     point1[1] += epsilon$2;
13761                     v = visible(point1[0], point1[1]);
13762                   }
13763                 }
13764                 if (v !== v0) {
13765                   clean = 0;
13766                   if (v) {
13767                     // outside going in
13768                     stream.lineStart();
13769                     point2 = intersect(point1, point0);
13770                     stream.point(point2[0], point2[1]);
13771                   } else {
13772                     // inside going out
13773                     point2 = intersect(point0, point1);
13774                     stream.point(point2[0], point2[1]);
13775                     stream.lineEnd();
13776                   }
13777                   point0 = point2;
13778                 } else if (notHemisphere && point0 && smallRadius ^ v) {
13779                   var t;
13780                   // If the codes for two points are different, or are both zero,
13781                   // and there this segment intersects with the small circle.
13782                   if (!(c & c0) && (t = intersect(point1, point0, true))) {
13783                     clean = 0;
13784                     if (smallRadius) {
13785                       stream.lineStart();
13786                       stream.point(t[0][0], t[0][1]);
13787                       stream.point(t[1][0], t[1][1]);
13788                       stream.lineEnd();
13789                     } else {
13790                       stream.point(t[1][0], t[1][1]);
13791                       stream.lineEnd();
13792                       stream.lineStart();
13793                       stream.point(t[0][0], t[0][1]);
13794                     }
13795                   }
13796                 }
13797                 if (v && (!point0 || !pointEqual(point0, point1))) {
13798                   stream.point(point1[0], point1[1]);
13799                 }
13800                 point0 = point1, v0 = v, c0 = c;
13801               },
13802               lineEnd: function() {
13803                 if (v0) stream.lineEnd();
13804                 point0 = null;
13805               },
13806               // Rejoin first and last segments if there were intersections and the first
13807               // and last points were visible.
13808               clean: function() {
13809                 return clean | ((v00 && v0) << 1);
13810               }
13811             };
13812           }
13813
13814           // Intersects the great circle between a and b with the clip circle.
13815           function intersect(a, b, two) {
13816             var pa = cartesian(a),
13817                 pb = cartesian(b);
13818
13819             // We have two planes, n1.p = d1 and n2.p = d2.
13820             // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2).
13821             var n1 = [1, 0, 0], // normal
13822                 n2 = cartesianCross(pa, pb),
13823                 n2n2 = cartesianDot(n2, n2),
13824                 n1n2 = n2[0], // cartesianDot(n1, n2),
13825                 determinant = n2n2 - n1n2 * n1n2;
13826
13827             // Two polar points.
13828             if (!determinant) return !two && a;
13829
13830             var c1 =  cr * n2n2 / determinant,
13831                 c2 = -cr * n1n2 / determinant,
13832                 n1xn2 = cartesianCross(n1, n2),
13833                 A = cartesianScale(n1, c1),
13834                 B = cartesianScale(n2, c2);
13835             cartesianAddInPlace(A, B);
13836
13837             // Solve |p(t)|^2 = 1.
13838             var u = n1xn2,
13839                 w = cartesianDot(A, u),
13840                 uu = cartesianDot(u, u),
13841                 t2 = w * w - uu * (cartesianDot(A, A) - 1);
13842
13843             if (t2 < 0) return;
13844
13845             var t = sqrt(t2),
13846                 q = cartesianScale(u, (-w - t) / uu);
13847             cartesianAddInPlace(q, A);
13848             q = spherical(q);
13849
13850             if (!two) return q;
13851
13852             // Two intersection points.
13853             var lambda0 = a[0],
13854                 lambda1 = b[0],
13855                 phi0 = a[1],
13856                 phi1 = b[1],
13857                 z;
13858
13859             if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z;
13860
13861             var delta = lambda1 - lambda0,
13862                 polar = abs$2(delta - pi$3) < epsilon$2,
13863                 meridian = polar || delta < epsilon$2;
13864
13865             if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z;
13866
13867             // Check that the first point is between a and b.
13868             if (meridian
13869                 ? polar
13870                   ? phi0 + phi1 > 0 ^ q[1] < (abs$2(q[0] - lambda0) < epsilon$2 ? phi0 : phi1)
13871                   : phi0 <= q[1] && q[1] <= phi1
13872                 : delta > pi$3 ^ (lambda0 <= q[0] && q[0] <= lambda1)) {
13873               var q1 = cartesianScale(u, (-w + t) / uu);
13874               cartesianAddInPlace(q1, A);
13875               return [q, spherical(q1)];
13876             }
13877           }
13878
13879           // Generates a 4-bit vector representing the location of a point relative to
13880           // the small circle's bounding box.
13881           function code(lambda, phi) {
13882             var r = smallRadius ? radius : pi$3 - radius,
13883                 code = 0;
13884             if (lambda < -r) code |= 1; // left
13885             else if (lambda > r) code |= 2; // right
13886             if (phi < -r) code |= 4; // below
13887             else if (phi > r) code |= 8; // above
13888             return code;
13889           }
13890
13891           return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi$3, radius - pi$3]);
13892         }
13893
13894         function clipLine(a, b, x0, y0, x1, y1) {
13895           var ax = a[0],
13896               ay = a[1],
13897               bx = b[0],
13898               by = b[1],
13899               t0 = 0,
13900               t1 = 1,
13901               dx = bx - ax,
13902               dy = by - ay,
13903               r;
13904
13905           r = x0 - ax;
13906           if (!dx && r > 0) return;
13907           r /= dx;
13908           if (dx < 0) {
13909             if (r < t0) return;
13910             if (r < t1) t1 = r;
13911           } else if (dx > 0) {
13912             if (r > t1) return;
13913             if (r > t0) t0 = r;
13914           }
13915
13916           r = x1 - ax;
13917           if (!dx && r < 0) return;
13918           r /= dx;
13919           if (dx < 0) {
13920             if (r > t1) return;
13921             if (r > t0) t0 = r;
13922           } else if (dx > 0) {
13923             if (r < t0) return;
13924             if (r < t1) t1 = r;
13925           }
13926
13927           r = y0 - ay;
13928           if (!dy && r > 0) return;
13929           r /= dy;
13930           if (dy < 0) {
13931             if (r < t0) return;
13932             if (r < t1) t1 = r;
13933           } else if (dy > 0) {
13934             if (r > t1) return;
13935             if (r > t0) t0 = r;
13936           }
13937
13938           r = y1 - ay;
13939           if (!dy && r < 0) return;
13940           r /= dy;
13941           if (dy < 0) {
13942             if (r > t1) return;
13943             if (r > t0) t0 = r;
13944           } else if (dy > 0) {
13945             if (r < t0) return;
13946             if (r < t1) t1 = r;
13947           }
13948
13949           if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy;
13950           if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy;
13951           return true;
13952         }
13953
13954         var clipMax = 1e9, clipMin = -clipMax;
13955
13956         // TODO Use d3-polygon’s polygonContains here for the ring check?
13957         // TODO Eliminate duplicate buffering in clipBuffer and polygon.push?
13958
13959         function clipRectangle(x0, y0, x1, y1) {
13960
13961           function visible(x, y) {
13962             return x0 <= x && x <= x1 && y0 <= y && y <= y1;
13963           }
13964
13965           function interpolate(from, to, direction, stream) {
13966             var a = 0, a1 = 0;
13967             if (from == null
13968                 || (a = corner(from, direction)) !== (a1 = corner(to, direction))
13969                 || comparePoint(from, to) < 0 ^ direction > 0) {
13970               do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
13971               while ((a = (a + direction + 4) % 4) !== a1);
13972             } else {
13973               stream.point(to[0], to[1]);
13974             }
13975           }
13976
13977           function corner(p, direction) {
13978             return abs$2(p[0] - x0) < epsilon$2 ? direction > 0 ? 0 : 3
13979                 : abs$2(p[0] - x1) < epsilon$2 ? direction > 0 ? 2 : 1
13980                 : abs$2(p[1] - y0) < epsilon$2 ? direction > 0 ? 1 : 0
13981                 : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon
13982           }
13983
13984           function compareIntersection(a, b) {
13985             return comparePoint(a.x, b.x);
13986           }
13987
13988           function comparePoint(a, b) {
13989             var ca = corner(a, 1),
13990                 cb = corner(b, 1);
13991             return ca !== cb ? ca - cb
13992                 : ca === 0 ? b[1] - a[1]
13993                 : ca === 1 ? a[0] - b[0]
13994                 : ca === 2 ? a[1] - b[1]
13995                 : b[0] - a[0];
13996           }
13997
13998           return function(stream) {
13999             var activeStream = stream,
14000                 bufferStream = clipBuffer(),
14001                 segments,
14002                 polygon,
14003                 ring,
14004                 x__, y__, v__, // first point
14005                 x_, y_, v_, // previous point
14006                 first,
14007                 clean;
14008
14009             var clipStream = {
14010               point: point,
14011               lineStart: lineStart,
14012               lineEnd: lineEnd,
14013               polygonStart: polygonStart,
14014               polygonEnd: polygonEnd
14015             };
14016
14017             function point(x, y) {
14018               if (visible(x, y)) activeStream.point(x, y);
14019             }
14020
14021             function polygonInside() {
14022               var winding = 0;
14023
14024               for (var i = 0, n = polygon.length; i < n; ++i) {
14025                 for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) {
14026                   a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1];
14027                   if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; }
14028                   else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; }
14029                 }
14030               }
14031
14032               return winding;
14033             }
14034
14035             // Buffer geometry within a polygon and then clip it en masse.
14036             function polygonStart() {
14037               activeStream = bufferStream, segments = [], polygon = [], clean = true;
14038             }
14039
14040             function polygonEnd() {
14041               var startInside = polygonInside(),
14042                   cleanInside = clean && startInside,
14043                   visible = (segments = merge(segments)).length;
14044               if (cleanInside || visible) {
14045                 stream.polygonStart();
14046                 if (cleanInside) {
14047                   stream.lineStart();
14048                   interpolate(null, null, 1, stream);
14049                   stream.lineEnd();
14050                 }
14051                 if (visible) {
14052                   clipRejoin(segments, compareIntersection, startInside, interpolate, stream);
14053                 }
14054                 stream.polygonEnd();
14055               }
14056               activeStream = stream, segments = polygon = ring = null;
14057             }
14058
14059             function lineStart() {
14060               clipStream.point = linePoint;
14061               if (polygon) polygon.push(ring = []);
14062               first = true;
14063               v_ = false;
14064               x_ = y_ = NaN;
14065             }
14066
14067             // TODO rather than special-case polygons, simply handle them separately.
14068             // Ideally, coincident intersection points should be jittered to avoid
14069             // clipping issues.
14070             function lineEnd() {
14071               if (segments) {
14072                 linePoint(x__, y__);
14073                 if (v__ && v_) bufferStream.rejoin();
14074                 segments.push(bufferStream.result());
14075               }
14076               clipStream.point = point;
14077               if (v_) activeStream.lineEnd();
14078             }
14079
14080             function linePoint(x, y) {
14081               var v = visible(x, y);
14082               if (polygon) ring.push([x, y]);
14083               if (first) {
14084                 x__ = x, y__ = y, v__ = v;
14085                 first = false;
14086                 if (v) {
14087                   activeStream.lineStart();
14088                   activeStream.point(x, y);
14089                 }
14090               } else {
14091                 if (v && v_) activeStream.point(x, y);
14092                 else {
14093                   var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))],
14094                       b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))];
14095                   if (clipLine(a, b, x0, y0, x1, y1)) {
14096                     if (!v_) {
14097                       activeStream.lineStart();
14098                       activeStream.point(a[0], a[1]);
14099                     }
14100                     activeStream.point(b[0], b[1]);
14101                     if (!v) activeStream.lineEnd();
14102                     clean = false;
14103                   } else if (v) {
14104                     activeStream.lineStart();
14105                     activeStream.point(x, y);
14106                     clean = false;
14107                   }
14108                 }
14109               }
14110               x_ = x, y_ = y, v_ = v;
14111             }
14112
14113             return clipStream;
14114           };
14115         }
14116
14117         function extent$1() {
14118           var x0 = 0,
14119               y0 = 0,
14120               x1 = 960,
14121               y1 = 500,
14122               cache,
14123               cacheStream,
14124               clip;
14125
14126           return clip = {
14127             stream: function(stream) {
14128               return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream);
14129             },
14130             extent: function(_) {
14131               return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]];
14132             }
14133           };
14134         }
14135
14136         var lengthSum = adder(),
14137             lambda0$2,
14138             sinPhi0$1,
14139             cosPhi0$1;
14140
14141         var lengthStream = {
14142           sphere: noop$4,
14143           point: noop$4,
14144           lineStart: lengthLineStart,
14145           lineEnd: noop$4,
14146           polygonStart: noop$4,
14147           polygonEnd: noop$4
14148         };
14149
14150         function lengthLineStart() {
14151           lengthStream.point = lengthPointFirst;
14152           lengthStream.lineEnd = lengthLineEnd;
14153         }
14154
14155         function lengthLineEnd() {
14156           lengthStream.point = lengthStream.lineEnd = noop$4;
14157         }
14158
14159         function lengthPointFirst(lambda, phi) {
14160           lambda *= radians, phi *= radians;
14161           lambda0$2 = lambda, sinPhi0$1 = sin$1(phi), cosPhi0$1 = cos$1(phi);
14162           lengthStream.point = lengthPoint;
14163         }
14164
14165         function lengthPoint(lambda, phi) {
14166           lambda *= radians, phi *= radians;
14167           var sinPhi = sin$1(phi),
14168               cosPhi = cos$1(phi),
14169               delta = abs$2(lambda - lambda0$2),
14170               cosDelta = cos$1(delta),
14171               sinDelta = sin$1(delta),
14172               x = cosPhi * sinDelta,
14173               y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta,
14174               z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta;
14175           lengthSum.add(atan2(sqrt(x * x + y * y), z));
14176           lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi;
14177         }
14178
14179         function d3_geoLength(object) {
14180           lengthSum.reset();
14181           d3_geoStream(object, lengthStream);
14182           return +lengthSum;
14183         }
14184
14185         var coordinates = [null, null],
14186             object$1 = {type: "LineString", coordinates: coordinates};
14187
14188         function distance(a, b) {
14189           coordinates[0] = a;
14190           coordinates[1] = b;
14191           return d3_geoLength(object$1);
14192         }
14193
14194         var containsObjectType = {
14195           Feature: function(object, point) {
14196             return containsGeometry(object.geometry, point);
14197           },
14198           FeatureCollection: function(object, point) {
14199             var features = object.features, i = -1, n = features.length;
14200             while (++i < n) if (containsGeometry(features[i].geometry, point)) return true;
14201             return false;
14202           }
14203         };
14204
14205         var containsGeometryType = {
14206           Sphere: function() {
14207             return true;
14208           },
14209           Point: function(object, point) {
14210             return containsPoint(object.coordinates, point);
14211           },
14212           MultiPoint: function(object, point) {
14213             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14214             while (++i < n) if (containsPoint(coordinates[i], point)) return true;
14215             return false;
14216           },
14217           LineString: function(object, point) {
14218             return containsLine(object.coordinates, point);
14219           },
14220           MultiLineString: function(object, point) {
14221             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14222             while (++i < n) if (containsLine(coordinates[i], point)) return true;
14223             return false;
14224           },
14225           Polygon: function(object, point) {
14226             return containsPolygon(object.coordinates, point);
14227           },
14228           MultiPolygon: function(object, point) {
14229             var coordinates = object.coordinates, i = -1, n = coordinates.length;
14230             while (++i < n) if (containsPolygon(coordinates[i], point)) return true;
14231             return false;
14232           },
14233           GeometryCollection: function(object, point) {
14234             var geometries = object.geometries, i = -1, n = geometries.length;
14235             while (++i < n) if (containsGeometry(geometries[i], point)) return true;
14236             return false;
14237           }
14238         };
14239
14240         function containsGeometry(geometry, point) {
14241           return geometry && containsGeometryType.hasOwnProperty(geometry.type)
14242               ? containsGeometryType[geometry.type](geometry, point)
14243               : false;
14244         }
14245
14246         function containsPoint(coordinates, point) {
14247           return distance(coordinates, point) === 0;
14248         }
14249
14250         function containsLine(coordinates, point) {
14251           var ab = distance(coordinates[0], coordinates[1]),
14252               ao = distance(coordinates[0], point),
14253               ob = distance(point, coordinates[1]);
14254           return ao + ob <= ab + epsilon$2;
14255         }
14256
14257         function containsPolygon(coordinates, point) {
14258           return !!polygonContains(coordinates.map(ringRadians), pointRadians(point));
14259         }
14260
14261         function ringRadians(ring) {
14262           return ring = ring.map(pointRadians), ring.pop(), ring;
14263         }
14264
14265         function pointRadians(point) {
14266           return [point[0] * radians, point[1] * radians];
14267         }
14268
14269         function contains$2(object, point) {
14270           return (object && containsObjectType.hasOwnProperty(object.type)
14271               ? containsObjectType[object.type]
14272               : containsGeometry)(object, point);
14273         }
14274
14275         function graticuleX(y0, y1, dy) {
14276           var y = d3_range(y0, y1 - epsilon$2, dy).concat(y1);
14277           return function(x) { return y.map(function(y) { return [x, y]; }); };
14278         }
14279
14280         function graticuleY(x0, x1, dx) {
14281           var x = d3_range(x0, x1 - epsilon$2, dx).concat(x1);
14282           return function(y) { return x.map(function(x) { return [x, y]; }); };
14283         }
14284
14285         function graticule() {
14286           var x1, x0, X1, X0,
14287               y1, y0, Y1, Y0,
14288               dx = 10, dy = dx, DX = 90, DY = 360,
14289               x, y, X, Y,
14290               precision = 2.5;
14291
14292           function graticule() {
14293             return {type: "MultiLineString", coordinates: lines()};
14294           }
14295
14296           function lines() {
14297             return d3_range(ceil(X0 / DX) * DX, X1, DX).map(X)
14298                 .concat(d3_range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
14299                 .concat(d3_range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs$2(x % DX) > epsilon$2; }).map(x))
14300                 .concat(d3_range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs$2(y % DY) > epsilon$2; }).map(y));
14301           }
14302
14303           graticule.lines = function() {
14304             return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; });
14305           };
14306
14307           graticule.outline = function() {
14308             return {
14309               type: "Polygon",
14310               coordinates: [
14311                 X(X0).concat(
14312                 Y(Y1).slice(1),
14313                 X(X1).reverse().slice(1),
14314                 Y(Y0).reverse().slice(1))
14315               ]
14316             };
14317           };
14318
14319           graticule.extent = function(_) {
14320             if (!arguments.length) return graticule.extentMinor();
14321             return graticule.extentMajor(_).extentMinor(_);
14322           };
14323
14324           graticule.extentMajor = function(_) {
14325             if (!arguments.length) return [[X0, Y0], [X1, Y1]];
14326             X0 = +_[0][0], X1 = +_[1][0];
14327             Y0 = +_[0][1], Y1 = +_[1][1];
14328             if (X0 > X1) _ = X0, X0 = X1, X1 = _;
14329             if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
14330             return graticule.precision(precision);
14331           };
14332
14333           graticule.extentMinor = function(_) {
14334             if (!arguments.length) return [[x0, y0], [x1, y1]];
14335             x0 = +_[0][0], x1 = +_[1][0];
14336             y0 = +_[0][1], y1 = +_[1][1];
14337             if (x0 > x1) _ = x0, x0 = x1, x1 = _;
14338             if (y0 > y1) _ = y0, y0 = y1, y1 = _;
14339             return graticule.precision(precision);
14340           };
14341
14342           graticule.step = function(_) {
14343             if (!arguments.length) return graticule.stepMinor();
14344             return graticule.stepMajor(_).stepMinor(_);
14345           };
14346
14347           graticule.stepMajor = function(_) {
14348             if (!arguments.length) return [DX, DY];
14349             DX = +_[0], DY = +_[1];
14350             return graticule;
14351           };
14352
14353           graticule.stepMinor = function(_) {
14354             if (!arguments.length) return [dx, dy];
14355             dx = +_[0], dy = +_[1];
14356             return graticule;
14357           };
14358
14359           graticule.precision = function(_) {
14360             if (!arguments.length) return precision;
14361             precision = +_;
14362             x = graticuleX(y0, y1, 90);
14363             y = graticuleY(x0, x1, precision);
14364             X = graticuleX(Y0, Y1, 90);
14365             Y = graticuleY(X0, X1, precision);
14366             return graticule;
14367           };
14368
14369           return graticule
14370               .extentMajor([[-180, -90 + epsilon$2], [180, 90 - epsilon$2]])
14371               .extentMinor([[-180, -80 - epsilon$2], [180, 80 + epsilon$2]]);
14372         }
14373
14374         function graticule10() {
14375           return graticule()();
14376         }
14377
14378         function interpolate$1(a, b) {
14379           var x0 = a[0] * radians,
14380               y0 = a[1] * radians,
14381               x1 = b[0] * radians,
14382               y1 = b[1] * radians,
14383               cy0 = cos$1(y0),
14384               sy0 = sin$1(y0),
14385               cy1 = cos$1(y1),
14386               sy1 = sin$1(y1),
14387               kx0 = cy0 * cos$1(x0),
14388               ky0 = cy0 * sin$1(x0),
14389               kx1 = cy1 * cos$1(x1),
14390               ky1 = cy1 * sin$1(x1),
14391               d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))),
14392               k = sin$1(d);
14393
14394           var interpolate = d ? function(t) {
14395             var B = sin$1(t *= d) / k,
14396                 A = sin$1(d - t) / k,
14397                 x = A * kx0 + B * kx1,
14398                 y = A * ky0 + B * ky1,
14399                 z = A * sy0 + B * sy1;
14400             return [
14401               atan2(y, x) * degrees$1,
14402               atan2(z, sqrt(x * x + y * y)) * degrees$1
14403             ];
14404           } : function() {
14405             return [x0 * degrees$1, y0 * degrees$1];
14406           };
14407
14408           interpolate.distance = d;
14409
14410           return interpolate;
14411         }
14412
14413         function identity$4(x) {
14414           return x;
14415         }
14416
14417         var areaSum$1 = adder(),
14418             areaRingSum$1 = adder(),
14419             x00,
14420             y00,
14421             x0$1,
14422             y0$1;
14423
14424         var areaStream$1 = {
14425           point: noop$4,
14426           lineStart: noop$4,
14427           lineEnd: noop$4,
14428           polygonStart: function() {
14429             areaStream$1.lineStart = areaRingStart$1;
14430             areaStream$1.lineEnd = areaRingEnd$1;
14431           },
14432           polygonEnd: function() {
14433             areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop$4;
14434             areaSum$1.add(abs$2(areaRingSum$1));
14435             areaRingSum$1.reset();
14436           },
14437           result: function() {
14438             var area = areaSum$1 / 2;
14439             areaSum$1.reset();
14440             return area;
14441           }
14442         };
14443
14444         function areaRingStart$1() {
14445           areaStream$1.point = areaPointFirst$1;
14446         }
14447
14448         function areaPointFirst$1(x, y) {
14449           areaStream$1.point = areaPoint$1;
14450           x00 = x0$1 = x, y00 = y0$1 = y;
14451         }
14452
14453         function areaPoint$1(x, y) {
14454           areaRingSum$1.add(y0$1 * x - x0$1 * y);
14455           x0$1 = x, y0$1 = y;
14456         }
14457
14458         function areaRingEnd$1() {
14459           areaPoint$1(x00, y00);
14460         }
14461
14462         var x0$2 = Infinity,
14463             y0$2 = x0$2,
14464             x1 = -x0$2,
14465             y1 = x1;
14466
14467         var boundsStream$1 = {
14468           point: boundsPoint$1,
14469           lineStart: noop$4,
14470           lineEnd: noop$4,
14471           polygonStart: noop$4,
14472           polygonEnd: noop$4,
14473           result: function() {
14474             var bounds = [[x0$2, y0$2], [x1, y1]];
14475             x1 = y1 = -(y0$2 = x0$2 = Infinity);
14476             return bounds;
14477           }
14478         };
14479
14480         function boundsPoint$1(x, y) {
14481           if (x < x0$2) x0$2 = x;
14482           if (x > x1) x1 = x;
14483           if (y < y0$2) y0$2 = y;
14484           if (y > y1) y1 = y;
14485         }
14486
14487         // TODO Enforce positive area for exterior, negative area for interior?
14488
14489         var X0$1 = 0,
14490             Y0$1 = 0,
14491             Z0$1 = 0,
14492             X1$1 = 0,
14493             Y1$1 = 0,
14494             Z1$1 = 0,
14495             X2$1 = 0,
14496             Y2$1 = 0,
14497             Z2$1 = 0,
14498             x00$1,
14499             y00$1,
14500             x0$3,
14501             y0$3;
14502
14503         var centroidStream$1 = {
14504           point: centroidPoint$1,
14505           lineStart: centroidLineStart$1,
14506           lineEnd: centroidLineEnd$1,
14507           polygonStart: function() {
14508             centroidStream$1.lineStart = centroidRingStart$1;
14509             centroidStream$1.lineEnd = centroidRingEnd$1;
14510           },
14511           polygonEnd: function() {
14512             centroidStream$1.point = centroidPoint$1;
14513             centroidStream$1.lineStart = centroidLineStart$1;
14514             centroidStream$1.lineEnd = centroidLineEnd$1;
14515           },
14516           result: function() {
14517             var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1]
14518                 : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1]
14519                 : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1]
14520                 : [NaN, NaN];
14521             X0$1 = Y0$1 = Z0$1 =
14522             X1$1 = Y1$1 = Z1$1 =
14523             X2$1 = Y2$1 = Z2$1 = 0;
14524             return centroid;
14525           }
14526         };
14527
14528         function centroidPoint$1(x, y) {
14529           X0$1 += x;
14530           Y0$1 += y;
14531           ++Z0$1;
14532         }
14533
14534         function centroidLineStart$1() {
14535           centroidStream$1.point = centroidPointFirstLine;
14536         }
14537
14538         function centroidPointFirstLine(x, y) {
14539           centroidStream$1.point = centroidPointLine;
14540           centroidPoint$1(x0$3 = x, y0$3 = y);
14541         }
14542
14543         function centroidPointLine(x, y) {
14544           var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy);
14545           X1$1 += z * (x0$3 + x) / 2;
14546           Y1$1 += z * (y0$3 + y) / 2;
14547           Z1$1 += z;
14548           centroidPoint$1(x0$3 = x, y0$3 = y);
14549         }
14550
14551         function centroidLineEnd$1() {
14552           centroidStream$1.point = centroidPoint$1;
14553         }
14554
14555         function centroidRingStart$1() {
14556           centroidStream$1.point = centroidPointFirstRing;
14557         }
14558
14559         function centroidRingEnd$1() {
14560           centroidPointRing(x00$1, y00$1);
14561         }
14562
14563         function centroidPointFirstRing(x, y) {
14564           centroidStream$1.point = centroidPointRing;
14565           centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y);
14566         }
14567
14568         function centroidPointRing(x, y) {
14569           var dx = x - x0$3,
14570               dy = y - y0$3,
14571               z = sqrt(dx * dx + dy * dy);
14572
14573           X1$1 += z * (x0$3 + x) / 2;
14574           Y1$1 += z * (y0$3 + y) / 2;
14575           Z1$1 += z;
14576
14577           z = y0$3 * x - x0$3 * y;
14578           X2$1 += z * (x0$3 + x);
14579           Y2$1 += z * (y0$3 + y);
14580           Z2$1 += z * 3;
14581           centroidPoint$1(x0$3 = x, y0$3 = y);
14582         }
14583
14584         function PathContext(context) {
14585           this._context = context;
14586         }
14587
14588         PathContext.prototype = {
14589           _radius: 4.5,
14590           pointRadius: function(_) {
14591             return this._radius = _, this;
14592           },
14593           polygonStart: function() {
14594             this._line = 0;
14595           },
14596           polygonEnd: function() {
14597             this._line = NaN;
14598           },
14599           lineStart: function() {
14600             this._point = 0;
14601           },
14602           lineEnd: function() {
14603             if (this._line === 0) this._context.closePath();
14604             this._point = NaN;
14605           },
14606           point: function(x, y) {
14607             switch (this._point) {
14608               case 0: {
14609                 this._context.moveTo(x, y);
14610                 this._point = 1;
14611                 break;
14612               }
14613               case 1: {
14614                 this._context.lineTo(x, y);
14615                 break;
14616               }
14617               default: {
14618                 this._context.moveTo(x + this._radius, y);
14619                 this._context.arc(x, y, this._radius, 0, tau$3);
14620                 break;
14621               }
14622             }
14623           },
14624           result: noop$4
14625         };
14626
14627         var lengthSum$1 = adder(),
14628             lengthRing,
14629             x00$2,
14630             y00$2,
14631             x0$4,
14632             y0$4;
14633
14634         var lengthStream$1 = {
14635           point: noop$4,
14636           lineStart: function() {
14637             lengthStream$1.point = lengthPointFirst$1;
14638           },
14639           lineEnd: function() {
14640             if (lengthRing) lengthPoint$1(x00$2, y00$2);
14641             lengthStream$1.point = noop$4;
14642           },
14643           polygonStart: function() {
14644             lengthRing = true;
14645           },
14646           polygonEnd: function() {
14647             lengthRing = null;
14648           },
14649           result: function() {
14650             var length = +lengthSum$1;
14651             lengthSum$1.reset();
14652             return length;
14653           }
14654         };
14655
14656         function lengthPointFirst$1(x, y) {
14657           lengthStream$1.point = lengthPoint$1;
14658           x00$2 = x0$4 = x, y00$2 = y0$4 = y;
14659         }
14660
14661         function lengthPoint$1(x, y) {
14662           x0$4 -= x, y0$4 -= y;
14663           lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4));
14664           x0$4 = x, y0$4 = y;
14665         }
14666
14667         function PathString() {
14668           this._string = [];
14669         }
14670
14671         PathString.prototype = {
14672           _radius: 4.5,
14673           _circle: circle$1(4.5),
14674           pointRadius: function(_) {
14675             if ((_ = +_) !== this._radius) this._radius = _, this._circle = null;
14676             return this;
14677           },
14678           polygonStart: function() {
14679             this._line = 0;
14680           },
14681           polygonEnd: function() {
14682             this._line = NaN;
14683           },
14684           lineStart: function() {
14685             this._point = 0;
14686           },
14687           lineEnd: function() {
14688             if (this._line === 0) this._string.push("Z");
14689             this._point = NaN;
14690           },
14691           point: function(x, y) {
14692             switch (this._point) {
14693               case 0: {
14694                 this._string.push("M", x, ",", y);
14695                 this._point = 1;
14696                 break;
14697               }
14698               case 1: {
14699                 this._string.push("L", x, ",", y);
14700                 break;
14701               }
14702               default: {
14703                 if (this._circle == null) this._circle = circle$1(this._radius);
14704                 this._string.push("M", x, ",", y, this._circle);
14705                 break;
14706               }
14707             }
14708           },
14709           result: function() {
14710             if (this._string.length) {
14711               var result = this._string.join("");
14712               this._string = [];
14713               return result;
14714             } else {
14715               return null;
14716             }
14717           }
14718         };
14719
14720         function circle$1(radius) {
14721           return "m0," + radius
14722               + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius
14723               + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius
14724               + "z";
14725         }
14726
14727         function d3_geoPath(projection, context) {
14728           var pointRadius = 4.5,
14729               projectionStream,
14730               contextStream;
14731
14732           function path(object) {
14733             if (object) {
14734               if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
14735               d3_geoStream(object, projectionStream(contextStream));
14736             }
14737             return contextStream.result();
14738           }
14739
14740           path.area = function(object) {
14741             d3_geoStream(object, projectionStream(areaStream$1));
14742             return areaStream$1.result();
14743           };
14744
14745           path.measure = function(object) {
14746             d3_geoStream(object, projectionStream(lengthStream$1));
14747             return lengthStream$1.result();
14748           };
14749
14750           path.bounds = function(object) {
14751             d3_geoStream(object, projectionStream(boundsStream$1));
14752             return boundsStream$1.result();
14753           };
14754
14755           path.centroid = function(object) {
14756             d3_geoStream(object, projectionStream(centroidStream$1));
14757             return centroidStream$1.result();
14758           };
14759
14760           path.projection = function(_) {
14761             return arguments.length ? (projectionStream = _ == null ? (projection = null, identity$4) : (projection = _).stream, path) : projection;
14762           };
14763
14764           path.context = function(_) {
14765             if (!arguments.length) return context;
14766             contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _);
14767             if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
14768             return path;
14769           };
14770
14771           path.pointRadius = function(_) {
14772             if (!arguments.length) return pointRadius;
14773             pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
14774             return path;
14775           };
14776
14777           return path.projection(projection).context(context);
14778         }
14779
14780         function d3_geoTransform(methods) {
14781           return {
14782             stream: transformer(methods)
14783           };
14784         }
14785
14786         function transformer(methods) {
14787           return function(stream) {
14788             var s = new TransformStream;
14789             for (var key in methods) s[key] = methods[key];
14790             s.stream = stream;
14791             return s;
14792           };
14793         }
14794
14795         function TransformStream() {}
14796
14797         TransformStream.prototype = {
14798           constructor: TransformStream,
14799           point: function(x, y) { this.stream.point(x, y); },
14800           sphere: function() { this.stream.sphere(); },
14801           lineStart: function() { this.stream.lineStart(); },
14802           lineEnd: function() { this.stream.lineEnd(); },
14803           polygonStart: function() { this.stream.polygonStart(); },
14804           polygonEnd: function() { this.stream.polygonEnd(); }
14805         };
14806
14807         function fit(projection, fitBounds, object) {
14808           var clip = projection.clipExtent && projection.clipExtent();
14809           projection.scale(150).translate([0, 0]);
14810           if (clip != null) projection.clipExtent(null);
14811           d3_geoStream(object, projection.stream(boundsStream$1));
14812           fitBounds(boundsStream$1.result());
14813           if (clip != null) projection.clipExtent(clip);
14814           return projection;
14815         }
14816
14817         function fitExtent(projection, extent, object) {
14818           return fit(projection, function(b) {
14819             var w = extent[1][0] - extent[0][0],
14820                 h = extent[1][1] - extent[0][1],
14821                 k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])),
14822                 x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2,
14823                 y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2;
14824             projection.scale(150 * k).translate([x, y]);
14825           }, object);
14826         }
14827
14828         function fitSize(projection, size, object) {
14829           return fitExtent(projection, [[0, 0], size], object);
14830         }
14831
14832         function fitWidth(projection, width, object) {
14833           return fit(projection, function(b) {
14834             var w = +width,
14835                 k = w / (b[1][0] - b[0][0]),
14836                 x = (w - k * (b[1][0] + b[0][0])) / 2,
14837                 y = -k * b[0][1];
14838             projection.scale(150 * k).translate([x, y]);
14839           }, object);
14840         }
14841
14842         function fitHeight(projection, height, object) {
14843           return fit(projection, function(b) {
14844             var h = +height,
14845                 k = h / (b[1][1] - b[0][1]),
14846                 x = -k * b[0][0],
14847                 y = (h - k * (b[1][1] + b[0][1])) / 2;
14848             projection.scale(150 * k).translate([x, y]);
14849           }, object);
14850         }
14851
14852         var maxDepth = 16, // maximum depth of subdivision
14853             cosMinDistance = cos$1(30 * radians); // cos(minimum angular distance)
14854
14855         function resample(project, delta2) {
14856           return +delta2 ? resample$1(project, delta2) : resampleNone(project);
14857         }
14858
14859         function resampleNone(project) {
14860           return transformer({
14861             point: function(x, y) {
14862               x = project(x, y);
14863               this.stream.point(x[0], x[1]);
14864             }
14865           });
14866         }
14867
14868         function resample$1(project, delta2) {
14869
14870           function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) {
14871             var dx = x1 - x0,
14872                 dy = y1 - y0,
14873                 d2 = dx * dx + dy * dy;
14874             if (d2 > 4 * delta2 && depth--) {
14875               var a = a0 + a1,
14876                   b = b0 + b1,
14877                   c = c0 + c1,
14878                   m = sqrt(a * a + b * b + c * c),
14879                   phi2 = asin(c /= m),
14880                   lambda2 = abs$2(abs$2(c) - 1) < epsilon$2 || abs$2(lambda0 - lambda1) < epsilon$2 ? (lambda0 + lambda1) / 2 : atan2(b, a),
14881                   p = project(lambda2, phi2),
14882                   x2 = p[0],
14883                   y2 = p[1],
14884                   dx2 = x2 - x0,
14885                   dy2 = y2 - y0,
14886                   dz = dy * dx2 - dx * dy2;
14887               if (dz * dz / d2 > delta2 // perpendicular projected distance
14888                   || abs$2((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end
14889                   || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance
14890                 resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream);
14891                 stream.point(x2, y2);
14892                 resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream);
14893               }
14894             }
14895           }
14896           return function(stream) {
14897             var lambda00, x00, y00, a00, b00, c00, // first point
14898                 lambda0, x0, y0, a0, b0, c0; // previous point
14899
14900             var resampleStream = {
14901               point: point,
14902               lineStart: lineStart,
14903               lineEnd: lineEnd,
14904               polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; },
14905               polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; }
14906             };
14907
14908             function point(x, y) {
14909               x = project(x, y);
14910               stream.point(x[0], x[1]);
14911             }
14912
14913             function lineStart() {
14914               x0 = NaN;
14915               resampleStream.point = linePoint;
14916               stream.lineStart();
14917             }
14918
14919             function linePoint(lambda, phi) {
14920               var c = cartesian([lambda, phi]), p = project(lambda, phi);
14921               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);
14922               stream.point(x0, y0);
14923             }
14924
14925             function lineEnd() {
14926               resampleStream.point = point;
14927               stream.lineEnd();
14928             }
14929
14930             function ringStart() {
14931               lineStart();
14932               resampleStream.point = ringPoint;
14933               resampleStream.lineEnd = ringEnd;
14934             }
14935
14936             function ringPoint(lambda, phi) {
14937               linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
14938               resampleStream.point = linePoint;
14939             }
14940
14941             function ringEnd() {
14942               resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream);
14943               resampleStream.lineEnd = lineEnd;
14944               lineEnd();
14945             }
14946
14947             return resampleStream;
14948           };
14949         }
14950
14951         var transformRadians = transformer({
14952           point: function(x, y) {
14953             this.stream.point(x * radians, y * radians);
14954           }
14955         });
14956
14957         function transformRotate(rotate) {
14958           return transformer({
14959             point: function(x, y) {
14960               var r = rotate(x, y);
14961               return this.stream.point(r[0], r[1]);
14962             }
14963           });
14964         }
14965
14966         function scaleTranslate(k, dx, dy) {
14967           function transform(x, y) {
14968             return [dx + k * x, dy - k * y];
14969           }
14970           transform.invert = function(x, y) {
14971             return [(x - dx) / k, (dy - y) / k];
14972           };
14973           return transform;
14974         }
14975
14976         function scaleTranslateRotate(k, dx, dy, alpha) {
14977           var cosAlpha = cos$1(alpha),
14978               sinAlpha = sin$1(alpha),
14979               a = cosAlpha * k,
14980               b = sinAlpha * k,
14981               ai = cosAlpha / k,
14982               bi = sinAlpha / k,
14983               ci = (sinAlpha * dy - cosAlpha * dx) / k,
14984               fi = (sinAlpha * dx + cosAlpha * dy) / k;
14985           function transform(x, y) {
14986             return [a * x - b * y + dx, dy - b * x - a * y];
14987           }
14988           transform.invert = function(x, y) {
14989             return [ai * x - bi * y + ci, fi - bi * x - ai * y];
14990           };
14991           return transform;
14992         }
14993
14994         function projection(project) {
14995           return projectionMutator(function() { return project; })();
14996         }
14997
14998         function projectionMutator(projectAt) {
14999           var project,
15000               k = 150, // scale
15001               x = 480, y = 250, // translate
15002               lambda = 0, phi = 0, // center
15003               deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate
15004               alpha = 0, // post-rotate
15005               theta = null, preclip = clipAntimeridian, // pre-clip angle
15006               x0 = null, y0, x1, y1, postclip = identity$4, // post-clip extent
15007               delta2 = 0.5, // precision
15008               projectResample,
15009               projectTransform,
15010               projectRotateTransform,
15011               cache,
15012               cacheStream;
15013
15014           function projection(point) {
15015             return projectRotateTransform(point[0] * radians, point[1] * radians);
15016           }
15017
15018           function invert(point) {
15019             point = projectRotateTransform.invert(point[0], point[1]);
15020             return point && [point[0] * degrees$1, point[1] * degrees$1];
15021           }
15022
15023           projection.stream = function(stream) {
15024             return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream)))));
15025           };
15026
15027           projection.preclip = function(_) {
15028             return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip;
15029           };
15030
15031           projection.postclip = function(_) {
15032             return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15033           };
15034
15035           projection.clipAngle = function(_) {
15036             return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees$1;
15037           };
15038
15039           projection.clipExtent = function(_) {
15040             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]];
15041           };
15042
15043           projection.scale = function(_) {
15044             return arguments.length ? (k = +_, recenter()) : k;
15045           };
15046
15047           projection.translate = function(_) {
15048             return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y];
15049           };
15050
15051           projection.center = function(_) {
15052             return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees$1, phi * degrees$1];
15053           };
15054
15055           projection.rotate = function(_) {
15056             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];
15057           };
15058
15059           projection.angle = function(_) {
15060             return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees$1;
15061           };
15062
15063           projection.precision = function(_) {
15064             return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2);
15065           };
15066
15067           projection.fitExtent = function(extent, object) {
15068             return fitExtent(projection, extent, object);
15069           };
15070
15071           projection.fitSize = function(size, object) {
15072             return fitSize(projection, size, object);
15073           };
15074
15075           projection.fitWidth = function(width, object) {
15076             return fitWidth(projection, width, object);
15077           };
15078
15079           projection.fitHeight = function(height, object) {
15080             return fitHeight(projection, height, object);
15081           };
15082
15083           function recenter() {
15084             var center = scaleTranslateRotate(k, 0, 0, alpha).apply(null, project(lambda, phi)),
15085                 transform = (alpha ? scaleTranslateRotate : scaleTranslate)(k, x - center[0], y - center[1], alpha);
15086             rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma);
15087             projectTransform = compose(project, transform);
15088             projectRotateTransform = compose(rotate, projectTransform);
15089             projectResample = resample(projectTransform, delta2);
15090             return reset();
15091           }
15092
15093           function reset() {
15094             cache = cacheStream = null;
15095             return projection;
15096           }
15097
15098           return function() {
15099             project = projectAt.apply(this, arguments);
15100             projection.invert = project.invert && invert;
15101             return recenter();
15102           };
15103         }
15104
15105         function conicProjection(projectAt) {
15106           var phi0 = 0,
15107               phi1 = pi$3 / 3,
15108               m = projectionMutator(projectAt),
15109               p = m(phi0, phi1);
15110
15111           p.parallels = function(_) {
15112             return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees$1, phi1 * degrees$1];
15113           };
15114
15115           return p;
15116         }
15117
15118         function cylindricalEqualAreaRaw(phi0) {
15119           var cosPhi0 = cos$1(phi0);
15120
15121           function forward(lambda, phi) {
15122             return [lambda * cosPhi0, sin$1(phi) / cosPhi0];
15123           }
15124
15125           forward.invert = function(x, y) {
15126             return [x / cosPhi0, asin(y * cosPhi0)];
15127           };
15128
15129           return forward;
15130         }
15131
15132         function conicEqualAreaRaw(y0, y1) {
15133           var sy0 = sin$1(y0), n = (sy0 + sin$1(y1)) / 2;
15134
15135           // Are the parallels symmetrical around the Equator?
15136           if (abs$2(n) < epsilon$2) return cylindricalEqualAreaRaw(y0);
15137
15138           var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n;
15139
15140           function project(x, y) {
15141             var r = sqrt(c - 2 * n * sin$1(y)) / n;
15142             return [r * sin$1(x *= n), r0 - r * cos$1(x)];
15143           }
15144
15145           project.invert = function(x, y) {
15146             var r0y = r0 - y;
15147             return [atan2(x, abs$2(r0y)) / n * sign$2(r0y), asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))];
15148           };
15149
15150           return project;
15151         }
15152
15153         function conicEqualArea() {
15154           return conicProjection(conicEqualAreaRaw)
15155               .scale(155.424)
15156               .center([0, 33.6442]);
15157         }
15158
15159         function albers() {
15160           return conicEqualArea()
15161               .parallels([29.5, 45.5])
15162               .scale(1070)
15163               .translate([480, 250])
15164               .rotate([96, 0])
15165               .center([-0.6, 38.7]);
15166         }
15167
15168         // The projections must have mutually exclusive clip regions on the sphere,
15169         // as this will avoid emitting interleaving lines and polygons.
15170         function multiplex(streams) {
15171           var n = streams.length;
15172           return {
15173             point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); },
15174             sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); },
15175             lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); },
15176             lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); },
15177             polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); },
15178             polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); }
15179           };
15180         }
15181
15182         // A composite projection for the United States, configured by default for
15183         // 960×500. The projection also works quite well at 960×600 if you change the
15184         // scale to 1285 and adjust the translate accordingly. The set of standard
15185         // parallels for each region comes from USGS, which is published here:
15186         // http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers
15187         function albersUsa() {
15188           var cache,
15189               cacheStream,
15190               lower48 = albers(), lower48Point,
15191               alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338
15192               hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007
15193               point, pointStream = {point: function(x, y) { point = [x, y]; }};
15194
15195           function albersUsa(coordinates) {
15196             var x = coordinates[0], y = coordinates[1];
15197             return point = null,
15198                 (lower48Point.point(x, y), point)
15199                 || (alaskaPoint.point(x, y), point)
15200                 || (hawaiiPoint.point(x, y), point);
15201           }
15202
15203           albersUsa.invert = function(coordinates) {
15204             var k = lower48.scale(),
15205                 t = lower48.translate(),
15206                 x = (coordinates[0] - t[0]) / k,
15207                 y = (coordinates[1] - t[1]) / k;
15208             return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
15209                 : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
15210                 : lower48).invert(coordinates);
15211           };
15212
15213           albersUsa.stream = function(stream) {
15214             return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
15215           };
15216
15217           albersUsa.precision = function(_) {
15218             if (!arguments.length) return lower48.precision();
15219             lower48.precision(_), alaska.precision(_), hawaii.precision(_);
15220             return reset();
15221           };
15222
15223           albersUsa.scale = function(_) {
15224             if (!arguments.length) return lower48.scale();
15225             lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
15226             return albersUsa.translate(lower48.translate());
15227           };
15228
15229           albersUsa.translate = function(_) {
15230             if (!arguments.length) return lower48.translate();
15231             var k = lower48.scale(), x = +_[0], y = +_[1];
15232
15233             lower48Point = lower48
15234                 .translate(_)
15235                 .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
15236                 .stream(pointStream);
15237
15238             alaskaPoint = alaska
15239                 .translate([x - 0.307 * k, y + 0.201 * k])
15240                 .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]])
15241                 .stream(pointStream);
15242
15243             hawaiiPoint = hawaii
15244                 .translate([x - 0.205 * k, y + 0.212 * k])
15245                 .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]])
15246                 .stream(pointStream);
15247
15248             return reset();
15249           };
15250
15251           albersUsa.fitExtent = function(extent, object) {
15252             return fitExtent(albersUsa, extent, object);
15253           };
15254
15255           albersUsa.fitSize = function(size, object) {
15256             return fitSize(albersUsa, size, object);
15257           };
15258
15259           albersUsa.fitWidth = function(width, object) {
15260             return fitWidth(albersUsa, width, object);
15261           };
15262
15263           albersUsa.fitHeight = function(height, object) {
15264             return fitHeight(albersUsa, height, object);
15265           };
15266
15267           function reset() {
15268             cache = cacheStream = null;
15269             return albersUsa;
15270           }
15271
15272           return albersUsa.scale(1070);
15273         }
15274
15275         function azimuthalRaw(scale) {
15276           return function(x, y) {
15277             var cx = cos$1(x),
15278                 cy = cos$1(y),
15279                 k = scale(cx * cy);
15280             return [
15281               k * cy * sin$1(x),
15282               k * sin$1(y)
15283             ];
15284           }
15285         }
15286
15287         function azimuthalInvert(angle) {
15288           return function(x, y) {
15289             var z = sqrt(x * x + y * y),
15290                 c = angle(z),
15291                 sc = sin$1(c),
15292                 cc = cos$1(c);
15293             return [
15294               atan2(x * sc, z * cc),
15295               asin(z && y * sc / z)
15296             ];
15297           }
15298         }
15299
15300         var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
15301           return sqrt(2 / (1 + cxcy));
15302         });
15303
15304         azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
15305           return 2 * asin(z / 2);
15306         });
15307
15308         function azimuthalEqualArea() {
15309           return projection(azimuthalEqualAreaRaw)
15310               .scale(124.75)
15311               .clipAngle(180 - 1e-3);
15312         }
15313
15314         var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
15315           return (c = acos(c)) && c / sin$1(c);
15316         });
15317
15318         azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
15319           return z;
15320         });
15321
15322         function azimuthalEquidistant() {
15323           return projection(azimuthalEquidistantRaw)
15324               .scale(79.4188)
15325               .clipAngle(180 - 1e-3);
15326         }
15327
15328         function mercatorRaw(lambda, phi) {
15329           return [lambda, log(tan((halfPi$2 + phi) / 2))];
15330         }
15331
15332         mercatorRaw.invert = function(x, y) {
15333           return [x, 2 * atan(exp(y)) - halfPi$2];
15334         };
15335
15336         function mercator() {
15337           return mercatorProjection(mercatorRaw)
15338               .scale(961 / tau$3);
15339         }
15340
15341         function mercatorProjection(project) {
15342           var m = projection(project),
15343               center = m.center,
15344               scale = m.scale,
15345               translate = m.translate,
15346               clipExtent = m.clipExtent,
15347               x0 = null, y0, x1, y1; // clip extent
15348
15349           m.scale = function(_) {
15350             return arguments.length ? (scale(_), reclip()) : scale();
15351           };
15352
15353           m.translate = function(_) {
15354             return arguments.length ? (translate(_), reclip()) : translate();
15355           };
15356
15357           m.center = function(_) {
15358             return arguments.length ? (center(_), reclip()) : center();
15359           };
15360
15361           m.clipExtent = function(_) {
15362             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]];
15363           };
15364
15365           function reclip() {
15366             var k = pi$3 * scale(),
15367                 t = m(rotation(m.rotate()).invert([0, 0]));
15368             return clipExtent(x0 == null
15369                 ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
15370                 ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
15371                 : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
15372           }
15373
15374           return reclip();
15375         }
15376
15377         function tany(y) {
15378           return tan((halfPi$2 + y) / 2);
15379         }
15380
15381         function conicConformalRaw(y0, y1) {
15382           var cy0 = cos$1(y0),
15383               n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
15384               f = cy0 * pow(tany(y0), n) / n;
15385
15386           if (!n) return mercatorRaw;
15387
15388           function project(x, y) {
15389             if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
15390             else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
15391             var r = f / pow(tany(y), n);
15392             return [r * sin$1(n * x), f - r * cos$1(n * x)];
15393           }
15394
15395           project.invert = function(x, y) {
15396             var fy = f - y, r = sign$2(n) * sqrt(x * x + fy * fy);
15397             return [atan2(x, abs$2(fy)) / n * sign$2(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
15398           };
15399
15400           return project;
15401         }
15402
15403         function conicConformal() {
15404           return conicProjection(conicConformalRaw)
15405               .scale(109.5)
15406               .parallels([30, 30]);
15407         }
15408
15409         function equirectangularRaw(lambda, phi) {
15410           return [lambda, phi];
15411         }
15412
15413         equirectangularRaw.invert = equirectangularRaw;
15414
15415         function equirectangular() {
15416           return projection(equirectangularRaw)
15417               .scale(152.63);
15418         }
15419
15420         function conicEquidistantRaw(y0, y1) {
15421           var cy0 = cos$1(y0),
15422               n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
15423               g = cy0 / n + y0;
15424
15425           if (abs$2(n) < epsilon$2) return equirectangularRaw;
15426
15427           function project(x, y) {
15428             var gy = g - y, nx = n * x;
15429             return [gy * sin$1(nx), g - gy * cos$1(nx)];
15430           }
15431
15432           project.invert = function(x, y) {
15433             var gy = g - y;
15434             return [atan2(x, abs$2(gy)) / n * sign$2(gy), g - sign$2(n) * sqrt(x * x + gy * gy)];
15435           };
15436
15437           return project;
15438         }
15439
15440         function conicEquidistant() {
15441           return conicProjection(conicEquidistantRaw)
15442               .scale(131.154)
15443               .center([0, 13.9389]);
15444         }
15445
15446         var A1 = 1.340264,
15447             A2 = -0.081106,
15448             A3 = 0.000893,
15449             A4 = 0.003796,
15450             M = sqrt(3) / 2,
15451             iterations = 12;
15452
15453         function equalEarthRaw(lambda, phi) {
15454           var l = asin(M * sin$1(phi)), l2 = l * l, l6 = l2 * l2 * l2;
15455           return [
15456             lambda * cos$1(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))),
15457             l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2))
15458           ];
15459         }
15460
15461         equalEarthRaw.invert = function(x, y) {
15462           var l = y, l2 = l * l, l6 = l2 * l2 * l2;
15463           for (var i = 0, delta, fy, fpy; i < iterations; ++i) {
15464             fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y;
15465             fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2);
15466             l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2;
15467             if (abs$2(delta) < epsilon2$1) break;
15468           }
15469           return [
15470             M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos$1(l),
15471             asin(sin$1(l) / M)
15472           ];
15473         };
15474
15475         function equalEarth() {
15476           return projection(equalEarthRaw)
15477               .scale(177.158);
15478         }
15479
15480         function gnomonicRaw(x, y) {
15481           var cy = cos$1(y), k = cos$1(x) * cy;
15482           return [cy * sin$1(x) / k, sin$1(y) / k];
15483         }
15484
15485         gnomonicRaw.invert = azimuthalInvert(atan);
15486
15487         function gnomonic() {
15488           return projection(gnomonicRaw)
15489               .scale(144.049)
15490               .clipAngle(60);
15491         }
15492
15493         function scaleTranslate$1(kx, ky, tx, ty) {
15494           return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
15495             point: function(x, y) {
15496               this.stream.point(x * kx + tx, y * ky + ty);
15497             }
15498           });
15499         }
15500
15501         function d3_geoIdentity() {
15502           var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
15503               x0 = null, y0, x1, y1, // clip extent
15504               postclip = identity$4,
15505               cache,
15506               cacheStream,
15507               projection;
15508
15509           function reset() {
15510             cache = cacheStream = null;
15511             return projection;
15512           }
15513
15514           return projection = {
15515             stream: function(stream) {
15516               return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
15517             },
15518             postclip: function(_) {
15519               return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
15520             },
15521             clipExtent: function(_) {
15522               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]];
15523             },
15524             scale: function(_) {
15525               return arguments.length ? (transform = scaleTranslate$1((k = +_) * sx, k * sy, tx, ty), reset()) : k;
15526             },
15527             translate: function(_) {
15528               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
15529             },
15530             reflectX: function(_) {
15531               return arguments.length ? (transform = scaleTranslate$1(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
15532             },
15533             reflectY: function(_) {
15534               return arguments.length ? (transform = scaleTranslate$1(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
15535             },
15536             fitExtent: function(extent, object) {
15537               return fitExtent(projection, extent, object);
15538             },
15539             fitSize: function(size, object) {
15540               return fitSize(projection, size, object);
15541             },
15542             fitWidth: function(width, object) {
15543               return fitWidth(projection, width, object);
15544             },
15545             fitHeight: function(height, object) {
15546               return fitHeight(projection, height, object);
15547             }
15548           };
15549         }
15550
15551         function naturalEarth1Raw(lambda, phi) {
15552           var phi2 = phi * phi, phi4 = phi2 * phi2;
15553           return [
15554             lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
15555             phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
15556           ];
15557         }
15558
15559         naturalEarth1Raw.invert = function(x, y) {
15560           var phi = y, i = 25, delta;
15561           do {
15562             var phi2 = phi * phi, phi4 = phi2 * phi2;
15563             phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
15564                 (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
15565           } while (abs$2(delta) > epsilon$2 && --i > 0);
15566           return [
15567             x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
15568             phi
15569           ];
15570         };
15571
15572         function naturalEarth1() {
15573           return projection(naturalEarth1Raw)
15574               .scale(175.295);
15575         }
15576
15577         function orthographicRaw(x, y) {
15578           return [cos$1(y) * sin$1(x), sin$1(y)];
15579         }
15580
15581         orthographicRaw.invert = azimuthalInvert(asin);
15582
15583         function orthographic() {
15584           return projection(orthographicRaw)
15585               .scale(249.5)
15586               .clipAngle(90 + epsilon$2);
15587         }
15588
15589         function stereographicRaw(x, y) {
15590           var cy = cos$1(y), k = 1 + cos$1(x) * cy;
15591           return [cy * sin$1(x) / k, sin$1(y) / k];
15592         }
15593
15594         stereographicRaw.invert = azimuthalInvert(function(z) {
15595           return 2 * atan(z);
15596         });
15597
15598         function stereographic() {
15599           return projection(stereographicRaw)
15600               .scale(250)
15601               .clipAngle(142);
15602         }
15603
15604         function transverseMercatorRaw(lambda, phi) {
15605           return [log(tan((halfPi$2 + phi) / 2)), -lambda];
15606         }
15607
15608         transverseMercatorRaw.invert = function(x, y) {
15609           return [-y, 2 * atan(exp(x)) - halfPi$2];
15610         };
15611
15612         function transverseMercator() {
15613           var m = mercatorProjection(transverseMercatorRaw),
15614               center = m.center,
15615               rotate = m.rotate;
15616
15617           m.center = function(_) {
15618             return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
15619           };
15620
15621           m.rotate = function(_) {
15622             return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
15623           };
15624
15625           return rotate([0, 0, 90])
15626               .scale(159.155);
15627         }
15628
15629         function defaultSeparation(a, b) {
15630           return a.parent === b.parent ? 1 : 2;
15631         }
15632
15633         function meanX(children) {
15634           return children.reduce(meanXReduce, 0) / children.length;
15635         }
15636
15637         function meanXReduce(x, c) {
15638           return x + c.x;
15639         }
15640
15641         function maxY(children) {
15642           return 1 + children.reduce(maxYReduce, 0);
15643         }
15644
15645         function maxYReduce(y, c) {
15646           return Math.max(y, c.y);
15647         }
15648
15649         function leafLeft(node) {
15650           var children;
15651           while (children = node.children) node = children[0];
15652           return node;
15653         }
15654
15655         function leafRight(node) {
15656           var children;
15657           while (children = node.children) node = children[children.length - 1];
15658           return node;
15659         }
15660
15661         function cluster() {
15662           var separation = defaultSeparation,
15663               dx = 1,
15664               dy = 1,
15665               nodeSize = false;
15666
15667           function cluster(root) {
15668             var previousNode,
15669                 x = 0;
15670
15671             // First walk, computing the initial x & y values.
15672             root.eachAfter(function(node) {
15673               var children = node.children;
15674               if (children) {
15675                 node.x = meanX(children);
15676                 node.y = maxY(children);
15677               } else {
15678                 node.x = previousNode ? x += separation(node, previousNode) : 0;
15679                 node.y = 0;
15680                 previousNode = node;
15681               }
15682             });
15683
15684             var left = leafLeft(root),
15685                 right = leafRight(root),
15686                 x0 = left.x - separation(left, right) / 2,
15687                 x1 = right.x + separation(right, left) / 2;
15688
15689             // Second walk, normalizing x & y to the desired size.
15690             return root.eachAfter(nodeSize ? function(node) {
15691               node.x = (node.x - root.x) * dx;
15692               node.y = (root.y - node.y) * dy;
15693             } : function(node) {
15694               node.x = (node.x - x0) / (x1 - x0) * dx;
15695               node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
15696             });
15697           }
15698
15699           cluster.separation = function(x) {
15700             return arguments.length ? (separation = x, cluster) : separation;
15701           };
15702
15703           cluster.size = function(x) {
15704             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
15705           };
15706
15707           cluster.nodeSize = function(x) {
15708             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
15709           };
15710
15711           return cluster;
15712         }
15713
15714         function count(node) {
15715           var sum = 0,
15716               children = node.children,
15717               i = children && children.length;
15718           if (!i) sum = 1;
15719           else while (--i >= 0) sum += children[i].value;
15720           node.value = sum;
15721         }
15722
15723         function node_count() {
15724           return this.eachAfter(count);
15725         }
15726
15727         function node_each(callback) {
15728           var node = this, current, next = [node], children, i, n;
15729           do {
15730             current = next.reverse(), next = [];
15731             while (node = current.pop()) {
15732               callback(node), children = node.children;
15733               if (children) for (i = 0, n = children.length; i < n; ++i) {
15734                 next.push(children[i]);
15735               }
15736             }
15737           } while (next.length);
15738           return this;
15739         }
15740
15741         function node_eachBefore(callback) {
15742           var node = this, nodes = [node], children, i;
15743           while (node = nodes.pop()) {
15744             callback(node), children = node.children;
15745             if (children) for (i = children.length - 1; i >= 0; --i) {
15746               nodes.push(children[i]);
15747             }
15748           }
15749           return this;
15750         }
15751
15752         function node_eachAfter(callback) {
15753           var node = this, nodes = [node], next = [], children, i, n;
15754           while (node = nodes.pop()) {
15755             next.push(node), children = node.children;
15756             if (children) for (i = 0, n = children.length; i < n; ++i) {
15757               nodes.push(children[i]);
15758             }
15759           }
15760           while (node = next.pop()) {
15761             callback(node);
15762           }
15763           return this;
15764         }
15765
15766         function node_sum(value) {
15767           return this.eachAfter(function(node) {
15768             var sum = +value(node.data) || 0,
15769                 children = node.children,
15770                 i = children && children.length;
15771             while (--i >= 0) sum += children[i].value;
15772             node.value = sum;
15773           });
15774         }
15775
15776         function node_sort(compare) {
15777           return this.eachBefore(function(node) {
15778             if (node.children) {
15779               node.children.sort(compare);
15780             }
15781           });
15782         }
15783
15784         function node_path(end) {
15785           var start = this,
15786               ancestor = leastCommonAncestor(start, end),
15787               nodes = [start];
15788           while (start !== ancestor) {
15789             start = start.parent;
15790             nodes.push(start);
15791           }
15792           var k = nodes.length;
15793           while (end !== ancestor) {
15794             nodes.splice(k, 0, end);
15795             end = end.parent;
15796           }
15797           return nodes;
15798         }
15799
15800         function leastCommonAncestor(a, b) {
15801           if (a === b) return a;
15802           var aNodes = a.ancestors(),
15803               bNodes = b.ancestors(),
15804               c = null;
15805           a = aNodes.pop();
15806           b = bNodes.pop();
15807           while (a === b) {
15808             c = a;
15809             a = aNodes.pop();
15810             b = bNodes.pop();
15811           }
15812           return c;
15813         }
15814
15815         function node_ancestors() {
15816           var node = this, nodes = [node];
15817           while (node = node.parent) {
15818             nodes.push(node);
15819           }
15820           return nodes;
15821         }
15822
15823         function node_descendants() {
15824           var nodes = [];
15825           this.each(function(node) {
15826             nodes.push(node);
15827           });
15828           return nodes;
15829         }
15830
15831         function node_leaves() {
15832           var leaves = [];
15833           this.eachBefore(function(node) {
15834             if (!node.children) {
15835               leaves.push(node);
15836             }
15837           });
15838           return leaves;
15839         }
15840
15841         function node_links() {
15842           var root = this, links = [];
15843           root.each(function(node) {
15844             if (node !== root) { // Don’t include the root’s parent, if any.
15845               links.push({source: node.parent, target: node});
15846             }
15847           });
15848           return links;
15849         }
15850
15851         function hierarchy(data, children) {
15852           var root = new Node(data),
15853               valued = +data.value && (root.value = data.value),
15854               node,
15855               nodes = [root],
15856               child,
15857               childs,
15858               i,
15859               n;
15860
15861           if (children == null) children = defaultChildren;
15862
15863           while (node = nodes.pop()) {
15864             if (valued) node.value = +node.data.value;
15865             if ((childs = children(node.data)) && (n = childs.length)) {
15866               node.children = new Array(n);
15867               for (i = n - 1; i >= 0; --i) {
15868                 nodes.push(child = node.children[i] = new Node(childs[i]));
15869                 child.parent = node;
15870                 child.depth = node.depth + 1;
15871               }
15872             }
15873           }
15874
15875           return root.eachBefore(computeHeight);
15876         }
15877
15878         function node_copy() {
15879           return hierarchy(this).eachBefore(copyData);
15880         }
15881
15882         function defaultChildren(d) {
15883           return d.children;
15884         }
15885
15886         function copyData(node) {
15887           node.data = node.data.data;
15888         }
15889
15890         function computeHeight(node) {
15891           var height = 0;
15892           do node.height = height;
15893           while ((node = node.parent) && (node.height < ++height));
15894         }
15895
15896         function Node(data) {
15897           this.data = data;
15898           this.depth =
15899           this.height = 0;
15900           this.parent = null;
15901         }
15902
15903         Node.prototype = hierarchy.prototype = {
15904           constructor: Node,
15905           count: node_count,
15906           each: node_each,
15907           eachAfter: node_eachAfter,
15908           eachBefore: node_eachBefore,
15909           sum: node_sum,
15910           sort: node_sort,
15911           path: node_path,
15912           ancestors: node_ancestors,
15913           descendants: node_descendants,
15914           leaves: node_leaves,
15915           links: node_links,
15916           copy: node_copy
15917         };
15918
15919         var slice$8 = Array.prototype.slice;
15920
15921         function shuffle$1(array) {
15922           var m = array.length,
15923               t,
15924               i;
15925
15926           while (m) {
15927             i = Math.random() * m-- | 0;
15928             t = array[m];
15929             array[m] = array[i];
15930             array[i] = t;
15931           }
15932
15933           return array;
15934         }
15935
15936         function enclose(circles) {
15937           var i = 0, n = (circles = shuffle$1(slice$8.call(circles))).length, B = [], p, e;
15938
15939           while (i < n) {
15940             p = circles[i];
15941             if (e && enclosesWeak(e, p)) ++i;
15942             else e = encloseBasis(B = extendBasis(B, p)), i = 0;
15943           }
15944
15945           return e;
15946         }
15947
15948         function extendBasis(B, p) {
15949           var i, j;
15950
15951           if (enclosesWeakAll(p, B)) return [p];
15952
15953           // If we get here then B must have at least one element.
15954           for (i = 0; i < B.length; ++i) {
15955             if (enclosesNot(p, B[i])
15956                 && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
15957               return [B[i], p];
15958             }
15959           }
15960
15961           // If we get here then B must have at least two elements.
15962           for (i = 0; i < B.length - 1; ++i) {
15963             for (j = i + 1; j < B.length; ++j) {
15964               if (enclosesNot(encloseBasis2(B[i], B[j]), p)
15965                   && enclosesNot(encloseBasis2(B[i], p), B[j])
15966                   && enclosesNot(encloseBasis2(B[j], p), B[i])
15967                   && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
15968                 return [B[i], B[j], p];
15969               }
15970             }
15971           }
15972
15973           // If we get here then something is very wrong.
15974           throw new Error;
15975         }
15976
15977         function enclosesNot(a, b) {
15978           var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
15979           return dr < 0 || dr * dr < dx * dx + dy * dy;
15980         }
15981
15982         function enclosesWeak(a, b) {
15983           var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
15984           return dr > 0 && dr * dr > dx * dx + dy * dy;
15985         }
15986
15987         function enclosesWeakAll(a, B) {
15988           for (var i = 0; i < B.length; ++i) {
15989             if (!enclosesWeak(a, B[i])) {
15990               return false;
15991             }
15992           }
15993           return true;
15994         }
15995
15996         function encloseBasis(B) {
15997           switch (B.length) {
15998             case 1: return encloseBasis1(B[0]);
15999             case 2: return encloseBasis2(B[0], B[1]);
16000             case 3: return encloseBasis3(B[0], B[1], B[2]);
16001           }
16002         }
16003
16004         function encloseBasis1(a) {
16005           return {
16006             x: a.x,
16007             y: a.y,
16008             r: a.r
16009           };
16010         }
16011
16012         function encloseBasis2(a, b) {
16013           var x1 = a.x, y1 = a.y, r1 = a.r,
16014               x2 = b.x, y2 = b.y, r2 = b.r,
16015               x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
16016               l = Math.sqrt(x21 * x21 + y21 * y21);
16017           return {
16018             x: (x1 + x2 + x21 / l * r21) / 2,
16019             y: (y1 + y2 + y21 / l * r21) / 2,
16020             r: (l + r1 + r2) / 2
16021           };
16022         }
16023
16024         function encloseBasis3(a, b, c) {
16025           var x1 = a.x, y1 = a.y, r1 = a.r,
16026               x2 = b.x, y2 = b.y, r2 = b.r,
16027               x3 = c.x, y3 = c.y, r3 = c.r,
16028               a2 = x1 - x2,
16029               a3 = x1 - x3,
16030               b2 = y1 - y2,
16031               b3 = y1 - y3,
16032               c2 = r2 - r1,
16033               c3 = r3 - r1,
16034               d1 = x1 * x1 + y1 * y1 - r1 * r1,
16035               d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
16036               d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
16037               ab = a3 * b2 - a2 * b3,
16038               xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
16039               xb = (b3 * c2 - b2 * c3) / ab,
16040               ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
16041               yb = (a2 * c3 - a3 * c2) / ab,
16042               A = xb * xb + yb * yb - 1,
16043               B = 2 * (r1 + xa * xb + ya * yb),
16044               C = xa * xa + ya * ya - r1 * r1,
16045               r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
16046           return {
16047             x: x1 + xa + xb * r,
16048             y: y1 + ya + yb * r,
16049             r: r
16050           };
16051         }
16052
16053         function place(b, a, c) {
16054           var dx = b.x - a.x, x, a2,
16055               dy = b.y - a.y, y, b2,
16056               d2 = dx * dx + dy * dy;
16057           if (d2) {
16058             a2 = a.r + c.r, a2 *= a2;
16059             b2 = b.r + c.r, b2 *= b2;
16060             if (a2 > b2) {
16061               x = (d2 + b2 - a2) / (2 * d2);
16062               y = Math.sqrt(Math.max(0, b2 / d2 - x * x));
16063               c.x = b.x - x * dx - y * dy;
16064               c.y = b.y - x * dy + y * dx;
16065             } else {
16066               x = (d2 + a2 - b2) / (2 * d2);
16067               y = Math.sqrt(Math.max(0, a2 / d2 - x * x));
16068               c.x = a.x + x * dx - y * dy;
16069               c.y = a.y + x * dy + y * dx;
16070             }
16071           } else {
16072             c.x = a.x + c.r;
16073             c.y = a.y;
16074           }
16075         }
16076
16077         function intersects(a, b) {
16078           var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y;
16079           return dr > 0 && dr * dr > dx * dx + dy * dy;
16080         }
16081
16082         function score(node) {
16083           var a = node._,
16084               b = node.next._,
16085               ab = a.r + b.r,
16086               dx = (a.x * b.r + b.x * a.r) / ab,
16087               dy = (a.y * b.r + b.y * a.r) / ab;
16088           return dx * dx + dy * dy;
16089         }
16090
16091         function Node$1(circle) {
16092           this._ = circle;
16093           this.next = null;
16094           this.previous = null;
16095         }
16096
16097         function packEnclose(circles) {
16098           if (!(n = circles.length)) return 0;
16099
16100           var a, b, c, n, aa, ca, i, j, k, sj, sk;
16101
16102           // Place the first circle.
16103           a = circles[0], a.x = 0, a.y = 0;
16104           if (!(n > 1)) return a.r;
16105
16106           // Place the second circle.
16107           b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
16108           if (!(n > 2)) return a.r + b.r;
16109
16110           // Place the third circle.
16111           place(b, a, c = circles[2]);
16112
16113           // Initialize the front-chain using the first three circles a, b and c.
16114           a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
16115           a.next = c.previous = b;
16116           b.next = a.previous = c;
16117           c.next = b.previous = a;
16118
16119           // Attempt to place each remaining circle…
16120           pack: for (i = 3; i < n; ++i) {
16121             place(a._, b._, c = circles[i]), c = new Node$1(c);
16122
16123             // Find the closest intersecting circle on the front-chain, if any.
16124             // “Closeness” is determined by linear distance along the front-chain.
16125             // “Ahead” or “behind” is likewise determined by linear distance.
16126             j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
16127             do {
16128               if (sj <= sk) {
16129                 if (intersects(j._, c._)) {
16130                   b = j, a.next = b, b.previous = a, --i;
16131                   continue pack;
16132                 }
16133                 sj += j._.r, j = j.next;
16134               } else {
16135                 if (intersects(k._, c._)) {
16136                   a = k, a.next = b, b.previous = a, --i;
16137                   continue pack;
16138                 }
16139                 sk += k._.r, k = k.previous;
16140               }
16141             } while (j !== k.next);
16142
16143             // Success! Insert the new circle c between a and b.
16144             c.previous = a, c.next = b, a.next = b.previous = b = c;
16145
16146             // Compute the new closest circle pair to the centroid.
16147             aa = score(a);
16148             while ((c = c.next) !== b) {
16149               if ((ca = score(c)) < aa) {
16150                 a = c, aa = ca;
16151               }
16152             }
16153             b = a.next;
16154           }
16155
16156           // Compute the enclosing circle of the front chain.
16157           a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
16158
16159           // Translate the circles to put the enclosing circle around the origin.
16160           for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
16161
16162           return c.r;
16163         }
16164
16165         function siblings(circles) {
16166           packEnclose(circles);
16167           return circles;
16168         }
16169
16170         function optional(f) {
16171           return f == null ? null : required(f);
16172         }
16173
16174         function required(f) {
16175           if (typeof f !== "function") throw new Error;
16176           return f;
16177         }
16178
16179         function constantZero() {
16180           return 0;
16181         }
16182
16183         function constant$9(x) {
16184           return function() {
16185             return x;
16186           };
16187         }
16188
16189         function defaultRadius$1(d) {
16190           return Math.sqrt(d.value);
16191         }
16192
16193         function index$1() {
16194           var radius = null,
16195               dx = 1,
16196               dy = 1,
16197               padding = constantZero;
16198
16199           function pack(root) {
16200             root.x = dx / 2, root.y = dy / 2;
16201             if (radius) {
16202               root.eachBefore(radiusLeaf(radius))
16203                   .eachAfter(packChildren(padding, 0.5))
16204                   .eachBefore(translateChild(1));
16205             } else {
16206               root.eachBefore(radiusLeaf(defaultRadius$1))
16207                   .eachAfter(packChildren(constantZero, 1))
16208                   .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
16209                   .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
16210             }
16211             return root;
16212           }
16213
16214           pack.radius = function(x) {
16215             return arguments.length ? (radius = optional(x), pack) : radius;
16216           };
16217
16218           pack.size = function(x) {
16219             return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
16220           };
16221
16222           pack.padding = function(x) {
16223             return arguments.length ? (padding = typeof x === "function" ? x : constant$9(+x), pack) : padding;
16224           };
16225
16226           return pack;
16227         }
16228
16229         function radiusLeaf(radius) {
16230           return function(node) {
16231             if (!node.children) {
16232               node.r = Math.max(0, +radius(node) || 0);
16233             }
16234           };
16235         }
16236
16237         function packChildren(padding, k) {
16238           return function(node) {
16239             if (children = node.children) {
16240               var children,
16241                   i,
16242                   n = children.length,
16243                   r = padding(node) * k || 0,
16244                   e;
16245
16246               if (r) for (i = 0; i < n; ++i) children[i].r += r;
16247               e = packEnclose(children);
16248               if (r) for (i = 0; i < n; ++i) children[i].r -= r;
16249               node.r = e + r;
16250             }
16251           };
16252         }
16253
16254         function translateChild(k) {
16255           return function(node) {
16256             var parent = node.parent;
16257             node.r *= k;
16258             if (parent) {
16259               node.x = parent.x + k * node.x;
16260               node.y = parent.y + k * node.y;
16261             }
16262           };
16263         }
16264
16265         function roundNode(node) {
16266           node.x0 = Math.round(node.x0);
16267           node.y0 = Math.round(node.y0);
16268           node.x1 = Math.round(node.x1);
16269           node.y1 = Math.round(node.y1);
16270         }
16271
16272         function treemapDice(parent, x0, y0, x1, y1) {
16273           var nodes = parent.children,
16274               node,
16275               i = -1,
16276               n = nodes.length,
16277               k = parent.value && (x1 - x0) / parent.value;
16278
16279           while (++i < n) {
16280             node = nodes[i], node.y0 = y0, node.y1 = y1;
16281             node.x0 = x0, node.x1 = x0 += node.value * k;
16282           }
16283         }
16284
16285         function partition() {
16286           var dx = 1,
16287               dy = 1,
16288               padding = 0,
16289               round = false;
16290
16291           function partition(root) {
16292             var n = root.height + 1;
16293             root.x0 =
16294             root.y0 = padding;
16295             root.x1 = dx;
16296             root.y1 = dy / n;
16297             root.eachBefore(positionNode(dy, n));
16298             if (round) root.eachBefore(roundNode);
16299             return root;
16300           }
16301
16302           function positionNode(dy, n) {
16303             return function(node) {
16304               if (node.children) {
16305                 treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
16306               }
16307               var x0 = node.x0,
16308                   y0 = node.y0,
16309                   x1 = node.x1 - padding,
16310                   y1 = node.y1 - padding;
16311               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16312               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16313               node.x0 = x0;
16314               node.y0 = y0;
16315               node.x1 = x1;
16316               node.y1 = y1;
16317             };
16318           }
16319
16320           partition.round = function(x) {
16321             return arguments.length ? (round = !!x, partition) : round;
16322           };
16323
16324           partition.size = function(x) {
16325             return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
16326           };
16327
16328           partition.padding = function(x) {
16329             return arguments.length ? (padding = +x, partition) : padding;
16330           };
16331
16332           return partition;
16333         }
16334
16335         var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
16336             preroot = {depth: -1},
16337             ambiguous = {};
16338
16339         function defaultId(d) {
16340           return d.id;
16341         }
16342
16343         function defaultParentId(d) {
16344           return d.parentId;
16345         }
16346
16347         function stratify() {
16348           var id = defaultId,
16349               parentId = defaultParentId;
16350
16351           function stratify(data) {
16352             var d,
16353                 i,
16354                 n = data.length,
16355                 root,
16356                 parent,
16357                 node,
16358                 nodes = new Array(n),
16359                 nodeId,
16360                 nodeKey,
16361                 nodeByKey = {};
16362
16363             for (i = 0; i < n; ++i) {
16364               d = data[i], node = nodes[i] = new Node(d);
16365               if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
16366                 nodeKey = keyPrefix$1 + (node.id = nodeId);
16367                 nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
16368               }
16369             }
16370
16371             for (i = 0; i < n; ++i) {
16372               node = nodes[i], nodeId = parentId(data[i], i, data);
16373               if (nodeId == null || !(nodeId += "")) {
16374                 if (root) throw new Error("multiple roots");
16375                 root = node;
16376               } else {
16377                 parent = nodeByKey[keyPrefix$1 + nodeId];
16378                 if (!parent) throw new Error("missing: " + nodeId);
16379                 if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
16380                 if (parent.children) parent.children.push(node);
16381                 else parent.children = [node];
16382                 node.parent = parent;
16383               }
16384             }
16385
16386             if (!root) throw new Error("no root");
16387             root.parent = preroot;
16388             root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
16389             root.parent = null;
16390             if (n > 0) throw new Error("cycle");
16391
16392             return root;
16393           }
16394
16395           stratify.id = function(x) {
16396             return arguments.length ? (id = required(x), stratify) : id;
16397           };
16398
16399           stratify.parentId = function(x) {
16400             return arguments.length ? (parentId = required(x), stratify) : parentId;
16401           };
16402
16403           return stratify;
16404         }
16405
16406         function defaultSeparation$1(a, b) {
16407           return a.parent === b.parent ? 1 : 2;
16408         }
16409
16410         // function radialSeparation(a, b) {
16411         //   return (a.parent === b.parent ? 1 : 2) / a.depth;
16412         // }
16413
16414         // This function is used to traverse the left contour of a subtree (or
16415         // subforest). It returns the successor of v on this contour. This successor is
16416         // either given by the leftmost child of v or by the thread of v. The function
16417         // returns null if and only if v is on the highest level of its subtree.
16418         function nextLeft(v) {
16419           var children = v.children;
16420           return children ? children[0] : v.t;
16421         }
16422
16423         // This function works analogously to nextLeft.
16424         function nextRight(v) {
16425           var children = v.children;
16426           return children ? children[children.length - 1] : v.t;
16427         }
16428
16429         // Shifts the current subtree rooted at w+. This is done by increasing
16430         // prelim(w+) and mod(w+) by shift.
16431         function moveSubtree(wm, wp, shift) {
16432           var change = shift / (wp.i - wm.i);
16433           wp.c -= change;
16434           wp.s += shift;
16435           wm.c += change;
16436           wp.z += shift;
16437           wp.m += shift;
16438         }
16439
16440         // All other shifts, applied to the smaller subtrees between w- and w+, are
16441         // performed by this function. To prepare the shifts, we have to adjust
16442         // change(w+), shift(w+), and change(w-).
16443         function executeShifts(v) {
16444           var shift = 0,
16445               change = 0,
16446               children = v.children,
16447               i = children.length,
16448               w;
16449           while (--i >= 0) {
16450             w = children[i];
16451             w.z += shift;
16452             w.m += shift;
16453             shift += w.s + (change += w.c);
16454           }
16455         }
16456
16457         // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
16458         // returns the specified (default) ancestor.
16459         function nextAncestor(vim, v, ancestor) {
16460           return vim.a.parent === v.parent ? vim.a : ancestor;
16461         }
16462
16463         function TreeNode(node, i) {
16464           this._ = node;
16465           this.parent = null;
16466           this.children = null;
16467           this.A = null; // default ancestor
16468           this.a = this; // ancestor
16469           this.z = 0; // prelim
16470           this.m = 0; // mod
16471           this.c = 0; // change
16472           this.s = 0; // shift
16473           this.t = null; // thread
16474           this.i = i; // number
16475         }
16476
16477         TreeNode.prototype = Object.create(Node.prototype);
16478
16479         function treeRoot(root) {
16480           var tree = new TreeNode(root, 0),
16481               node,
16482               nodes = [tree],
16483               child,
16484               children,
16485               i,
16486               n;
16487
16488           while (node = nodes.pop()) {
16489             if (children = node._.children) {
16490               node.children = new Array(n = children.length);
16491               for (i = n - 1; i >= 0; --i) {
16492                 nodes.push(child = node.children[i] = new TreeNode(children[i], i));
16493                 child.parent = node;
16494               }
16495             }
16496           }
16497
16498           (tree.parent = new TreeNode(null, 0)).children = [tree];
16499           return tree;
16500         }
16501
16502         // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
16503         function tree() {
16504           var separation = defaultSeparation$1,
16505               dx = 1,
16506               dy = 1,
16507               nodeSize = null;
16508
16509           function tree(root) {
16510             var t = treeRoot(root);
16511
16512             // Compute the layout using Buchheim et al.’s algorithm.
16513             t.eachAfter(firstWalk), t.parent.m = -t.z;
16514             t.eachBefore(secondWalk);
16515
16516             // If a fixed node size is specified, scale x and y.
16517             if (nodeSize) root.eachBefore(sizeNode);
16518
16519             // If a fixed tree size is specified, scale x and y based on the extent.
16520             // Compute the left-most, right-most, and depth-most nodes for extents.
16521             else {
16522               var left = root,
16523                   right = root,
16524                   bottom = root;
16525               root.eachBefore(function(node) {
16526                 if (node.x < left.x) left = node;
16527                 if (node.x > right.x) right = node;
16528                 if (node.depth > bottom.depth) bottom = node;
16529               });
16530               var s = left === right ? 1 : separation(left, right) / 2,
16531                   tx = s - left.x,
16532                   kx = dx / (right.x + s + tx),
16533                   ky = dy / (bottom.depth || 1);
16534               root.eachBefore(function(node) {
16535                 node.x = (node.x + tx) * kx;
16536                 node.y = node.depth * ky;
16537               });
16538             }
16539
16540             return root;
16541           }
16542
16543           // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
16544           // applied recursively to the children of v, as well as the function
16545           // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
16546           // node v is placed to the midpoint of its outermost children.
16547           function firstWalk(v) {
16548             var children = v.children,
16549                 siblings = v.parent.children,
16550                 w = v.i ? siblings[v.i - 1] : null;
16551             if (children) {
16552               executeShifts(v);
16553               var midpoint = (children[0].z + children[children.length - 1].z) / 2;
16554               if (w) {
16555                 v.z = w.z + separation(v._, w._);
16556                 v.m = v.z - midpoint;
16557               } else {
16558                 v.z = midpoint;
16559               }
16560             } else if (w) {
16561               v.z = w.z + separation(v._, w._);
16562             }
16563             v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
16564           }
16565
16566           // Computes all real x-coordinates by summing up the modifiers recursively.
16567           function secondWalk(v) {
16568             v._.x = v.z + v.parent.m;
16569             v.m += v.parent.m;
16570           }
16571
16572           // The core of the algorithm. Here, a new subtree is combined with the
16573           // previous subtrees. Threads are used to traverse the inside and outside
16574           // contours of the left and right subtree up to the highest common level. The
16575           // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
16576           // superscript o means outside and i means inside, the subscript - means left
16577           // subtree and + means right subtree. For summing up the modifiers along the
16578           // contour, we use respective variables si+, si-, so-, and so+. Whenever two
16579           // nodes of the inside contours conflict, we compute the left one of the
16580           // greatest uncommon ancestors using the function ANCESTOR and call MOVE
16581           // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
16582           // Finally, we add a new thread (if necessary).
16583           function apportion(v, w, ancestor) {
16584             if (w) {
16585               var vip = v,
16586                   vop = v,
16587                   vim = w,
16588                   vom = vip.parent.children[0],
16589                   sip = vip.m,
16590                   sop = vop.m,
16591                   sim = vim.m,
16592                   som = vom.m,
16593                   shift;
16594               while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
16595                 vom = nextLeft(vom);
16596                 vop = nextRight(vop);
16597                 vop.a = v;
16598                 shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
16599                 if (shift > 0) {
16600                   moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
16601                   sip += shift;
16602                   sop += shift;
16603                 }
16604                 sim += vim.m;
16605                 sip += vip.m;
16606                 som += vom.m;
16607                 sop += vop.m;
16608               }
16609               if (vim && !nextRight(vop)) {
16610                 vop.t = vim;
16611                 vop.m += sim - sop;
16612               }
16613               if (vip && !nextLeft(vom)) {
16614                 vom.t = vip;
16615                 vom.m += sip - som;
16616                 ancestor = v;
16617               }
16618             }
16619             return ancestor;
16620           }
16621
16622           function sizeNode(node) {
16623             node.x *= dx;
16624             node.y = node.depth * dy;
16625           }
16626
16627           tree.separation = function(x) {
16628             return arguments.length ? (separation = x, tree) : separation;
16629           };
16630
16631           tree.size = function(x) {
16632             return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
16633           };
16634
16635           tree.nodeSize = function(x) {
16636             return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
16637           };
16638
16639           return tree;
16640         }
16641
16642         function treemapSlice(parent, x0, y0, x1, y1) {
16643           var nodes = parent.children,
16644               node,
16645               i = -1,
16646               n = nodes.length,
16647               k = parent.value && (y1 - y0) / parent.value;
16648
16649           while (++i < n) {
16650             node = nodes[i], node.x0 = x0, node.x1 = x1;
16651             node.y0 = y0, node.y1 = y0 += node.value * k;
16652           }
16653         }
16654
16655         var phi = (1 + Math.sqrt(5)) / 2;
16656
16657         function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
16658           var rows = [],
16659               nodes = parent.children,
16660               row,
16661               nodeValue,
16662               i0 = 0,
16663               i1 = 0,
16664               n = nodes.length,
16665               dx, dy,
16666               value = parent.value,
16667               sumValue,
16668               minValue,
16669               maxValue,
16670               newRatio,
16671               minRatio,
16672               alpha,
16673               beta;
16674
16675           while (i0 < n) {
16676             dx = x1 - x0, dy = y1 - y0;
16677
16678             // Find the next non-empty node.
16679             do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
16680             minValue = maxValue = sumValue;
16681             alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
16682             beta = sumValue * sumValue * alpha;
16683             minRatio = Math.max(maxValue / beta, beta / minValue);
16684
16685             // Keep adding nodes while the aspect ratio maintains or improves.
16686             for (; i1 < n; ++i1) {
16687               sumValue += nodeValue = nodes[i1].value;
16688               if (nodeValue < minValue) minValue = nodeValue;
16689               if (nodeValue > maxValue) maxValue = nodeValue;
16690               beta = sumValue * sumValue * alpha;
16691               newRatio = Math.max(maxValue / beta, beta / minValue);
16692               if (newRatio > minRatio) { sumValue -= nodeValue; break; }
16693               minRatio = newRatio;
16694             }
16695
16696             // Position and record the row orientation.
16697             rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
16698             if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
16699             else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
16700             value -= sumValue, i0 = i1;
16701           }
16702
16703           return rows;
16704         }
16705
16706         var squarify = (function custom(ratio) {
16707
16708           function squarify(parent, x0, y0, x1, y1) {
16709             squarifyRatio(ratio, parent, x0, y0, x1, y1);
16710           }
16711
16712           squarify.ratio = function(x) {
16713             return custom((x = +x) > 1 ? x : 1);
16714           };
16715
16716           return squarify;
16717         })(phi);
16718
16719         function index$2() {
16720           var tile = squarify,
16721               round = false,
16722               dx = 1,
16723               dy = 1,
16724               paddingStack = [0],
16725               paddingInner = constantZero,
16726               paddingTop = constantZero,
16727               paddingRight = constantZero,
16728               paddingBottom = constantZero,
16729               paddingLeft = constantZero;
16730
16731           function treemap(root) {
16732             root.x0 =
16733             root.y0 = 0;
16734             root.x1 = dx;
16735             root.y1 = dy;
16736             root.eachBefore(positionNode);
16737             paddingStack = [0];
16738             if (round) root.eachBefore(roundNode);
16739             return root;
16740           }
16741
16742           function positionNode(node) {
16743             var p = paddingStack[node.depth],
16744                 x0 = node.x0 + p,
16745                 y0 = node.y0 + p,
16746                 x1 = node.x1 - p,
16747                 y1 = node.y1 - p;
16748             if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16749             if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16750             node.x0 = x0;
16751             node.y0 = y0;
16752             node.x1 = x1;
16753             node.y1 = y1;
16754             if (node.children) {
16755               p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
16756               x0 += paddingLeft(node) - p;
16757               y0 += paddingTop(node) - p;
16758               x1 -= paddingRight(node) - p;
16759               y1 -= paddingBottom(node) - p;
16760               if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
16761               if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
16762               tile(node, x0, y0, x1, y1);
16763             }
16764           }
16765
16766           treemap.round = function(x) {
16767             return arguments.length ? (round = !!x, treemap) : round;
16768           };
16769
16770           treemap.size = function(x) {
16771             return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
16772           };
16773
16774           treemap.tile = function(x) {
16775             return arguments.length ? (tile = required(x), treemap) : tile;
16776           };
16777
16778           treemap.padding = function(x) {
16779             return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
16780           };
16781
16782           treemap.paddingInner = function(x) {
16783             return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$9(+x), treemap) : paddingInner;
16784           };
16785
16786           treemap.paddingOuter = function(x) {
16787             return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
16788           };
16789
16790           treemap.paddingTop = function(x) {
16791             return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$9(+x), treemap) : paddingTop;
16792           };
16793
16794           treemap.paddingRight = function(x) {
16795             return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$9(+x), treemap) : paddingRight;
16796           };
16797
16798           treemap.paddingBottom = function(x) {
16799             return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$9(+x), treemap) : paddingBottom;
16800           };
16801
16802           treemap.paddingLeft = function(x) {
16803             return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$9(+x), treemap) : paddingLeft;
16804           };
16805
16806           return treemap;
16807         }
16808
16809         function binary(parent, x0, y0, x1, y1) {
16810           var nodes = parent.children,
16811               i, n = nodes.length,
16812               sum, sums = new Array(n + 1);
16813
16814           for (sums[0] = sum = i = 0; i < n; ++i) {
16815             sums[i + 1] = sum += nodes[i].value;
16816           }
16817
16818           partition(0, n, parent.value, x0, y0, x1, y1);
16819
16820           function partition(i, j, value, x0, y0, x1, y1) {
16821             if (i >= j - 1) {
16822               var node = nodes[i];
16823               node.x0 = x0, node.y0 = y0;
16824               node.x1 = x1, node.y1 = y1;
16825               return;
16826             }
16827
16828             var valueOffset = sums[i],
16829                 valueTarget = (value / 2) + valueOffset,
16830                 k = i + 1,
16831                 hi = j - 1;
16832
16833             while (k < hi) {
16834               var mid = k + hi >>> 1;
16835               if (sums[mid] < valueTarget) k = mid + 1;
16836               else hi = mid;
16837             }
16838
16839             if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
16840
16841             var valueLeft = sums[k] - valueOffset,
16842                 valueRight = value - valueLeft;
16843
16844             if ((x1 - x0) > (y1 - y0)) {
16845               var xk = (x0 * valueRight + x1 * valueLeft) / value;
16846               partition(i, k, valueLeft, x0, y0, xk, y1);
16847               partition(k, j, valueRight, xk, y0, x1, y1);
16848             } else {
16849               var yk = (y0 * valueRight + y1 * valueLeft) / value;
16850               partition(i, k, valueLeft, x0, y0, x1, yk);
16851               partition(k, j, valueRight, x0, yk, x1, y1);
16852             }
16853           }
16854         }
16855
16856         function sliceDice(parent, x0, y0, x1, y1) {
16857           (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
16858         }
16859
16860         var resquarify = (function custom(ratio) {
16861
16862           function resquarify(parent, x0, y0, x1, y1) {
16863             if ((rows = parent._squarify) && (rows.ratio === ratio)) {
16864               var rows,
16865                   row,
16866                   nodes,
16867                   i,
16868                   j = -1,
16869                   n,
16870                   m = rows.length,
16871                   value = parent.value;
16872
16873               while (++j < m) {
16874                 row = rows[j], nodes = row.children;
16875                 for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
16876                 if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
16877                 else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
16878                 value -= row.value;
16879               }
16880             } else {
16881               parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
16882               rows.ratio = ratio;
16883             }
16884           }
16885
16886           resquarify.ratio = function(x) {
16887             return custom((x = +x) > 1 ? x : 1);
16888           };
16889
16890           return resquarify;
16891         })(phi);
16892
16893         function d3_polygonArea(polygon) {
16894           var i = -1,
16895               n = polygon.length,
16896               a,
16897               b = polygon[n - 1],
16898               area = 0;
16899
16900           while (++i < n) {
16901             a = b;
16902             b = polygon[i];
16903             area += a[1] * b[0] - a[0] * b[1];
16904           }
16905
16906           return area / 2;
16907         }
16908
16909         function d3_polygonCentroid(polygon) {
16910           var i = -1,
16911               n = polygon.length,
16912               x = 0,
16913               y = 0,
16914               a,
16915               b = polygon[n - 1],
16916               c,
16917               k = 0;
16918
16919           while (++i < n) {
16920             a = b;
16921             b = polygon[i];
16922             k += c = a[0] * b[1] - b[0] * a[1];
16923             x += (a[0] + b[0]) * c;
16924             y += (a[1] + b[1]) * c;
16925           }
16926
16927           return k *= 3, [x / k, y / k];
16928         }
16929
16930         // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
16931         // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
16932         // right, +y is up). Returns a positive value if ABC is counter-clockwise,
16933         // negative if clockwise, and zero if the points are collinear.
16934         function cross$1(a, b, c) {
16935           return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
16936         }
16937
16938         function lexicographicOrder(a, b) {
16939           return a[0] - b[0] || a[1] - b[1];
16940         }
16941
16942         // Computes the upper convex hull per the monotone chain algorithm.
16943         // Assumes points.length >= 3, is sorted by x, unique in y.
16944         // Returns an array of indices into points in left-to-right order.
16945         function computeUpperHullIndexes(points) {
16946           var n = points.length,
16947               indexes = [0, 1],
16948               size = 2;
16949
16950           for (var i = 2; i < n; ++i) {
16951             while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
16952             indexes[size++] = i;
16953           }
16954
16955           return indexes.slice(0, size); // remove popped points
16956         }
16957
16958         function d3_polygonHull(points) {
16959           if ((n = points.length) < 3) return null;
16960
16961           var i,
16962               n,
16963               sortedPoints = new Array(n),
16964               flippedPoints = new Array(n);
16965
16966           for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
16967           sortedPoints.sort(lexicographicOrder);
16968           for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
16969
16970           var upperIndexes = computeUpperHullIndexes(sortedPoints),
16971               lowerIndexes = computeUpperHullIndexes(flippedPoints);
16972
16973           // Construct the hull polygon, removing possible duplicate endpoints.
16974           var skipLeft = lowerIndexes[0] === upperIndexes[0],
16975               skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
16976               hull = [];
16977
16978           // Add upper hull in right-to-l order.
16979           // Then add lower hull in left-to-right order.
16980           for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
16981           for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
16982
16983           return hull;
16984         }
16985
16986         function contains$3(polygon, point) {
16987           var n = polygon.length,
16988               p = polygon[n - 1],
16989               x = point[0], y = point[1],
16990               x0 = p[0], y0 = p[1],
16991               x1, y1,
16992               inside = false;
16993
16994           for (var i = 0; i < n; ++i) {
16995             p = polygon[i], x1 = p[0], y1 = p[1];
16996             if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
16997             x0 = x1, y0 = y1;
16998           }
16999
17000           return inside;
17001         }
17002
17003         function length$1(polygon) {
17004           var i = -1,
17005               n = polygon.length,
17006               b = polygon[n - 1],
17007               xa,
17008               ya,
17009               xb = b[0],
17010               yb = b[1],
17011               perimeter = 0;
17012
17013           while (++i < n) {
17014             xa = xb;
17015             ya = yb;
17016             b = polygon[i];
17017             xb = b[0];
17018             yb = b[1];
17019             xa -= xb;
17020             ya -= yb;
17021             perimeter += Math.sqrt(xa * xa + ya * ya);
17022           }
17023
17024           return perimeter;
17025         }
17026
17027         function defaultSource$1() {
17028           return Math.random();
17029         }
17030
17031         var uniform = (function sourceRandomUniform(source) {
17032           function randomUniform(min, max) {
17033             min = min == null ? 0 : +min;
17034             max = max == null ? 1 : +max;
17035             if (arguments.length === 1) max = min, min = 0;
17036             else max -= min;
17037             return function() {
17038               return source() * max + min;
17039             };
17040           }
17041
17042           randomUniform.source = sourceRandomUniform;
17043
17044           return randomUniform;
17045         })(defaultSource$1);
17046
17047         var normal = (function sourceRandomNormal(source) {
17048           function randomNormal(mu, sigma) {
17049             var x, r;
17050             mu = mu == null ? 0 : +mu;
17051             sigma = sigma == null ? 1 : +sigma;
17052             return function() {
17053               var y;
17054
17055               // If available, use the second previously-generated uniform random.
17056               if (x != null) y = x, x = null;
17057
17058               // Otherwise, generate a new x and y.
17059               else do {
17060                 x = source() * 2 - 1;
17061                 y = source() * 2 - 1;
17062                 r = x * x + y * y;
17063               } while (!r || r > 1);
17064
17065               return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
17066             };
17067           }
17068
17069           randomNormal.source = sourceRandomNormal;
17070
17071           return randomNormal;
17072         })(defaultSource$1);
17073
17074         var logNormal = (function sourceRandomLogNormal(source) {
17075           function randomLogNormal() {
17076             var randomNormal = normal.source(source).apply(this, arguments);
17077             return function() {
17078               return Math.exp(randomNormal());
17079             };
17080           }
17081
17082           randomLogNormal.source = sourceRandomLogNormal;
17083
17084           return randomLogNormal;
17085         })(defaultSource$1);
17086
17087         var irwinHall = (function sourceRandomIrwinHall(source) {
17088           function randomIrwinHall(n) {
17089             return function() {
17090               for (var sum = 0, i = 0; i < n; ++i) sum += source();
17091               return sum;
17092             };
17093           }
17094
17095           randomIrwinHall.source = sourceRandomIrwinHall;
17096
17097           return randomIrwinHall;
17098         })(defaultSource$1);
17099
17100         var bates = (function sourceRandomBates(source) {
17101           function randomBates(n) {
17102             var randomIrwinHall = irwinHall.source(source)(n);
17103             return function() {
17104               return randomIrwinHall() / n;
17105             };
17106           }
17107
17108           randomBates.source = sourceRandomBates;
17109
17110           return randomBates;
17111         })(defaultSource$1);
17112
17113         var exponential$1 = (function sourceRandomExponential(source) {
17114           function randomExponential(lambda) {
17115             return function() {
17116               return -Math.log(1 - source()) / lambda;
17117             };
17118           }
17119
17120           randomExponential.source = sourceRandomExponential;
17121
17122           return randomExponential;
17123         })(defaultSource$1);
17124
17125         function initRange(domain, range) {
17126           switch (arguments.length) {
17127             case 0: break;
17128             case 1: this.range(domain); break;
17129             default: this.range(range).domain(domain); break;
17130           }
17131           return this;
17132         }
17133
17134         function initInterpolator(domain, interpolator) {
17135           switch (arguments.length) {
17136             case 0: break;
17137             case 1: this.interpolator(domain); break;
17138             default: this.interpolator(interpolator).domain(domain); break;
17139           }
17140           return this;
17141         }
17142
17143         var array$4 = Array.prototype;
17144
17145         var map$4 = array$4.map;
17146         var slice$9 = array$4.slice;
17147
17148         var implicit = {name: "implicit"};
17149
17150         function ordinal() {
17151           var index = map$3(),
17152               domain = [],
17153               range = [],
17154               unknown = implicit;
17155
17156           function scale(d) {
17157             var key = d + "", i = index.get(key);
17158             if (!i) {
17159               if (unknown !== implicit) return unknown;
17160               index.set(key, i = domain.push(d));
17161             }
17162             return range[(i - 1) % range.length];
17163           }
17164
17165           scale.domain = function(_) {
17166             if (!arguments.length) return domain.slice();
17167             domain = [], index = map$3();
17168             var i = -1, n = _.length, d, key;
17169             while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
17170             return scale;
17171           };
17172
17173           scale.range = function(_) {
17174             return arguments.length ? (range = slice$9.call(_), scale) : range.slice();
17175           };
17176
17177           scale.unknown = function(_) {
17178             return arguments.length ? (unknown = _, scale) : unknown;
17179           };
17180
17181           scale.copy = function() {
17182             return ordinal(domain, range).unknown(unknown);
17183           };
17184
17185           initRange.apply(scale, arguments);
17186
17187           return scale;
17188         }
17189
17190         function band() {
17191           var scale = ordinal().unknown(undefined),
17192               domain = scale.domain,
17193               ordinalRange = scale.range,
17194               range = [0, 1],
17195               step,
17196               bandwidth,
17197               round = false,
17198               paddingInner = 0,
17199               paddingOuter = 0,
17200               align = 0.5;
17201
17202           delete scale.unknown;
17203
17204           function rescale() {
17205             var n = domain().length,
17206                 reverse = range[1] < range[0],
17207                 start = range[reverse - 0],
17208                 stop = range[1 - reverse];
17209             step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
17210             if (round) step = Math.floor(step);
17211             start += (stop - start - step * (n - paddingInner)) * align;
17212             bandwidth = step * (1 - paddingInner);
17213             if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
17214             var values = d3_range(n).map(function(i) { return start + step * i; });
17215             return ordinalRange(reverse ? values.reverse() : values);
17216           }
17217
17218           scale.domain = function(_) {
17219             return arguments.length ? (domain(_), rescale()) : domain();
17220           };
17221
17222           scale.range = function(_) {
17223             return arguments.length ? (range = [+_[0], +_[1]], rescale()) : range.slice();
17224           };
17225
17226           scale.rangeRound = function(_) {
17227             return range = [+_[0], +_[1]], round = true, rescale();
17228           };
17229
17230           scale.bandwidth = function() {
17231             return bandwidth;
17232           };
17233
17234           scale.step = function() {
17235             return step;
17236           };
17237
17238           scale.round = function(_) {
17239             return arguments.length ? (round = !!_, rescale()) : round;
17240           };
17241
17242           scale.padding = function(_) {
17243             return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner;
17244           };
17245
17246           scale.paddingInner = function(_) {
17247             return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner;
17248           };
17249
17250           scale.paddingOuter = function(_) {
17251             return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter;
17252           };
17253
17254           scale.align = function(_) {
17255             return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
17256           };
17257
17258           scale.copy = function() {
17259             return band(domain(), range)
17260                 .round(round)
17261                 .paddingInner(paddingInner)
17262                 .paddingOuter(paddingOuter)
17263                 .align(align);
17264           };
17265
17266           return initRange.apply(rescale(), arguments);
17267         }
17268
17269         function pointish(scale) {
17270           var copy = scale.copy;
17271
17272           scale.padding = scale.paddingOuter;
17273           delete scale.paddingInner;
17274           delete scale.paddingOuter;
17275
17276           scale.copy = function() {
17277             return pointish(copy());
17278           };
17279
17280           return scale;
17281         }
17282
17283         function point$1() {
17284           return pointish(band.apply(null, arguments).paddingInner(1));
17285         }
17286
17287         function constant$a(x) {
17288           return function() {
17289             return x;
17290           };
17291         }
17292
17293         function number$2(x) {
17294           return +x;
17295         }
17296
17297         var unit = [0, 1];
17298
17299         function identity$5(x) {
17300           return x;
17301         }
17302
17303         function normalize(a, b) {
17304           return (b -= (a = +a))
17305               ? function(x) { return (x - a) / b; }
17306               : constant$a(isNaN(b) ? NaN : 0.5);
17307         }
17308
17309         function clamper(domain) {
17310           var a = domain[0], b = domain[domain.length - 1], t;
17311           if (a > b) t = a, a = b, b = t;
17312           return function(x) { return Math.max(a, Math.min(b, x)); };
17313         }
17314
17315         // normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
17316         // interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b].
17317         function bimap(domain, range, interpolate) {
17318           var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1];
17319           if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0);
17320           else d0 = normalize(d0, d1), r0 = interpolate(r0, r1);
17321           return function(x) { return r0(d0(x)); };
17322         }
17323
17324         function polymap(domain, range, interpolate) {
17325           var j = Math.min(domain.length, range.length) - 1,
17326               d = new Array(j),
17327               r = new Array(j),
17328               i = -1;
17329
17330           // Reverse descending domains.
17331           if (domain[j] < domain[0]) {
17332             domain = domain.slice().reverse();
17333             range = range.slice().reverse();
17334           }
17335
17336           while (++i < j) {
17337             d[i] = normalize(domain[i], domain[i + 1]);
17338             r[i] = interpolate(range[i], range[i + 1]);
17339           }
17340
17341           return function(x) {
17342             var i = bisectRight(domain, x, 1, j) - 1;
17343             return r[i](d[i](x));
17344           };
17345         }
17346
17347         function copy$1(source, target) {
17348           return target
17349               .domain(source.domain())
17350               .range(source.range())
17351               .interpolate(source.interpolate())
17352               .clamp(source.clamp())
17353               .unknown(source.unknown());
17354         }
17355
17356         function transformer$1() {
17357           var domain = unit,
17358               range = unit,
17359               interpolate = d3_interpolate,
17360               transform,
17361               untransform,
17362               unknown,
17363               clamp = identity$5,
17364               piecewise,
17365               output,
17366               input;
17367
17368           function rescale() {
17369             piecewise = Math.min(domain.length, range.length) > 2 ? polymap : bimap;
17370             output = input = null;
17371             return scale;
17372           }
17373
17374           function scale(x) {
17375             return isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x)));
17376           }
17377
17378           scale.invert = function(y) {
17379             return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3_interpolateNumber)))(y)));
17380           };
17381
17382           scale.domain = function(_) {
17383             return arguments.length ? (domain = map$4.call(_, number$2), clamp === identity$5 || (clamp = clamper(domain)), rescale()) : domain.slice();
17384           };
17385
17386           scale.range = function(_) {
17387             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17388           };
17389
17390           scale.rangeRound = function(_) {
17391             return range = slice$9.call(_), interpolate = interpolateRound, rescale();
17392           };
17393
17394           scale.clamp = function(_) {
17395             return arguments.length ? (clamp = _ ? clamper(domain) : identity$5, scale) : clamp !== identity$5;
17396           };
17397
17398           scale.interpolate = function(_) {
17399             return arguments.length ? (interpolate = _, rescale()) : interpolate;
17400           };
17401
17402           scale.unknown = function(_) {
17403             return arguments.length ? (unknown = _, scale) : unknown;
17404           };
17405
17406           return function(t, u) {
17407             transform = t, untransform = u;
17408             return rescale();
17409           };
17410         }
17411
17412         function continuous(transform, untransform) {
17413           return transformer$1()(transform, untransform);
17414         }
17415
17416         function tickFormat(start, stop, count, specifier) {
17417           var step = tickStep(start, stop, count),
17418               precision;
17419           specifier = formatSpecifier(specifier == null ? ",f" : specifier);
17420           switch (specifier.type) {
17421             case "s": {
17422               var value = Math.max(Math.abs(start), Math.abs(stop));
17423               if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
17424               return formatPrefix(specifier, value);
17425             }
17426             case "":
17427             case "e":
17428             case "g":
17429             case "p":
17430             case "r": {
17431               if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
17432               break;
17433             }
17434             case "f":
17435             case "%": {
17436               if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
17437               break;
17438             }
17439           }
17440           return format(specifier);
17441         }
17442
17443         function linearish(scale) {
17444           var domain = scale.domain;
17445
17446           scale.ticks = function(count) {
17447             var d = domain();
17448             return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
17449           };
17450
17451           scale.tickFormat = function(count, specifier) {
17452             var d = domain();
17453             return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier);
17454           };
17455
17456           scale.nice = function(count) {
17457             if (count == null) count = 10;
17458
17459             var d = domain(),
17460                 i0 = 0,
17461                 i1 = d.length - 1,
17462                 start = d[i0],
17463                 stop = d[i1],
17464                 step;
17465
17466             if (stop < start) {
17467               step = start, start = stop, stop = step;
17468               step = i0, i0 = i1, i1 = step;
17469             }
17470
17471             step = tickIncrement(start, stop, count);
17472
17473             if (step > 0) {
17474               start = Math.floor(start / step) * step;
17475               stop = Math.ceil(stop / step) * step;
17476               step = tickIncrement(start, stop, count);
17477             } else if (step < 0) {
17478               start = Math.ceil(start * step) / step;
17479               stop = Math.floor(stop * step) / step;
17480               step = tickIncrement(start, stop, count);
17481             }
17482
17483             if (step > 0) {
17484               d[i0] = Math.floor(start / step) * step;
17485               d[i1] = Math.ceil(stop / step) * step;
17486               domain(d);
17487             } else if (step < 0) {
17488               d[i0] = Math.ceil(start * step) / step;
17489               d[i1] = Math.floor(stop * step) / step;
17490               domain(d);
17491             }
17492
17493             return scale;
17494           };
17495
17496           return scale;
17497         }
17498
17499         function linear$2() {
17500           var scale = continuous(identity$5, identity$5);
17501
17502           scale.copy = function() {
17503             return copy$1(scale, linear$2());
17504           };
17505
17506           initRange.apply(scale, arguments);
17507
17508           return linearish(scale);
17509         }
17510
17511         function identity$6(domain) {
17512           var unknown;
17513
17514           function scale(x) {
17515             return isNaN(x = +x) ? unknown : x;
17516           }
17517
17518           scale.invert = scale;
17519
17520           scale.domain = scale.range = function(_) {
17521             return arguments.length ? (domain = map$4.call(_, number$2), scale) : domain.slice();
17522           };
17523
17524           scale.unknown = function(_) {
17525             return arguments.length ? (unknown = _, scale) : unknown;
17526           };
17527
17528           scale.copy = function() {
17529             return identity$6(domain).unknown(unknown);
17530           };
17531
17532           domain = arguments.length ? map$4.call(domain, number$2) : [0, 1];
17533
17534           return linearish(scale);
17535         }
17536
17537         function nice(domain, interval) {
17538           domain = domain.slice();
17539
17540           var i0 = 0,
17541               i1 = domain.length - 1,
17542               x0 = domain[i0],
17543               x1 = domain[i1],
17544               t;
17545
17546           if (x1 < x0) {
17547             t = i0, i0 = i1, i1 = t;
17548             t = x0, x0 = x1, x1 = t;
17549           }
17550
17551           domain[i0] = interval.floor(x0);
17552           domain[i1] = interval.ceil(x1);
17553           return domain;
17554         }
17555
17556         function transformLog(x) {
17557           return Math.log(x);
17558         }
17559
17560         function transformExp(x) {
17561           return Math.exp(x);
17562         }
17563
17564         function transformLogn(x) {
17565           return -Math.log(-x);
17566         }
17567
17568         function transformExpn(x) {
17569           return -Math.exp(-x);
17570         }
17571
17572         function pow10(x) {
17573           return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
17574         }
17575
17576         function powp(base) {
17577           return base === 10 ? pow10
17578               : base === Math.E ? Math.exp
17579               : function(x) { return Math.pow(base, x); };
17580         }
17581
17582         function logp(base) {
17583           return base === Math.E ? Math.log
17584               : base === 10 && Math.log10
17585               || base === 2 && Math.log2
17586               || (base = Math.log(base), function(x) { return Math.log(x) / base; });
17587         }
17588
17589         function reflect(f) {
17590           return function(x) {
17591             return -f(-x);
17592           };
17593         }
17594
17595         function loggish(transform) {
17596           var scale = transform(transformLog, transformExp),
17597               domain = scale.domain,
17598               base = 10,
17599               logs,
17600               pows;
17601
17602           function rescale() {
17603             logs = logp(base), pows = powp(base);
17604             if (domain()[0] < 0) {
17605               logs = reflect(logs), pows = reflect(pows);
17606               transform(transformLogn, transformExpn);
17607             } else {
17608               transform(transformLog, transformExp);
17609             }
17610             return scale;
17611           }
17612
17613           scale.base = function(_) {
17614             return arguments.length ? (base = +_, rescale()) : base;
17615           };
17616
17617           scale.domain = function(_) {
17618             return arguments.length ? (domain(_), rescale()) : domain();
17619           };
17620
17621           scale.ticks = function(count) {
17622             var d = domain(),
17623                 u = d[0],
17624                 v = d[d.length - 1],
17625                 r;
17626
17627             if (r = v < u) i = u, u = v, v = i;
17628
17629             var i = logs(u),
17630                 j = logs(v),
17631                 p,
17632                 k,
17633                 t,
17634                 n = count == null ? 10 : +count,
17635                 z = [];
17636
17637             if (!(base % 1) && j - i < n) {
17638               i = Math.round(i) - 1, j = Math.round(j) + 1;
17639               if (u > 0) for (; i < j; ++i) {
17640                 for (k = 1, p = pows(i); k < base; ++k) {
17641                   t = p * k;
17642                   if (t < u) continue;
17643                   if (t > v) break;
17644                   z.push(t);
17645                 }
17646               } else for (; i < j; ++i) {
17647                 for (k = base - 1, p = pows(i); k >= 1; --k) {
17648                   t = p * k;
17649                   if (t < u) continue;
17650                   if (t > v) break;
17651                   z.push(t);
17652                 }
17653               }
17654             } else {
17655               z = ticks(i, j, Math.min(j - i, n)).map(pows);
17656             }
17657
17658             return r ? z.reverse() : z;
17659           };
17660
17661           scale.tickFormat = function(count, specifier) {
17662             if (specifier == null) specifier = base === 10 ? ".0e" : ",";
17663             if (typeof specifier !== "function") specifier = format(specifier);
17664             if (count === Infinity) return specifier;
17665             if (count == null) count = 10;
17666             var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
17667             return function(d) {
17668               var i = d / pows(Math.round(logs(d)));
17669               if (i * base < base - 0.5) i *= base;
17670               return i <= k ? specifier(d) : "";
17671             };
17672           };
17673
17674           scale.nice = function() {
17675             return domain(nice(domain(), {
17676               floor: function(x) { return pows(Math.floor(logs(x))); },
17677               ceil: function(x) { return pows(Math.ceil(logs(x))); }
17678             }));
17679           };
17680
17681           return scale;
17682         }
17683
17684         function log$1() {
17685           var scale = loggish(transformer$1()).domain([1, 10]);
17686
17687           scale.copy = function() {
17688             return copy$1(scale, log$1()).base(scale.base());
17689           };
17690
17691           initRange.apply(scale, arguments);
17692
17693           return scale;
17694         }
17695
17696         function transformSymlog(c) {
17697           return function(x) {
17698             return Math.sign(x) * Math.log1p(Math.abs(x / c));
17699           };
17700         }
17701
17702         function transformSymexp(c) {
17703           return function(x) {
17704             return Math.sign(x) * Math.expm1(Math.abs(x)) * c;
17705           };
17706         }
17707
17708         function symlogish(transform) {
17709           var c = 1, scale = transform(transformSymlog(c), transformSymexp(c));
17710
17711           scale.constant = function(_) {
17712             return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c;
17713           };
17714
17715           return linearish(scale);
17716         }
17717
17718         function symlog() {
17719           var scale = symlogish(transformer$1());
17720
17721           scale.copy = function() {
17722             return copy$1(scale, symlog()).constant(scale.constant());
17723           };
17724
17725           return initRange.apply(scale, arguments);
17726         }
17727
17728         function transformPow(exponent) {
17729           return function(x) {
17730             return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
17731           };
17732         }
17733
17734         function transformSqrt(x) {
17735           return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x);
17736         }
17737
17738         function transformSquare(x) {
17739           return x < 0 ? -x * x : x * x;
17740         }
17741
17742         function powish(transform) {
17743           var scale = transform(identity$5, identity$5),
17744               exponent = 1;
17745
17746           function rescale() {
17747             return exponent === 1 ? transform(identity$5, identity$5)
17748                 : exponent === 0.5 ? transform(transformSqrt, transformSquare)
17749                 : transform(transformPow(exponent), transformPow(1 / exponent));
17750           }
17751
17752           scale.exponent = function(_) {
17753             return arguments.length ? (exponent = +_, rescale()) : exponent;
17754           };
17755
17756           return linearish(scale);
17757         }
17758
17759         function pow$1() {
17760           var scale = powish(transformer$1());
17761
17762           scale.copy = function() {
17763             return copy$1(scale, pow$1()).exponent(scale.exponent());
17764           };
17765
17766           initRange.apply(scale, arguments);
17767
17768           return scale;
17769         }
17770
17771         function sqrt$1() {
17772           return pow$1.apply(null, arguments).exponent(0.5);
17773         }
17774
17775         function quantile() {
17776           var domain = [],
17777               range = [],
17778               thresholds = [],
17779               unknown;
17780
17781           function rescale() {
17782             var i = 0, n = Math.max(1, range.length);
17783             thresholds = new Array(n - 1);
17784             while (++i < n) thresholds[i - 1] = threshold(domain, i / n);
17785             return scale;
17786           }
17787
17788           function scale(x) {
17789             return isNaN(x = +x) ? unknown : range[bisectRight(thresholds, x)];
17790           }
17791
17792           scale.invertExtent = function(y) {
17793             var i = range.indexOf(y);
17794             return i < 0 ? [NaN, NaN] : [
17795               i > 0 ? thresholds[i - 1] : domain[0],
17796               i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
17797             ];
17798           };
17799
17800           scale.domain = function(_) {
17801             if (!arguments.length) return domain.slice();
17802             domain = [];
17803             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
17804             domain.sort(d3_ascending);
17805             return rescale();
17806           };
17807
17808           scale.range = function(_) {
17809             return arguments.length ? (range = slice$9.call(_), rescale()) : range.slice();
17810           };
17811
17812           scale.unknown = function(_) {
17813             return arguments.length ? (unknown = _, scale) : unknown;
17814           };
17815
17816           scale.quantiles = function() {
17817             return thresholds.slice();
17818           };
17819
17820           scale.copy = function() {
17821             return quantile()
17822                 .domain(domain)
17823                 .range(range)
17824                 .unknown(unknown);
17825           };
17826
17827           return initRange.apply(scale, arguments);
17828         }
17829
17830         function quantize() {
17831           var x0 = 0,
17832               x1 = 1,
17833               n = 1,
17834               domain = [0.5],
17835               range = [0, 1],
17836               unknown;
17837
17838           function scale(x) {
17839             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17840           }
17841
17842           function rescale() {
17843             var i = -1;
17844             domain = new Array(n);
17845             while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
17846             return scale;
17847           }
17848
17849           scale.domain = function(_) {
17850             return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
17851           };
17852
17853           scale.range = function(_) {
17854             return arguments.length ? (n = (range = slice$9.call(_)).length - 1, rescale()) : range.slice();
17855           };
17856
17857           scale.invertExtent = function(y) {
17858             var i = range.indexOf(y);
17859             return i < 0 ? [NaN, NaN]
17860                 : i < 1 ? [x0, domain[0]]
17861                 : i >= n ? [domain[n - 1], x1]
17862                 : [domain[i - 1], domain[i]];
17863           };
17864
17865           scale.unknown = function(_) {
17866             return arguments.length ? (unknown = _, scale) : scale;
17867           };
17868
17869           scale.thresholds = function() {
17870             return domain.slice();
17871           };
17872
17873           scale.copy = function() {
17874             return quantize()
17875                 .domain([x0, x1])
17876                 .range(range)
17877                 .unknown(unknown);
17878           };
17879
17880           return initRange.apply(linearish(scale), arguments);
17881         }
17882
17883         function threshold$1() {
17884           var domain = [0.5],
17885               range = [0, 1],
17886               unknown,
17887               n = 1;
17888
17889           function scale(x) {
17890             return x <= x ? range[bisectRight(domain, x, 0, n)] : unknown;
17891           }
17892
17893           scale.domain = function(_) {
17894             return arguments.length ? (domain = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice();
17895           };
17896
17897           scale.range = function(_) {
17898             return arguments.length ? (range = slice$9.call(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice();
17899           };
17900
17901           scale.invertExtent = function(y) {
17902             var i = range.indexOf(y);
17903             return [domain[i - 1], domain[i]];
17904           };
17905
17906           scale.unknown = function(_) {
17907             return arguments.length ? (unknown = _, scale) : unknown;
17908           };
17909
17910           scale.copy = function() {
17911             return threshold$1()
17912                 .domain(domain)
17913                 .range(range)
17914                 .unknown(unknown);
17915           };
17916
17917           return initRange.apply(scale, arguments);
17918         }
17919
17920         var t0$1 = new Date,
17921             t1$1 = new Date;
17922
17923         function newInterval(floori, offseti, count, field) {
17924
17925           function interval(date) {
17926             return floori(date = new Date(+date)), date;
17927           }
17928
17929           interval.floor = interval;
17930
17931           interval.ceil = function(date) {
17932             return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
17933           };
17934
17935           interval.round = function(date) {
17936             var d0 = interval(date),
17937                 d1 = interval.ceil(date);
17938             return date - d0 < d1 - date ? d0 : d1;
17939           };
17940
17941           interval.offset = function(date, step) {
17942             return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
17943           };
17944
17945           interval.range = function(start, stop, step) {
17946             var range = [], previous;
17947             start = interval.ceil(start);
17948             step = step == null ? 1 : Math.floor(step);
17949             if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
17950             do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
17951             while (previous < start && start < stop);
17952             return range;
17953           };
17954
17955           interval.filter = function(test) {
17956             return newInterval(function(date) {
17957               if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
17958             }, function(date, step) {
17959               if (date >= date) {
17960                 if (step < 0) while (++step <= 0) {
17961                   while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
17962                 } else while (--step >= 0) {
17963                   while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
17964                 }
17965               }
17966             });
17967           };
17968
17969           if (count) {
17970             interval.count = function(start, end) {
17971               t0$1.setTime(+start), t1$1.setTime(+end);
17972               floori(t0$1), floori(t1$1);
17973               return Math.floor(count(t0$1, t1$1));
17974             };
17975
17976             interval.every = function(step) {
17977               step = Math.floor(step);
17978               return !isFinite(step) || !(step > 0) ? null
17979                   : !(step > 1) ? interval
17980                   : interval.filter(field
17981                       ? function(d) { return field(d) % step === 0; }
17982                       : function(d) { return interval.count(0, d) % step === 0; });
17983             };
17984           }
17985
17986           return interval;
17987         }
17988
17989         var millisecond = newInterval(function() {
17990           // noop
17991         }, function(date, step) {
17992           date.setTime(+date + step);
17993         }, function(start, end) {
17994           return end - start;
17995         });
17996
17997         // An optimized implementation for this simple case.
17998         millisecond.every = function(k) {
17999           k = Math.floor(k);
18000           if (!isFinite(k) || !(k > 0)) return null;
18001           if (!(k > 1)) return millisecond;
18002           return newInterval(function(date) {
18003             date.setTime(Math.floor(date / k) * k);
18004           }, function(date, step) {
18005             date.setTime(+date + step * k);
18006           }, function(start, end) {
18007             return (end - start) / k;
18008           });
18009         };
18010         var milliseconds = millisecond.range;
18011
18012         var durationSecond = 1e3;
18013         var durationMinute = 6e4;
18014         var durationHour = 36e5;
18015         var durationDay = 864e5;
18016         var durationWeek = 6048e5;
18017
18018         var second = newInterval(function(date) {
18019           date.setTime(date - date.getMilliseconds());
18020         }, function(date, step) {
18021           date.setTime(+date + step * durationSecond);
18022         }, function(start, end) {
18023           return (end - start) / durationSecond;
18024         }, function(date) {
18025           return date.getUTCSeconds();
18026         });
18027         var seconds = second.range;
18028
18029         var minute = newInterval(function(date) {
18030           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond);
18031         }, function(date, step) {
18032           date.setTime(+date + step * durationMinute);
18033         }, function(start, end) {
18034           return (end - start) / durationMinute;
18035         }, function(date) {
18036           return date.getMinutes();
18037         });
18038         var minutes = minute.range;
18039
18040         var hour = newInterval(function(date) {
18041           date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute);
18042         }, function(date, step) {
18043           date.setTime(+date + step * durationHour);
18044         }, function(start, end) {
18045           return (end - start) / durationHour;
18046         }, function(date) {
18047           return date.getHours();
18048         });
18049         var hours = hour.range;
18050
18051         var day = newInterval(function(date) {
18052           date.setHours(0, 0, 0, 0);
18053         }, function(date, step) {
18054           date.setDate(date.getDate() + step);
18055         }, function(start, end) {
18056           return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
18057         }, function(date) {
18058           return date.getDate() - 1;
18059         });
18060         var days = day.range;
18061
18062         function weekday(i) {
18063           return newInterval(function(date) {
18064             date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
18065             date.setHours(0, 0, 0, 0);
18066           }, function(date, step) {
18067             date.setDate(date.getDate() + step * 7);
18068           }, function(start, end) {
18069             return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
18070           });
18071         }
18072
18073         var sunday = weekday(0);
18074         var monday = weekday(1);
18075         var tuesday = weekday(2);
18076         var wednesday = weekday(3);
18077         var thursday = weekday(4);
18078         var friday = weekday(5);
18079         var saturday = weekday(6);
18080
18081         var sundays = sunday.range;
18082         var mondays = monday.range;
18083         var tuesdays = tuesday.range;
18084         var wednesdays = wednesday.range;
18085         var thursdays = thursday.range;
18086         var fridays = friday.range;
18087         var saturdays = saturday.range;
18088
18089         var month = newInterval(function(date) {
18090           date.setDate(1);
18091           date.setHours(0, 0, 0, 0);
18092         }, function(date, step) {
18093           date.setMonth(date.getMonth() + step);
18094         }, function(start, end) {
18095           return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
18096         }, function(date) {
18097           return date.getMonth();
18098         });
18099         var months = month.range;
18100
18101         var year = newInterval(function(date) {
18102           date.setMonth(0, 1);
18103           date.setHours(0, 0, 0, 0);
18104         }, function(date, step) {
18105           date.setFullYear(date.getFullYear() + step);
18106         }, function(start, end) {
18107           return end.getFullYear() - start.getFullYear();
18108         }, function(date) {
18109           return date.getFullYear();
18110         });
18111
18112         // An optimized implementation for this simple case.
18113         year.every = function(k) {
18114           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18115             date.setFullYear(Math.floor(date.getFullYear() / k) * k);
18116             date.setMonth(0, 1);
18117             date.setHours(0, 0, 0, 0);
18118           }, function(date, step) {
18119             date.setFullYear(date.getFullYear() + step * k);
18120           });
18121         };
18122         var years = year.range;
18123
18124         var utcMinute = newInterval(function(date) {
18125           date.setUTCSeconds(0, 0);
18126         }, function(date, step) {
18127           date.setTime(+date + step * durationMinute);
18128         }, function(start, end) {
18129           return (end - start) / durationMinute;
18130         }, function(date) {
18131           return date.getUTCMinutes();
18132         });
18133         var utcMinutes = utcMinute.range;
18134
18135         var utcHour = newInterval(function(date) {
18136           date.setUTCMinutes(0, 0, 0);
18137         }, function(date, step) {
18138           date.setTime(+date + step * durationHour);
18139         }, function(start, end) {
18140           return (end - start) / durationHour;
18141         }, function(date) {
18142           return date.getUTCHours();
18143         });
18144         var utcHours = utcHour.range;
18145
18146         var utcDay = newInterval(function(date) {
18147           date.setUTCHours(0, 0, 0, 0);
18148         }, function(date, step) {
18149           date.setUTCDate(date.getUTCDate() + step);
18150         }, function(start, end) {
18151           return (end - start) / durationDay;
18152         }, function(date) {
18153           return date.getUTCDate() - 1;
18154         });
18155         var utcDays = utcDay.range;
18156
18157         function utcWeekday(i) {
18158           return newInterval(function(date) {
18159             date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
18160             date.setUTCHours(0, 0, 0, 0);
18161           }, function(date, step) {
18162             date.setUTCDate(date.getUTCDate() + step * 7);
18163           }, function(start, end) {
18164             return (end - start) / durationWeek;
18165           });
18166         }
18167
18168         var utcSunday = utcWeekday(0);
18169         var utcMonday = utcWeekday(1);
18170         var utcTuesday = utcWeekday(2);
18171         var utcWednesday = utcWeekday(3);
18172         var utcThursday = utcWeekday(4);
18173         var utcFriday = utcWeekday(5);
18174         var utcSaturday = utcWeekday(6);
18175
18176         var utcSundays = utcSunday.range;
18177         var utcMondays = utcMonday.range;
18178         var utcTuesdays = utcTuesday.range;
18179         var utcWednesdays = utcWednesday.range;
18180         var utcThursdays = utcThursday.range;
18181         var utcFridays = utcFriday.range;
18182         var utcSaturdays = utcSaturday.range;
18183
18184         var utcMonth = newInterval(function(date) {
18185           date.setUTCDate(1);
18186           date.setUTCHours(0, 0, 0, 0);
18187         }, function(date, step) {
18188           date.setUTCMonth(date.getUTCMonth() + step);
18189         }, function(start, end) {
18190           return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
18191         }, function(date) {
18192           return date.getUTCMonth();
18193         });
18194         var utcMonths = utcMonth.range;
18195
18196         var utcYear = newInterval(function(date) {
18197           date.setUTCMonth(0, 1);
18198           date.setUTCHours(0, 0, 0, 0);
18199         }, function(date, step) {
18200           date.setUTCFullYear(date.getUTCFullYear() + step);
18201         }, function(start, end) {
18202           return end.getUTCFullYear() - start.getUTCFullYear();
18203         }, function(date) {
18204           return date.getUTCFullYear();
18205         });
18206
18207         // An optimized implementation for this simple case.
18208         utcYear.every = function(k) {
18209           return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
18210             date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
18211             date.setUTCMonth(0, 1);
18212             date.setUTCHours(0, 0, 0, 0);
18213           }, function(date, step) {
18214             date.setUTCFullYear(date.getUTCFullYear() + step * k);
18215           });
18216         };
18217         var utcYears = utcYear.range;
18218
18219         function localDate(d) {
18220           if (0 <= d.y && d.y < 100) {
18221             var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
18222             date.setFullYear(d.y);
18223             return date;
18224           }
18225           return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
18226         }
18227
18228         function utcDate(d) {
18229           if (0 <= d.y && d.y < 100) {
18230             var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
18231             date.setUTCFullYear(d.y);
18232             return date;
18233           }
18234           return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
18235         }
18236
18237         function newYear(y) {
18238           return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
18239         }
18240
18241         function formatLocale$1(locale) {
18242           var locale_dateTime = locale.dateTime,
18243               locale_date = locale.date,
18244               locale_time = locale.time,
18245               locale_periods = locale.periods,
18246               locale_weekdays = locale.days,
18247               locale_shortWeekdays = locale.shortDays,
18248               locale_months = locale.months,
18249               locale_shortMonths = locale.shortMonths;
18250
18251           var periodRe = formatRe(locale_periods),
18252               periodLookup = formatLookup(locale_periods),
18253               weekdayRe = formatRe(locale_weekdays),
18254               weekdayLookup = formatLookup(locale_weekdays),
18255               shortWeekdayRe = formatRe(locale_shortWeekdays),
18256               shortWeekdayLookup = formatLookup(locale_shortWeekdays),
18257               monthRe = formatRe(locale_months),
18258               monthLookup = formatLookup(locale_months),
18259               shortMonthRe = formatRe(locale_shortMonths),
18260               shortMonthLookup = formatLookup(locale_shortMonths);
18261
18262           var formats = {
18263             "a": formatShortWeekday,
18264             "A": formatWeekday,
18265             "b": formatShortMonth,
18266             "B": formatMonth,
18267             "c": null,
18268             "d": formatDayOfMonth,
18269             "e": formatDayOfMonth,
18270             "f": formatMicroseconds,
18271             "H": formatHour24,
18272             "I": formatHour12,
18273             "j": formatDayOfYear,
18274             "L": formatMilliseconds,
18275             "m": formatMonthNumber,
18276             "M": formatMinutes,
18277             "p": formatPeriod,
18278             "Q": formatUnixTimestamp,
18279             "s": formatUnixTimestampSeconds,
18280             "S": formatSeconds,
18281             "u": formatWeekdayNumberMonday,
18282             "U": formatWeekNumberSunday,
18283             "V": formatWeekNumberISO,
18284             "w": formatWeekdayNumberSunday,
18285             "W": formatWeekNumberMonday,
18286             "x": null,
18287             "X": null,
18288             "y": formatYear$1,
18289             "Y": formatFullYear,
18290             "Z": formatZone,
18291             "%": formatLiteralPercent
18292           };
18293
18294           var utcFormats = {
18295             "a": formatUTCShortWeekday,
18296             "A": formatUTCWeekday,
18297             "b": formatUTCShortMonth,
18298             "B": formatUTCMonth,
18299             "c": null,
18300             "d": formatUTCDayOfMonth,
18301             "e": formatUTCDayOfMonth,
18302             "f": formatUTCMicroseconds,
18303             "H": formatUTCHour24,
18304             "I": formatUTCHour12,
18305             "j": formatUTCDayOfYear,
18306             "L": formatUTCMilliseconds,
18307             "m": formatUTCMonthNumber,
18308             "M": formatUTCMinutes,
18309             "p": formatUTCPeriod,
18310             "Q": formatUnixTimestamp,
18311             "s": formatUnixTimestampSeconds,
18312             "S": formatUTCSeconds,
18313             "u": formatUTCWeekdayNumberMonday,
18314             "U": formatUTCWeekNumberSunday,
18315             "V": formatUTCWeekNumberISO,
18316             "w": formatUTCWeekdayNumberSunday,
18317             "W": formatUTCWeekNumberMonday,
18318             "x": null,
18319             "X": null,
18320             "y": formatUTCYear,
18321             "Y": formatUTCFullYear,
18322             "Z": formatUTCZone,
18323             "%": formatLiteralPercent
18324           };
18325
18326           var parses = {
18327             "a": parseShortWeekday,
18328             "A": parseWeekday,
18329             "b": parseShortMonth,
18330             "B": parseMonth,
18331             "c": parseLocaleDateTime,
18332             "d": parseDayOfMonth,
18333             "e": parseDayOfMonth,
18334             "f": parseMicroseconds,
18335             "H": parseHour24,
18336             "I": parseHour24,
18337             "j": parseDayOfYear,
18338             "L": parseMilliseconds,
18339             "m": parseMonthNumber,
18340             "M": parseMinutes,
18341             "p": parsePeriod,
18342             "Q": parseUnixTimestamp,
18343             "s": parseUnixTimestampSeconds,
18344             "S": parseSeconds,
18345             "u": parseWeekdayNumberMonday,
18346             "U": parseWeekNumberSunday,
18347             "V": parseWeekNumberISO,
18348             "w": parseWeekdayNumberSunday,
18349             "W": parseWeekNumberMonday,
18350             "x": parseLocaleDate,
18351             "X": parseLocaleTime,
18352             "y": parseYear,
18353             "Y": parseFullYear,
18354             "Z": parseZone,
18355             "%": parseLiteralPercent
18356           };
18357
18358           // These recursive directive definitions must be deferred.
18359           formats.x = newFormat(locale_date, formats);
18360           formats.X = newFormat(locale_time, formats);
18361           formats.c = newFormat(locale_dateTime, formats);
18362           utcFormats.x = newFormat(locale_date, utcFormats);
18363           utcFormats.X = newFormat(locale_time, utcFormats);
18364           utcFormats.c = newFormat(locale_dateTime, utcFormats);
18365
18366           function newFormat(specifier, formats) {
18367             return function(date) {
18368               var string = [],
18369                   i = -1,
18370                   j = 0,
18371                   n = specifier.length,
18372                   c,
18373                   pad,
18374                   format;
18375
18376               if (!(date instanceof Date)) date = new Date(+date);
18377
18378               while (++i < n) {
18379                 if (specifier.charCodeAt(i) === 37) {
18380                   string.push(specifier.slice(j, i));
18381                   if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
18382                   else pad = c === "e" ? " " : "0";
18383                   if (format = formats[c]) c = format(date, pad);
18384                   string.push(c);
18385                   j = i + 1;
18386                 }
18387               }
18388
18389               string.push(specifier.slice(j, i));
18390               return string.join("");
18391             };
18392           }
18393
18394           function newParse(specifier, newDate) {
18395             return function(string) {
18396               var d = newYear(1900),
18397                   i = parseSpecifier(d, specifier, string += "", 0),
18398                   week, day$1;
18399               if (i != string.length) return null;
18400
18401               // If a UNIX timestamp is specified, return it.
18402               if ("Q" in d) return new Date(d.Q);
18403
18404               // The am-pm flag is 0 for AM, and 1 for PM.
18405               if ("p" in d) d.H = d.H % 12 + d.p * 12;
18406
18407               // Convert day-of-week and week-of-year to day-of-year.
18408               if ("V" in d) {
18409                 if (d.V < 1 || d.V > 53) return null;
18410                 if (!("w" in d)) d.w = 1;
18411                 if ("Z" in d) {
18412                   week = utcDate(newYear(d.y)), day$1 = week.getUTCDay();
18413                   week = day$1 > 4 || day$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
18414                   week = utcDay.offset(week, (d.V - 1) * 7);
18415                   d.y = week.getUTCFullYear();
18416                   d.m = week.getUTCMonth();
18417                   d.d = week.getUTCDate() + (d.w + 6) % 7;
18418                 } else {
18419                   week = newDate(newYear(d.y)), day$1 = week.getDay();
18420                   week = day$1 > 4 || day$1 === 0 ? monday.ceil(week) : monday(week);
18421                   week = day.offset(week, (d.V - 1) * 7);
18422                   d.y = week.getFullYear();
18423                   d.m = week.getMonth();
18424                   d.d = week.getDate() + (d.w + 6) % 7;
18425                 }
18426               } else if ("W" in d || "U" in d) {
18427                 if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
18428                 day$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
18429                 d.m = 0;
18430                 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;
18431               }
18432
18433               // If a time zone is specified, all fields are interpreted as UTC and then
18434               // offset according to the specified time zone.
18435               if ("Z" in d) {
18436                 d.H += d.Z / 100 | 0;
18437                 d.M += d.Z % 100;
18438                 return utcDate(d);
18439               }
18440
18441               // Otherwise, all fields are in local time.
18442               return newDate(d);
18443             };
18444           }
18445
18446           function parseSpecifier(d, specifier, string, j) {
18447             var i = 0,
18448                 n = specifier.length,
18449                 m = string.length,
18450                 c,
18451                 parse;
18452
18453             while (i < n) {
18454               if (j >= m) return -1;
18455               c = specifier.charCodeAt(i++);
18456               if (c === 37) {
18457                 c = specifier.charAt(i++);
18458                 parse = parses[c in pads ? specifier.charAt(i++) : c];
18459                 if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
18460               } else if (c != string.charCodeAt(j++)) {
18461                 return -1;
18462               }
18463             }
18464
18465             return j;
18466           }
18467
18468           function parsePeriod(d, string, i) {
18469             var n = periodRe.exec(string.slice(i));
18470             return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18471           }
18472
18473           function parseShortWeekday(d, string, i) {
18474             var n = shortWeekdayRe.exec(string.slice(i));
18475             return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18476           }
18477
18478           function parseWeekday(d, string, i) {
18479             var n = weekdayRe.exec(string.slice(i));
18480             return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18481           }
18482
18483           function parseShortMonth(d, string, i) {
18484             var n = shortMonthRe.exec(string.slice(i));
18485             return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18486           }
18487
18488           function parseMonth(d, string, i) {
18489             var n = monthRe.exec(string.slice(i));
18490             return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
18491           }
18492
18493           function parseLocaleDateTime(d, string, i) {
18494             return parseSpecifier(d, locale_dateTime, string, i);
18495           }
18496
18497           function parseLocaleDate(d, string, i) {
18498             return parseSpecifier(d, locale_date, string, i);
18499           }
18500
18501           function parseLocaleTime(d, string, i) {
18502             return parseSpecifier(d, locale_time, string, i);
18503           }
18504
18505           function formatShortWeekday(d) {
18506             return locale_shortWeekdays[d.getDay()];
18507           }
18508
18509           function formatWeekday(d) {
18510             return locale_weekdays[d.getDay()];
18511           }
18512
18513           function formatShortMonth(d) {
18514             return locale_shortMonths[d.getMonth()];
18515           }
18516
18517           function formatMonth(d) {
18518             return locale_months[d.getMonth()];
18519           }
18520
18521           function formatPeriod(d) {
18522             return locale_periods[+(d.getHours() >= 12)];
18523           }
18524
18525           function formatUTCShortWeekday(d) {
18526             return locale_shortWeekdays[d.getUTCDay()];
18527           }
18528
18529           function formatUTCWeekday(d) {
18530             return locale_weekdays[d.getUTCDay()];
18531           }
18532
18533           function formatUTCShortMonth(d) {
18534             return locale_shortMonths[d.getUTCMonth()];
18535           }
18536
18537           function formatUTCMonth(d) {
18538             return locale_months[d.getUTCMonth()];
18539           }
18540
18541           function formatUTCPeriod(d) {
18542             return locale_periods[+(d.getUTCHours() >= 12)];
18543           }
18544
18545           return {
18546             format: function(specifier) {
18547               var f = newFormat(specifier += "", formats);
18548               f.toString = function() { return specifier; };
18549               return f;
18550             },
18551             parse: function(specifier) {
18552               var p = newParse(specifier += "", localDate);
18553               p.toString = function() { return specifier; };
18554               return p;
18555             },
18556             utcFormat: function(specifier) {
18557               var f = newFormat(specifier += "", utcFormats);
18558               f.toString = function() { return specifier; };
18559               return f;
18560             },
18561             utcParse: function(specifier) {
18562               var p = newParse(specifier, utcDate);
18563               p.toString = function() { return specifier; };
18564               return p;
18565             }
18566           };
18567         }
18568
18569         var pads = {"-": "", "_": " ", "0": "0"},
18570             numberRe = /^\s*\d+/, // note: ignores next directive
18571             percentRe = /^%/,
18572             requoteRe = /[\\^$*+?|[\]().{}]/g;
18573
18574         function pad$1(value, fill, width) {
18575           var sign = value < 0 ? "-" : "",
18576               string = (sign ? -value : value) + "",
18577               length = string.length;
18578           return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
18579         }
18580
18581         function requote(s) {
18582           return s.replace(requoteRe, "\\$&");
18583         }
18584
18585         function formatRe(names) {
18586           return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
18587         }
18588
18589         function formatLookup(names) {
18590           var map = {}, i = -1, n = names.length;
18591           while (++i < n) map[names[i].toLowerCase()] = i;
18592           return map;
18593         }
18594
18595         function parseWeekdayNumberSunday(d, string, i) {
18596           var n = numberRe.exec(string.slice(i, i + 1));
18597           return n ? (d.w = +n[0], i + n[0].length) : -1;
18598         }
18599
18600         function parseWeekdayNumberMonday(d, string, i) {
18601           var n = numberRe.exec(string.slice(i, i + 1));
18602           return n ? (d.u = +n[0], i + n[0].length) : -1;
18603         }
18604
18605         function parseWeekNumberSunday(d, string, i) {
18606           var n = numberRe.exec(string.slice(i, i + 2));
18607           return n ? (d.U = +n[0], i + n[0].length) : -1;
18608         }
18609
18610         function parseWeekNumberISO(d, string, i) {
18611           var n = numberRe.exec(string.slice(i, i + 2));
18612           return n ? (d.V = +n[0], i + n[0].length) : -1;
18613         }
18614
18615         function parseWeekNumberMonday(d, string, i) {
18616           var n = numberRe.exec(string.slice(i, i + 2));
18617           return n ? (d.W = +n[0], i + n[0].length) : -1;
18618         }
18619
18620         function parseFullYear(d, string, i) {
18621           var n = numberRe.exec(string.slice(i, i + 4));
18622           return n ? (d.y = +n[0], i + n[0].length) : -1;
18623         }
18624
18625         function parseYear(d, string, i) {
18626           var n = numberRe.exec(string.slice(i, i + 2));
18627           return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
18628         }
18629
18630         function parseZone(d, string, i) {
18631           var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
18632           return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
18633         }
18634
18635         function parseMonthNumber(d, string, i) {
18636           var n = numberRe.exec(string.slice(i, i + 2));
18637           return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
18638         }
18639
18640         function parseDayOfMonth(d, string, i) {
18641           var n = numberRe.exec(string.slice(i, i + 2));
18642           return n ? (d.d = +n[0], i + n[0].length) : -1;
18643         }
18644
18645         function parseDayOfYear(d, string, i) {
18646           var n = numberRe.exec(string.slice(i, i + 3));
18647           return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
18648         }
18649
18650         function parseHour24(d, string, i) {
18651           var n = numberRe.exec(string.slice(i, i + 2));
18652           return n ? (d.H = +n[0], i + n[0].length) : -1;
18653         }
18654
18655         function parseMinutes(d, string, i) {
18656           var n = numberRe.exec(string.slice(i, i + 2));
18657           return n ? (d.M = +n[0], i + n[0].length) : -1;
18658         }
18659
18660         function parseSeconds(d, string, i) {
18661           var n = numberRe.exec(string.slice(i, i + 2));
18662           return n ? (d.S = +n[0], i + n[0].length) : -1;
18663         }
18664
18665         function parseMilliseconds(d, string, i) {
18666           var n = numberRe.exec(string.slice(i, i + 3));
18667           return n ? (d.L = +n[0], i + n[0].length) : -1;
18668         }
18669
18670         function parseMicroseconds(d, string, i) {
18671           var n = numberRe.exec(string.slice(i, i + 6));
18672           return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
18673         }
18674
18675         function parseLiteralPercent(d, string, i) {
18676           var n = percentRe.exec(string.slice(i, i + 1));
18677           return n ? i + n[0].length : -1;
18678         }
18679
18680         function parseUnixTimestamp(d, string, i) {
18681           var n = numberRe.exec(string.slice(i));
18682           return n ? (d.Q = +n[0], i + n[0].length) : -1;
18683         }
18684
18685         function parseUnixTimestampSeconds(d, string, i) {
18686           var n = numberRe.exec(string.slice(i));
18687           return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
18688         }
18689
18690         function formatDayOfMonth(d, p) {
18691           return pad$1(d.getDate(), p, 2);
18692         }
18693
18694         function formatHour24(d, p) {
18695           return pad$1(d.getHours(), p, 2);
18696         }
18697
18698         function formatHour12(d, p) {
18699           return pad$1(d.getHours() % 12 || 12, p, 2);
18700         }
18701
18702         function formatDayOfYear(d, p) {
18703           return pad$1(1 + day.count(year(d), d), p, 3);
18704         }
18705
18706         function formatMilliseconds(d, p) {
18707           return pad$1(d.getMilliseconds(), p, 3);
18708         }
18709
18710         function formatMicroseconds(d, p) {
18711           return formatMilliseconds(d, p) + "000";
18712         }
18713
18714         function formatMonthNumber(d, p) {
18715           return pad$1(d.getMonth() + 1, p, 2);
18716         }
18717
18718         function formatMinutes(d, p) {
18719           return pad$1(d.getMinutes(), p, 2);
18720         }
18721
18722         function formatSeconds(d, p) {
18723           return pad$1(d.getSeconds(), p, 2);
18724         }
18725
18726         function formatWeekdayNumberMonday(d) {
18727           var day = d.getDay();
18728           return day === 0 ? 7 : day;
18729         }
18730
18731         function formatWeekNumberSunday(d, p) {
18732           return pad$1(sunday.count(year(d), d), p, 2);
18733         }
18734
18735         function formatWeekNumberISO(d, p) {
18736           var day = d.getDay();
18737           d = (day >= 4 || day === 0) ? thursday(d) : thursday.ceil(d);
18738           return pad$1(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
18739         }
18740
18741         function formatWeekdayNumberSunday(d) {
18742           return d.getDay();
18743         }
18744
18745         function formatWeekNumberMonday(d, p) {
18746           return pad$1(monday.count(year(d), d), p, 2);
18747         }
18748
18749         function formatYear$1(d, p) {
18750           return pad$1(d.getFullYear() % 100, p, 2);
18751         }
18752
18753         function formatFullYear(d, p) {
18754           return pad$1(d.getFullYear() % 10000, p, 4);
18755         }
18756
18757         function formatZone(d) {
18758           var z = d.getTimezoneOffset();
18759           return (z > 0 ? "-" : (z *= -1, "+"))
18760               + pad$1(z / 60 | 0, "0", 2)
18761               + pad$1(z % 60, "0", 2);
18762         }
18763
18764         function formatUTCDayOfMonth(d, p) {
18765           return pad$1(d.getUTCDate(), p, 2);
18766         }
18767
18768         function formatUTCHour24(d, p) {
18769           return pad$1(d.getUTCHours(), p, 2);
18770         }
18771
18772         function formatUTCHour12(d, p) {
18773           return pad$1(d.getUTCHours() % 12 || 12, p, 2);
18774         }
18775
18776         function formatUTCDayOfYear(d, p) {
18777           return pad$1(1 + utcDay.count(utcYear(d), d), p, 3);
18778         }
18779
18780         function formatUTCMilliseconds(d, p) {
18781           return pad$1(d.getUTCMilliseconds(), p, 3);
18782         }
18783
18784         function formatUTCMicroseconds(d, p) {
18785           return formatUTCMilliseconds(d, p) + "000";
18786         }
18787
18788         function formatUTCMonthNumber(d, p) {
18789           return pad$1(d.getUTCMonth() + 1, p, 2);
18790         }
18791
18792         function formatUTCMinutes(d, p) {
18793           return pad$1(d.getUTCMinutes(), p, 2);
18794         }
18795
18796         function formatUTCSeconds(d, p) {
18797           return pad$1(d.getUTCSeconds(), p, 2);
18798         }
18799
18800         function formatUTCWeekdayNumberMonday(d) {
18801           var dow = d.getUTCDay();
18802           return dow === 0 ? 7 : dow;
18803         }
18804
18805         function formatUTCWeekNumberSunday(d, p) {
18806           return pad$1(utcSunday.count(utcYear(d), d), p, 2);
18807         }
18808
18809         function formatUTCWeekNumberISO(d, p) {
18810           var day = d.getUTCDay();
18811           d = (day >= 4 || day === 0) ? utcThursday(d) : utcThursday.ceil(d);
18812           return pad$1(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
18813         }
18814
18815         function formatUTCWeekdayNumberSunday(d) {
18816           return d.getUTCDay();
18817         }
18818
18819         function formatUTCWeekNumberMonday(d, p) {
18820           return pad$1(utcMonday.count(utcYear(d), d), p, 2);
18821         }
18822
18823         function formatUTCYear(d, p) {
18824           return pad$1(d.getUTCFullYear() % 100, p, 2);
18825         }
18826
18827         function formatUTCFullYear(d, p) {
18828           return pad$1(d.getUTCFullYear() % 10000, p, 4);
18829         }
18830
18831         function formatUTCZone() {
18832           return "+0000";
18833         }
18834
18835         function formatLiteralPercent() {
18836           return "%";
18837         }
18838
18839         function formatUnixTimestamp(d) {
18840           return +d;
18841         }
18842
18843         function formatUnixTimestampSeconds(d) {
18844           return Math.floor(+d / 1000);
18845         }
18846
18847         var locale$1;
18848         var timeFormat;
18849         var timeParse;
18850         var utcFormat;
18851         var utcParse;
18852
18853         defaultLocale$1({
18854           dateTime: "%x, %X",
18855           date: "%-m/%-d/%Y",
18856           time: "%-I:%M:%S %p",
18857           periods: ["AM", "PM"],
18858           days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
18859           shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
18860           months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
18861           shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
18862         });
18863
18864         function defaultLocale$1(definition) {
18865           locale$1 = formatLocale$1(definition);
18866           timeFormat = locale$1.format;
18867           timeParse = locale$1.parse;
18868           utcFormat = locale$1.utcFormat;
18869           utcParse = locale$1.utcParse;
18870           return locale$1;
18871         }
18872
18873         var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
18874
18875         function formatIsoNative(date) {
18876           return date.toISOString();
18877         }
18878
18879         var formatIso = Date.prototype.toISOString
18880             ? formatIsoNative
18881             : utcFormat(isoSpecifier);
18882
18883         function parseIsoNative(string) {
18884           var date = new Date(string);
18885           return isNaN(date) ? null : date;
18886         }
18887
18888         var parseIso = +new Date("2000-01-01T00:00:00.000Z")
18889             ? parseIsoNative
18890             : utcParse(isoSpecifier);
18891
18892         var durationSecond$1 = 1000,
18893             durationMinute$1 = durationSecond$1 * 60,
18894             durationHour$1 = durationMinute$1 * 60,
18895             durationDay$1 = durationHour$1 * 24,
18896             durationWeek$1 = durationDay$1 * 7,
18897             durationMonth = durationDay$1 * 30,
18898             durationYear = durationDay$1 * 365;
18899
18900         function date$1(t) {
18901           return new Date(t);
18902         }
18903
18904         function number$3(t) {
18905           return t instanceof Date ? +t : +new Date(+t);
18906         }
18907
18908         function calendar(year, month, week, day, hour, minute, second, millisecond, format) {
18909           var scale = continuous(identity$5, identity$5),
18910               invert = scale.invert,
18911               domain = scale.domain;
18912
18913           var formatMillisecond = format(".%L"),
18914               formatSecond = format(":%S"),
18915               formatMinute = format("%I:%M"),
18916               formatHour = format("%I %p"),
18917               formatDay = format("%a %d"),
18918               formatWeek = format("%b %d"),
18919               formatMonth = format("%B"),
18920               formatYear = format("%Y");
18921
18922           var tickIntervals = [
18923             [second,  1,      durationSecond$1],
18924             [second,  5,  5 * durationSecond$1],
18925             [second, 15, 15 * durationSecond$1],
18926             [second, 30, 30 * durationSecond$1],
18927             [minute,  1,      durationMinute$1],
18928             [minute,  5,  5 * durationMinute$1],
18929             [minute, 15, 15 * durationMinute$1],
18930             [minute, 30, 30 * durationMinute$1],
18931             [  hour,  1,      durationHour$1  ],
18932             [  hour,  3,  3 * durationHour$1  ],
18933             [  hour,  6,  6 * durationHour$1  ],
18934             [  hour, 12, 12 * durationHour$1  ],
18935             [   day,  1,      durationDay$1   ],
18936             [   day,  2,  2 * durationDay$1   ],
18937             [  week,  1,      durationWeek$1  ],
18938             [ month,  1,      durationMonth ],
18939             [ month,  3,  3 * durationMonth ],
18940             [  year,  1,      durationYear  ]
18941           ];
18942
18943           function tickFormat(date) {
18944             return (second(date) < date ? formatMillisecond
18945                 : minute(date) < date ? formatSecond
18946                 : hour(date) < date ? formatMinute
18947                 : day(date) < date ? formatHour
18948                 : month(date) < date ? (week(date) < date ? formatDay : formatWeek)
18949                 : year(date) < date ? formatMonth
18950                 : formatYear)(date);
18951           }
18952
18953           function tickInterval(interval, start, stop, step) {
18954             if (interval == null) interval = 10;
18955
18956             // If a desired tick count is specified, pick a reasonable tick interval
18957             // based on the extent of the domain and a rough estimate of tick size.
18958             // Otherwise, assume interval is already a time interval and use it.
18959             if (typeof interval === "number") {
18960               var target = Math.abs(stop - start) / interval,
18961                   i = d3_bisector(function(i) { return i[2]; }).right(tickIntervals, target);
18962               if (i === tickIntervals.length) {
18963                 step = tickStep(start / durationYear, stop / durationYear, interval);
18964                 interval = year;
18965               } else if (i) {
18966                 i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
18967                 step = i[1];
18968                 interval = i[0];
18969               } else {
18970                 step = Math.max(tickStep(start, stop, interval), 1);
18971                 interval = millisecond;
18972               }
18973             }
18974
18975             return step == null ? interval : interval.every(step);
18976           }
18977
18978           scale.invert = function(y) {
18979             return new Date(invert(y));
18980           };
18981
18982           scale.domain = function(_) {
18983             return arguments.length ? domain(map$4.call(_, number$3)) : domain().map(date$1);
18984           };
18985
18986           scale.ticks = function(interval, step) {
18987             var d = domain(),
18988                 t0 = d[0],
18989                 t1 = d[d.length - 1],
18990                 r = t1 < t0,
18991                 t;
18992             if (r) t = t0, t0 = t1, t1 = t;
18993             t = tickInterval(interval, t0, t1, step);
18994             t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
18995             return r ? t.reverse() : t;
18996           };
18997
18998           scale.tickFormat = function(count, specifier) {
18999             return specifier == null ? tickFormat : format(specifier);
19000           };
19001
19002           scale.nice = function(interval, step) {
19003             var d = domain();
19004             return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
19005                 ? domain(nice(d, interval))
19006                 : scale;
19007           };
19008
19009           scale.copy = function() {
19010             return copy$1(scale, calendar(year, month, week, day, hour, minute, second, millisecond, format));
19011           };
19012
19013           return scale;
19014         }
19015
19016         function time() {
19017           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);
19018         }
19019
19020         function utcTime() {
19021           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);
19022         }
19023
19024         function transformer$2() {
19025           var x0 = 0,
19026               x1 = 1,
19027               t0,
19028               t1,
19029               k10,
19030               transform,
19031               interpolator = identity$5,
19032               clamp = false,
19033               unknown;
19034
19035           function scale(x) {
19036             return isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x));
19037           }
19038
19039           scale.domain = function(_) {
19040             return arguments.length ? (t0 = transform(x0 = +_[0]), t1 = transform(x1 = +_[1]), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1];
19041           };
19042
19043           scale.clamp = function(_) {
19044             return arguments.length ? (clamp = !!_, scale) : clamp;
19045           };
19046
19047           scale.interpolator = function(_) {
19048             return arguments.length ? (interpolator = _, scale) : interpolator;
19049           };
19050
19051           scale.unknown = function(_) {
19052             return arguments.length ? (unknown = _, scale) : unknown;
19053           };
19054
19055           return function(t) {
19056             transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0);
19057             return scale;
19058           };
19059         }
19060
19061         function copy$2(source, target) {
19062           return target
19063               .domain(source.domain())
19064               .interpolator(source.interpolator())
19065               .clamp(source.clamp())
19066               .unknown(source.unknown());
19067         }
19068
19069         function sequential() {
19070           var scale = linearish(transformer$2()(identity$5));
19071
19072           scale.copy = function() {
19073             return copy$2(scale, sequential());
19074           };
19075
19076           return initInterpolator.apply(scale, arguments);
19077         }
19078
19079         function sequentialLog() {
19080           var scale = loggish(transformer$2()).domain([1, 10]);
19081
19082           scale.copy = function() {
19083             return copy$2(scale, sequentialLog()).base(scale.base());
19084           };
19085
19086           return initInterpolator.apply(scale, arguments);
19087         }
19088
19089         function sequentialSymlog() {
19090           var scale = symlogish(transformer$2());
19091
19092           scale.copy = function() {
19093             return copy$2(scale, sequentialSymlog()).constant(scale.constant());
19094           };
19095
19096           return initInterpolator.apply(scale, arguments);
19097         }
19098
19099         function sequentialPow() {
19100           var scale = powish(transformer$2());
19101
19102           scale.copy = function() {
19103             return copy$2(scale, sequentialPow()).exponent(scale.exponent());
19104           };
19105
19106           return initInterpolator.apply(scale, arguments);
19107         }
19108
19109         function sequentialSqrt() {
19110           return sequentialPow.apply(null, arguments).exponent(0.5);
19111         }
19112
19113         function sequentialQuantile() {
19114           var domain = [],
19115               interpolator = identity$5;
19116
19117           function scale(x) {
19118             if (!isNaN(x = +x)) return interpolator((bisectRight(domain, x) - 1) / (domain.length - 1));
19119           }
19120
19121           scale.domain = function(_) {
19122             if (!arguments.length) return domain.slice();
19123             domain = [];
19124             for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
19125             domain.sort(d3_ascending);
19126             return scale;
19127           };
19128
19129           scale.interpolator = function(_) {
19130             return arguments.length ? (interpolator = _, scale) : interpolator;
19131           };
19132
19133           scale.copy = function() {
19134             return sequentialQuantile(interpolator).domain(domain);
19135           };
19136
19137           return initInterpolator.apply(scale, arguments);
19138         }
19139
19140         function transformer$3() {
19141           var x0 = 0,
19142               x1 = 0.5,
19143               x2 = 1,
19144               t0,
19145               t1,
19146               t2,
19147               k10,
19148               k21,
19149               interpolator = identity$5,
19150               transform,
19151               clamp = false,
19152               unknown;
19153
19154           function scale(x) {
19155             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));
19156           }
19157
19158           scale.domain = function(_) {
19159             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];
19160           };
19161
19162           scale.clamp = function(_) {
19163             return arguments.length ? (clamp = !!_, scale) : clamp;
19164           };
19165
19166           scale.interpolator = function(_) {
19167             return arguments.length ? (interpolator = _, scale) : interpolator;
19168           };
19169
19170           scale.unknown = function(_) {
19171             return arguments.length ? (unknown = _, scale) : unknown;
19172           };
19173
19174           return function(t) {
19175             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);
19176             return scale;
19177           };
19178         }
19179
19180         function diverging() {
19181           var scale = linearish(transformer$3()(identity$5));
19182
19183           scale.copy = function() {
19184             return copy$2(scale, diverging());
19185           };
19186
19187           return initInterpolator.apply(scale, arguments);
19188         }
19189
19190         function divergingLog() {
19191           var scale = loggish(transformer$3()).domain([0.1, 1, 10]);
19192
19193           scale.copy = function() {
19194             return copy$2(scale, divergingLog()).base(scale.base());
19195           };
19196
19197           return initInterpolator.apply(scale, arguments);
19198         }
19199
19200         function divergingSymlog() {
19201           var scale = symlogish(transformer$3());
19202
19203           scale.copy = function() {
19204             return copy$2(scale, divergingSymlog()).constant(scale.constant());
19205           };
19206
19207           return initInterpolator.apply(scale, arguments);
19208         }
19209
19210         function divergingPow() {
19211           var scale = powish(transformer$3());
19212
19213           scale.copy = function() {
19214             return copy$2(scale, divergingPow()).exponent(scale.exponent());
19215           };
19216
19217           return initInterpolator.apply(scale, arguments);
19218         }
19219
19220         function divergingSqrt() {
19221           return divergingPow.apply(null, arguments).exponent(0.5);
19222         }
19223
19224         function colors(specifier) {
19225           var n = specifier.length / 6 | 0, colors = new Array(n), i = 0;
19226           while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6);
19227           return colors;
19228         }
19229
19230         var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
19231
19232         var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666");
19233
19234         var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666");
19235
19236         var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928");
19237
19238         var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2");
19239
19240         var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc");
19241
19242         var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999");
19243
19244         var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3");
19245
19246         var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f");
19247
19248         function ramp(scheme) {
19249           return rgbBasis(scheme[scheme.length - 1]);
19250         }
19251
19252         var scheme = new Array(3).concat(
19253           "d8b365f5f5f55ab4ac",
19254           "a6611adfc27d80cdc1018571",
19255           "a6611adfc27df5f5f580cdc1018571",
19256           "8c510ad8b365f6e8c3c7eae55ab4ac01665e",
19257           "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e",
19258           "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e",
19259           "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e",
19260           "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30",
19261           "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30"
19262         ).map(colors);
19263
19264         var BrBG = ramp(scheme);
19265
19266         var scheme$1 = new Array(3).concat(
19267           "af8dc3f7f7f77fbf7b",
19268           "7b3294c2a5cfa6dba0008837",
19269           "7b3294c2a5cff7f7f7a6dba0008837",
19270           "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837",
19271           "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837",
19272           "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837",
19273           "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837",
19274           "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b",
19275           "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b"
19276         ).map(colors);
19277
19278         var PRGn = ramp(scheme$1);
19279
19280         var scheme$2 = new Array(3).concat(
19281           "e9a3c9f7f7f7a1d76a",
19282           "d01c8bf1b6dab8e1864dac26",
19283           "d01c8bf1b6daf7f7f7b8e1864dac26",
19284           "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221",
19285           "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221",
19286           "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221",
19287           "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221",
19288           "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419",
19289           "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419"
19290         ).map(colors);
19291
19292         var PiYG = ramp(scheme$2);
19293
19294         var scheme$3 = new Array(3).concat(
19295           "998ec3f7f7f7f1a340",
19296           "5e3c99b2abd2fdb863e66101",
19297           "5e3c99b2abd2f7f7f7fdb863e66101",
19298           "542788998ec3d8daebfee0b6f1a340b35806",
19299           "542788998ec3d8daebf7f7f7fee0b6f1a340b35806",
19300           "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806",
19301           "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806",
19302           "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08",
19303           "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08"
19304         ).map(colors);
19305
19306         var PuOr = ramp(scheme$3);
19307
19308         var scheme$4 = new Array(3).concat(
19309           "ef8a62f7f7f767a9cf",
19310           "ca0020f4a58292c5de0571b0",
19311           "ca0020f4a582f7f7f792c5de0571b0",
19312           "b2182bef8a62fddbc7d1e5f067a9cf2166ac",
19313           "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac",
19314           "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac",
19315           "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac",
19316           "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061",
19317           "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061"
19318         ).map(colors);
19319
19320         var RdBu = ramp(scheme$4);
19321
19322         var scheme$5 = new Array(3).concat(
19323           "ef8a62ffffff999999",
19324           "ca0020f4a582bababa404040",
19325           "ca0020f4a582ffffffbababa404040",
19326           "b2182bef8a62fddbc7e0e0e09999994d4d4d",
19327           "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d",
19328           "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d",
19329           "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d",
19330           "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a",
19331           "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a"
19332         ).map(colors);
19333
19334         var RdGy = ramp(scheme$5);
19335
19336         var scheme$6 = new Array(3).concat(
19337           "fc8d59ffffbf91bfdb",
19338           "d7191cfdae61abd9e92c7bb6",
19339           "d7191cfdae61ffffbfabd9e92c7bb6",
19340           "d73027fc8d59fee090e0f3f891bfdb4575b4",
19341           "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4",
19342           "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4",
19343           "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4",
19344           "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695",
19345           "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695"
19346         ).map(colors);
19347
19348         var RdYlBu = ramp(scheme$6);
19349
19350         var scheme$7 = new Array(3).concat(
19351           "fc8d59ffffbf91cf60",
19352           "d7191cfdae61a6d96a1a9641",
19353           "d7191cfdae61ffffbfa6d96a1a9641",
19354           "d73027fc8d59fee08bd9ef8b91cf601a9850",
19355           "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850",
19356           "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850",
19357           "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850",
19358           "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837",
19359           "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837"
19360         ).map(colors);
19361
19362         var RdYlGn = ramp(scheme$7);
19363
19364         var scheme$8 = new Array(3).concat(
19365           "fc8d59ffffbf99d594",
19366           "d7191cfdae61abdda42b83ba",
19367           "d7191cfdae61ffffbfabdda42b83ba",
19368           "d53e4ffc8d59fee08be6f59899d5943288bd",
19369           "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd",
19370           "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd",
19371           "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd",
19372           "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2",
19373           "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2"
19374         ).map(colors);
19375
19376         var Spectral = ramp(scheme$8);
19377
19378         var scheme$9 = new Array(3).concat(
19379           "e5f5f999d8c92ca25f",
19380           "edf8fbb2e2e266c2a4238b45",
19381           "edf8fbb2e2e266c2a42ca25f006d2c",
19382           "edf8fbccece699d8c966c2a42ca25f006d2c",
19383           "edf8fbccece699d8c966c2a441ae76238b45005824",
19384           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824",
19385           "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b"
19386         ).map(colors);
19387
19388         var BuGn = ramp(scheme$9);
19389
19390         var scheme$a = new Array(3).concat(
19391           "e0ecf49ebcda8856a7",
19392           "edf8fbb3cde38c96c688419d",
19393           "edf8fbb3cde38c96c68856a7810f7c",
19394           "edf8fbbfd3e69ebcda8c96c68856a7810f7c",
19395           "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b",
19396           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b",
19397           "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b"
19398         ).map(colors);
19399
19400         var BuPu = ramp(scheme$a);
19401
19402         var scheme$b = new Array(3).concat(
19403           "e0f3dba8ddb543a2ca",
19404           "f0f9e8bae4bc7bccc42b8cbe",
19405           "f0f9e8bae4bc7bccc443a2ca0868ac",
19406           "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac",
19407           "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19408           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e",
19409           "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081"
19410         ).map(colors);
19411
19412         var GnBu = ramp(scheme$b);
19413
19414         var scheme$c = new Array(3).concat(
19415           "fee8c8fdbb84e34a33",
19416           "fef0d9fdcc8afc8d59d7301f",
19417           "fef0d9fdcc8afc8d59e34a33b30000",
19418           "fef0d9fdd49efdbb84fc8d59e34a33b30000",
19419           "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000",
19420           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000",
19421           "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000"
19422         ).map(colors);
19423
19424         var OrRd = ramp(scheme$c);
19425
19426         var scheme$d = new Array(3).concat(
19427           "ece2f0a6bddb1c9099",
19428           "f6eff7bdc9e167a9cf02818a",
19429           "f6eff7bdc9e167a9cf1c9099016c59",
19430           "f6eff7d0d1e6a6bddb67a9cf1c9099016c59",
19431           "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450",
19432           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450",
19433           "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636"
19434         ).map(colors);
19435
19436         var PuBuGn = ramp(scheme$d);
19437
19438         var scheme$e = new Array(3).concat(
19439           "ece7f2a6bddb2b8cbe",
19440           "f1eef6bdc9e174a9cf0570b0",
19441           "f1eef6bdc9e174a9cf2b8cbe045a8d",
19442           "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d",
19443           "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19444           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b",
19445           "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858"
19446         ).map(colors);
19447
19448         var PuBu = ramp(scheme$e);
19449
19450         var scheme$f = new Array(3).concat(
19451           "e7e1efc994c7dd1c77",
19452           "f1eef6d7b5d8df65b0ce1256",
19453           "f1eef6d7b5d8df65b0dd1c77980043",
19454           "f1eef6d4b9dac994c7df65b0dd1c77980043",
19455           "f1eef6d4b9dac994c7df65b0e7298ace125691003f",
19456           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f",
19457           "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f"
19458         ).map(colors);
19459
19460         var PuRd = ramp(scheme$f);
19461
19462         var scheme$g = new Array(3).concat(
19463           "fde0ddfa9fb5c51b8a",
19464           "feebe2fbb4b9f768a1ae017e",
19465           "feebe2fbb4b9f768a1c51b8a7a0177",
19466           "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177",
19467           "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19468           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177",
19469           "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a"
19470         ).map(colors);
19471
19472         var RdPu = ramp(scheme$g);
19473
19474         var scheme$h = new Array(3).concat(
19475           "edf8b17fcdbb2c7fb8",
19476           "ffffcca1dab441b6c4225ea8",
19477           "ffffcca1dab441b6c42c7fb8253494",
19478           "ffffccc7e9b47fcdbb41b6c42c7fb8253494",
19479           "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19480           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84",
19481           "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58"
19482         ).map(colors);
19483
19484         var YlGnBu = ramp(scheme$h);
19485
19486         var scheme$i = new Array(3).concat(
19487           "f7fcb9addd8e31a354",
19488           "ffffccc2e69978c679238443",
19489           "ffffccc2e69978c67931a354006837",
19490           "ffffccd9f0a3addd8e78c67931a354006837",
19491           "ffffccd9f0a3addd8e78c67941ab5d238443005a32",
19492           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32",
19493           "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529"
19494         ).map(colors);
19495
19496         var YlGn = ramp(scheme$i);
19497
19498         var scheme$j = new Array(3).concat(
19499           "fff7bcfec44fd95f0e",
19500           "ffffd4fed98efe9929cc4c02",
19501           "ffffd4fed98efe9929d95f0e993404",
19502           "ffffd4fee391fec44ffe9929d95f0e993404",
19503           "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04",
19504           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04",
19505           "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506"
19506         ).map(colors);
19507
19508         var YlOrBr = ramp(scheme$j);
19509
19510         var scheme$k = new Array(3).concat(
19511           "ffeda0feb24cf03b20",
19512           "ffffb2fecc5cfd8d3ce31a1c",
19513           "ffffb2fecc5cfd8d3cf03b20bd0026",
19514           "ffffb2fed976feb24cfd8d3cf03b20bd0026",
19515           "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19516           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026",
19517           "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026"
19518         ).map(colors);
19519
19520         var YlOrRd = ramp(scheme$k);
19521
19522         var scheme$l = new Array(3).concat(
19523           "deebf79ecae13182bd",
19524           "eff3ffbdd7e76baed62171b5",
19525           "eff3ffbdd7e76baed63182bd08519c",
19526           "eff3ffc6dbef9ecae16baed63182bd08519c",
19527           "eff3ffc6dbef9ecae16baed64292c62171b5084594",
19528           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594",
19529           "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b"
19530         ).map(colors);
19531
19532         var Blues = ramp(scheme$l);
19533
19534         var scheme$m = new Array(3).concat(
19535           "e5f5e0a1d99b31a354",
19536           "edf8e9bae4b374c476238b45",
19537           "edf8e9bae4b374c47631a354006d2c",
19538           "edf8e9c7e9c0a1d99b74c47631a354006d2c",
19539           "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32",
19540           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32",
19541           "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b"
19542         ).map(colors);
19543
19544         var Greens = ramp(scheme$m);
19545
19546         var scheme$n = new Array(3).concat(
19547           "f0f0f0bdbdbd636363",
19548           "f7f7f7cccccc969696525252",
19549           "f7f7f7cccccc969696636363252525",
19550           "f7f7f7d9d9d9bdbdbd969696636363252525",
19551           "f7f7f7d9d9d9bdbdbd969696737373525252252525",
19552           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525",
19553           "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000"
19554         ).map(colors);
19555
19556         var Greys = ramp(scheme$n);
19557
19558         var scheme$o = new Array(3).concat(
19559           "efedf5bcbddc756bb1",
19560           "f2f0f7cbc9e29e9ac86a51a3",
19561           "f2f0f7cbc9e29e9ac8756bb154278f",
19562           "f2f0f7dadaebbcbddc9e9ac8756bb154278f",
19563           "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486",
19564           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486",
19565           "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d"
19566         ).map(colors);
19567
19568         var Purples = ramp(scheme$o);
19569
19570         var scheme$p = new Array(3).concat(
19571           "fee0d2fc9272de2d26",
19572           "fee5d9fcae91fb6a4acb181d",
19573           "fee5d9fcae91fb6a4ade2d26a50f15",
19574           "fee5d9fcbba1fc9272fb6a4ade2d26a50f15",
19575           "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19576           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d",
19577           "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d"
19578         ).map(colors);
19579
19580         var Reds = ramp(scheme$p);
19581
19582         var scheme$q = new Array(3).concat(
19583           "fee6cefdae6be6550d",
19584           "feeddefdbe85fd8d3cd94701",
19585           "feeddefdbe85fd8d3ce6550da63603",
19586           "feeddefdd0a2fdae6bfd8d3ce6550da63603",
19587           "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19588           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04",
19589           "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704"
19590         ).map(colors);
19591
19592         var Oranges = ramp(scheme$q);
19593
19594         var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
19595
19596         var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19597
19598         var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
19599
19600         var c = cubehelix();
19601
19602         function rainbow(t) {
19603           if (t < 0 || t > 1) t -= Math.floor(t);
19604           var ts = Math.abs(t - 0.5);
19605           c.h = 360 * t - 100;
19606           c.s = 1.5 - 1.5 * ts;
19607           c.l = 0.8 - 0.9 * ts;
19608           return c + "";
19609         }
19610
19611         var c$1 = rgb(),
19612             pi_1_3 = Math.PI / 3,
19613             pi_2_3 = Math.PI * 2 / 3;
19614
19615         function sinebow(t) {
19616           var x;
19617           t = (0.5 - t) * Math.PI;
19618           c$1.r = 255 * (x = Math.sin(t)) * x;
19619           c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x;
19620           c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x;
19621           return c$1 + "";
19622         }
19623
19624         function ramp$1(range) {
19625           var n = range.length;
19626           return function(t) {
19627             return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
19628           };
19629         }
19630
19631         var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
19632
19633         var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
19634
19635         var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
19636
19637         var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
19638
19639         function constant$b(x) {
19640           return function constant() {
19641             return x;
19642           };
19643         }
19644
19645         var abs$3 = Math.abs;
19646         var atan2$1 = Math.atan2;
19647         var cos$2 = Math.cos;
19648         var max$4 = Math.max;
19649         var min$1 = Math.min;
19650         var sin$2 = Math.sin;
19651         var sqrt$2 = Math.sqrt;
19652
19653         var epsilon$3 = 1e-12;
19654         var pi$4 = Math.PI;
19655         var halfPi$3 = pi$4 / 2;
19656         var tau$4 = 2 * pi$4;
19657
19658         function acos$1(x) {
19659           return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
19660         }
19661
19662         function asin$1(x) {
19663           return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
19664         }
19665
19666         function arcInnerRadius(d) {
19667           return d.innerRadius;
19668         }
19669
19670         function arcOuterRadius(d) {
19671           return d.outerRadius;
19672         }
19673
19674         function arcStartAngle(d) {
19675           return d.startAngle;
19676         }
19677
19678         function arcEndAngle(d) {
19679           return d.endAngle;
19680         }
19681
19682         function arcPadAngle(d) {
19683           return d && d.padAngle; // Note: optional!
19684         }
19685
19686         function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
19687           var x10 = x1 - x0, y10 = y1 - y0,
19688               x32 = x3 - x2, y32 = y3 - y2,
19689               t = y32 * x10 - x32 * y10;
19690           if (t * t < epsilon$3) return;
19691           t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t;
19692           return [x0 + t * x10, y0 + t * y10];
19693         }
19694
19695         // Compute perpendicular offset line of length rc.
19696         // http://mathworld.wolfram.com/Circle-LineIntersection.html
19697         function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
19698           var x01 = x0 - x1,
19699               y01 = y0 - y1,
19700               lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
19701               ox = lo * y01,
19702               oy = -lo * x01,
19703               x11 = x0 + ox,
19704               y11 = y0 + oy,
19705               x10 = x1 + ox,
19706               y10 = y1 + oy,
19707               x00 = (x11 + x10) / 2,
19708               y00 = (y11 + y10) / 2,
19709               dx = x10 - x11,
19710               dy = y10 - y11,
19711               d2 = dx * dx + dy * dy,
19712               r = r1 - rc,
19713               D = x11 * y10 - x10 * y11,
19714               d = (dy < 0 ? -1 : 1) * sqrt$2(max$4(0, r * r * d2 - D * D)),
19715               cx0 = (D * dy - dx * d) / d2,
19716               cy0 = (-D * dx - dy * d) / d2,
19717               cx1 = (D * dy + dx * d) / d2,
19718               cy1 = (-D * dx + dy * d) / d2,
19719               dx0 = cx0 - x00,
19720               dy0 = cy0 - y00,
19721               dx1 = cx1 - x00,
19722               dy1 = cy1 - y00;
19723
19724           // Pick the closer of the two intersection points.
19725           // TODO Is there a faster way to determine which intersection to use?
19726           if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
19727
19728           return {
19729             cx: cx0,
19730             cy: cy0,
19731             x01: -ox,
19732             y01: -oy,
19733             x11: cx0 * (r1 / r - 1),
19734             y11: cy0 * (r1 / r - 1)
19735           };
19736         }
19737
19738         function arc() {
19739           var innerRadius = arcInnerRadius,
19740               outerRadius = arcOuterRadius,
19741               cornerRadius = constant$b(0),
19742               padRadius = null,
19743               startAngle = arcStartAngle,
19744               endAngle = arcEndAngle,
19745               padAngle = arcPadAngle,
19746               context = null;
19747
19748           function arc() {
19749             var buffer,
19750                 r,
19751                 r0 = +innerRadius.apply(this, arguments),
19752                 r1 = +outerRadius.apply(this, arguments),
19753                 a0 = startAngle.apply(this, arguments) - halfPi$3,
19754                 a1 = endAngle.apply(this, arguments) - halfPi$3,
19755                 da = abs$3(a1 - a0),
19756                 cw = a1 > a0;
19757
19758             if (!context) context = buffer = path();
19759
19760             // Ensure that the outer radius is always larger than the inner radius.
19761             if (r1 < r0) r = r1, r1 = r0, r0 = r;
19762
19763             // Is it a point?
19764             if (!(r1 > epsilon$3)) context.moveTo(0, 0);
19765
19766             // Or is it a circle or annulus?
19767             else if (da > tau$4 - epsilon$3) {
19768               context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
19769               context.arc(0, 0, r1, a0, a1, !cw);
19770               if (r0 > epsilon$3) {
19771                 context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
19772                 context.arc(0, 0, r0, a1, a0, cw);
19773               }
19774             }
19775
19776             // Or is it a circular or annular sector?
19777             else {
19778               var a01 = a0,
19779                   a11 = a1,
19780                   a00 = a0,
19781                   a10 = a1,
19782                   da0 = da,
19783                   da1 = da,
19784                   ap = padAngle.apply(this, arguments) / 2,
19785                   rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
19786                   rc = min$1(abs$3(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
19787                   rc0 = rc,
19788                   rc1 = rc,
19789                   t0,
19790                   t1;
19791
19792               // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
19793               if (rp > epsilon$3) {
19794                 var p0 = asin$1(rp / r0 * sin$2(ap)),
19795                     p1 = asin$1(rp / r1 * sin$2(ap));
19796                 if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
19797                 else da0 = 0, a00 = a10 = (a0 + a1) / 2;
19798                 if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
19799                 else da1 = 0, a01 = a11 = (a0 + a1) / 2;
19800               }
19801
19802               var x01 = r1 * cos$2(a01),
19803                   y01 = r1 * sin$2(a01),
19804                   x10 = r0 * cos$2(a10),
19805                   y10 = r0 * sin$2(a10);
19806
19807               // Apply rounded corners?
19808               if (rc > epsilon$3) {
19809                 var x11 = r1 * cos$2(a11),
19810                     y11 = r1 * sin$2(a11),
19811                     x00 = r0 * cos$2(a00),
19812                     y00 = r0 * sin$2(a00),
19813                     oc;
19814
19815                 // Restrict the corner radius according to the sector angle.
19816                 if (da < pi$4 && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) {
19817                   var ax = x01 - oc[0],
19818                       ay = y01 - oc[1],
19819                       bx = x11 - oc[0],
19820                       by = y11 - oc[1],
19821                       kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
19822                       lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
19823                   rc0 = min$1(rc, (r0 - lc) / (kc - 1));
19824                   rc1 = min$1(rc, (r1 - lc) / (kc + 1));
19825                 }
19826               }
19827
19828               // Is the sector collapsed to a line?
19829               if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
19830
19831               // Does the sector’s outer ring have rounded corners?
19832               else if (rc1 > epsilon$3) {
19833                 t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
19834                 t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
19835
19836                 context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
19837
19838                 // Have the corners merged?
19839                 if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19840
19841                 // Otherwise, draw the two corners and the ring.
19842                 else {
19843                   context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19844                   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);
19845                   context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19846                 }
19847               }
19848
19849               // Or is the outer ring just a circular arc?
19850               else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
19851
19852               // Is there no inner ring, and it’s a circular sector?
19853               // Or perhaps it’s an annular sector collapsed due to padding?
19854               if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
19855
19856               // Does the sector’s inner ring (or point) have rounded corners?
19857               else if (rc0 > epsilon$3) {
19858                 t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
19859                 t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
19860
19861                 context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
19862
19863                 // Have the corners merged?
19864                 if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
19865
19866                 // Otherwise, draw the two corners and the ring.
19867                 else {
19868                   context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
19869                   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);
19870                   context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
19871                 }
19872               }
19873
19874               // Or is the inner ring just a circular arc?
19875               else context.arc(0, 0, r0, a10, a00, cw);
19876             }
19877
19878             context.closePath();
19879
19880             if (buffer) return context = null, buffer + "" || null;
19881           }
19882
19883           arc.centroid = function() {
19884             var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
19885                 a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
19886             return [cos$2(a) * r, sin$2(a) * r];
19887           };
19888
19889           arc.innerRadius = function(_) {
19890             return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : innerRadius;
19891           };
19892
19893           arc.outerRadius = function(_) {
19894             return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : outerRadius;
19895           };
19896
19897           arc.cornerRadius = function(_) {
19898             return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$b(+_), arc) : cornerRadius;
19899           };
19900
19901           arc.padRadius = function(_) {
19902             return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), arc) : padRadius;
19903           };
19904
19905           arc.startAngle = function(_) {
19906             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : startAngle;
19907           };
19908
19909           arc.endAngle = function(_) {
19910             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : endAngle;
19911           };
19912
19913           arc.padAngle = function(_) {
19914             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), arc) : padAngle;
19915           };
19916
19917           arc.context = function(_) {
19918             return arguments.length ? ((context = _ == null ? null : _), arc) : context;
19919           };
19920
19921           return arc;
19922         }
19923
19924         function Linear(context) {
19925           this._context = context;
19926         }
19927
19928         Linear.prototype = {
19929           areaStart: function() {
19930             this._line = 0;
19931           },
19932           areaEnd: function() {
19933             this._line = NaN;
19934           },
19935           lineStart: function() {
19936             this._point = 0;
19937           },
19938           lineEnd: function() {
19939             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
19940             this._line = 1 - this._line;
19941           },
19942           point: function(x, y) {
19943             x = +x, y = +y;
19944             switch (this._point) {
19945               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
19946               case 1: this._point = 2; // proceed
19947               default: this._context.lineTo(x, y); break;
19948             }
19949           }
19950         };
19951
19952         function curveLinear(context) {
19953           return new Linear(context);
19954         }
19955
19956         function x$3(p) {
19957           return p[0];
19958         }
19959
19960         function y$3(p) {
19961           return p[1];
19962         }
19963
19964         function line() {
19965           var x = x$3,
19966               y = y$3,
19967               defined = constant$b(true),
19968               context = null,
19969               curve = curveLinear,
19970               output = null;
19971
19972           function line(data) {
19973             var i,
19974                 n = data.length,
19975                 d,
19976                 defined0 = false,
19977                 buffer;
19978
19979             if (context == null) output = curve(buffer = path());
19980
19981             for (i = 0; i <= n; ++i) {
19982               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
19983                 if (defined0 = !defined0) output.lineStart();
19984                 else output.lineEnd();
19985               }
19986               if (defined0) output.point(+x(d, i, data), +y(d, i, data));
19987             }
19988
19989             if (buffer) return output = null, buffer + "" || null;
19990           }
19991
19992           line.x = function(_) {
19993             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), line) : x;
19994           };
19995
19996           line.y = function(_) {
19997             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), line) : y;
19998           };
19999
20000           line.defined = function(_) {
20001             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), line) : defined;
20002           };
20003
20004           line.curve = function(_) {
20005             return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
20006           };
20007
20008           line.context = function(_) {
20009             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
20010           };
20011
20012           return line;
20013         }
20014
20015         function area$1() {
20016           var x0 = x$3,
20017               x1 = null,
20018               y0 = constant$b(0),
20019               y1 = y$3,
20020               defined = constant$b(true),
20021               context = null,
20022               curve = curveLinear,
20023               output = null;
20024
20025           function area(data) {
20026             var i,
20027                 j,
20028                 k,
20029                 n = data.length,
20030                 d,
20031                 defined0 = false,
20032                 buffer,
20033                 x0z = new Array(n),
20034                 y0z = new Array(n);
20035
20036             if (context == null) output = curve(buffer = path());
20037
20038             for (i = 0; i <= n; ++i) {
20039               if (!(i < n && defined(d = data[i], i, data)) === defined0) {
20040                 if (defined0 = !defined0) {
20041                   j = i;
20042                   output.areaStart();
20043                   output.lineStart();
20044                 } else {
20045                   output.lineEnd();
20046                   output.lineStart();
20047                   for (k = i - 1; k >= j; --k) {
20048                     output.point(x0z[k], y0z[k]);
20049                   }
20050                   output.lineEnd();
20051                   output.areaEnd();
20052                 }
20053               }
20054               if (defined0) {
20055                 x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
20056                 output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
20057               }
20058             }
20059
20060             if (buffer) return output = null, buffer + "" || null;
20061           }
20062
20063           function arealine() {
20064             return line().defined(defined).curve(curve).context(context);
20065           }
20066
20067           area.x = function(_) {
20068             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), x1 = null, area) : x0;
20069           };
20070
20071           area.x0 = function(_) {
20072             return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$b(+_), area) : x0;
20073           };
20074
20075           area.x1 = function(_) {
20076             return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : x1;
20077           };
20078
20079           area.y = function(_) {
20080             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), y1 = null, area) : y0;
20081           };
20082
20083           area.y0 = function(_) {
20084             return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$b(+_), area) : y0;
20085           };
20086
20087           area.y1 = function(_) {
20088             return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$b(+_), area) : y1;
20089           };
20090
20091           area.lineX0 =
20092           area.lineY0 = function() {
20093             return arealine().x(x0).y(y0);
20094           };
20095
20096           area.lineY1 = function() {
20097             return arealine().x(x0).y(y1);
20098           };
20099
20100           area.lineX1 = function() {
20101             return arealine().x(x1).y(y0);
20102           };
20103
20104           area.defined = function(_) {
20105             return arguments.length ? (defined = typeof _ === "function" ? _ : constant$b(!!_), area) : defined;
20106           };
20107
20108           area.curve = function(_) {
20109             return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
20110           };
20111
20112           area.context = function(_) {
20113             return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
20114           };
20115
20116           return area;
20117         }
20118
20119         function descending(a, b) {
20120           return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
20121         }
20122
20123         function identity$7(d) {
20124           return d;
20125         }
20126
20127         function pie() {
20128           var value = identity$7,
20129               sortValues = descending,
20130               sort = null,
20131               startAngle = constant$b(0),
20132               endAngle = constant$b(tau$4),
20133               padAngle = constant$b(0);
20134
20135           function pie(data) {
20136             var i,
20137                 n = data.length,
20138                 j,
20139                 k,
20140                 sum = 0,
20141                 index = new Array(n),
20142                 arcs = new Array(n),
20143                 a0 = +startAngle.apply(this, arguments),
20144                 da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
20145                 a1,
20146                 p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
20147                 pa = p * (da < 0 ? -1 : 1),
20148                 v;
20149
20150             for (i = 0; i < n; ++i) {
20151               if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
20152                 sum += v;
20153               }
20154             }
20155
20156             // Optionally sort the arcs by previously-computed values or by data.
20157             if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
20158             else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
20159
20160             // Compute the arcs! They are stored in the original data's order.
20161             for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
20162               j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
20163                 data: data[j],
20164                 index: i,
20165                 value: v,
20166                 startAngle: a0,
20167                 endAngle: a1,
20168                 padAngle: p
20169               };
20170             }
20171
20172             return arcs;
20173           }
20174
20175           pie.value = function(_) {
20176             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), pie) : value;
20177           };
20178
20179           pie.sortValues = function(_) {
20180             return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
20181           };
20182
20183           pie.sort = function(_) {
20184             return arguments.length ? (sort = _, sortValues = null, pie) : sort;
20185           };
20186
20187           pie.startAngle = function(_) {
20188             return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : startAngle;
20189           };
20190
20191           pie.endAngle = function(_) {
20192             return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : endAngle;
20193           };
20194
20195           pie.padAngle = function(_) {
20196             return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$b(+_), pie) : padAngle;
20197           };
20198
20199           return pie;
20200         }
20201
20202         var curveRadialLinear = curveRadial(curveLinear);
20203
20204         function Radial(curve) {
20205           this._curve = curve;
20206         }
20207
20208         Radial.prototype = {
20209           areaStart: function() {
20210             this._curve.areaStart();
20211           },
20212           areaEnd: function() {
20213             this._curve.areaEnd();
20214           },
20215           lineStart: function() {
20216             this._curve.lineStart();
20217           },
20218           lineEnd: function() {
20219             this._curve.lineEnd();
20220           },
20221           point: function(a, r) {
20222             this._curve.point(r * Math.sin(a), r * -Math.cos(a));
20223           }
20224         };
20225
20226         function curveRadial(curve) {
20227
20228           function radial(context) {
20229             return new Radial(curve(context));
20230           }
20231
20232           radial._curve = curve;
20233
20234           return radial;
20235         }
20236
20237         function lineRadial(l) {
20238           var c = l.curve;
20239
20240           l.angle = l.x, delete l.x;
20241           l.radius = l.y, delete l.y;
20242
20243           l.curve = function(_) {
20244             return arguments.length ? c(curveRadial(_)) : c()._curve;
20245           };
20246
20247           return l;
20248         }
20249
20250         function lineRadial$1() {
20251           return lineRadial(line().curve(curveRadialLinear));
20252         }
20253
20254         function areaRadial() {
20255           var a = area$1().curve(curveRadialLinear),
20256               c = a.curve,
20257               x0 = a.lineX0,
20258               x1 = a.lineX1,
20259               y0 = a.lineY0,
20260               y1 = a.lineY1;
20261
20262           a.angle = a.x, delete a.x;
20263           a.startAngle = a.x0, delete a.x0;
20264           a.endAngle = a.x1, delete a.x1;
20265           a.radius = a.y, delete a.y;
20266           a.innerRadius = a.y0, delete a.y0;
20267           a.outerRadius = a.y1, delete a.y1;
20268           a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
20269           a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
20270           a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
20271           a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
20272
20273           a.curve = function(_) {
20274             return arguments.length ? c(curveRadial(_)) : c()._curve;
20275           };
20276
20277           return a;
20278         }
20279
20280         function pointRadial(x, y) {
20281           return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
20282         }
20283
20284         var slice$a = Array.prototype.slice;
20285
20286         function linkSource(d) {
20287           return d.source;
20288         }
20289
20290         function linkTarget(d) {
20291           return d.target;
20292         }
20293
20294         function link$2(curve) {
20295           var source = linkSource,
20296               target = linkTarget,
20297               x = x$3,
20298               y = y$3,
20299               context = null;
20300
20301           function link() {
20302             var buffer, argv = slice$a.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
20303             if (!context) context = buffer = path();
20304             curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));
20305             if (buffer) return context = null, buffer + "" || null;
20306           }
20307
20308           link.source = function(_) {
20309             return arguments.length ? (source = _, link) : source;
20310           };
20311
20312           link.target = function(_) {
20313             return arguments.length ? (target = _, link) : target;
20314           };
20315
20316           link.x = function(_) {
20317             return arguments.length ? (x = typeof _ === "function" ? _ : constant$b(+_), link) : x;
20318           };
20319
20320           link.y = function(_) {
20321             return arguments.length ? (y = typeof _ === "function" ? _ : constant$b(+_), link) : y;
20322           };
20323
20324           link.context = function(_) {
20325             return arguments.length ? ((context = _ == null ? null : _), link) : context;
20326           };
20327
20328           return link;
20329         }
20330
20331         function curveHorizontal(context, x0, y0, x1, y1) {
20332           context.moveTo(x0, y0);
20333           context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
20334         }
20335
20336         function curveVertical(context, x0, y0, x1, y1) {
20337           context.moveTo(x0, y0);
20338           context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
20339         }
20340
20341         function curveRadial$1(context, x0, y0, x1, y1) {
20342           var p0 = pointRadial(x0, y0),
20343               p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
20344               p2 = pointRadial(x1, y0),
20345               p3 = pointRadial(x1, y1);
20346           context.moveTo(p0[0], p0[1]);
20347           context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
20348         }
20349
20350         function linkHorizontal() {
20351           return link$2(curveHorizontal);
20352         }
20353
20354         function linkVertical() {
20355           return link$2(curveVertical);
20356         }
20357
20358         function linkRadial() {
20359           var l = link$2(curveRadial$1);
20360           l.angle = l.x, delete l.x;
20361           l.radius = l.y, delete l.y;
20362           return l;
20363         }
20364
20365         var circle$2 = {
20366           draw: function(context, size) {
20367             var r = Math.sqrt(size / pi$4);
20368             context.moveTo(r, 0);
20369             context.arc(0, 0, r, 0, tau$4);
20370           }
20371         };
20372
20373         var cross$2 = {
20374           draw: function(context, size) {
20375             var r = Math.sqrt(size / 5) / 2;
20376             context.moveTo(-3 * r, -r);
20377             context.lineTo(-r, -r);
20378             context.lineTo(-r, -3 * r);
20379             context.lineTo(r, -3 * r);
20380             context.lineTo(r, -r);
20381             context.lineTo(3 * r, -r);
20382             context.lineTo(3 * r, r);
20383             context.lineTo(r, r);
20384             context.lineTo(r, 3 * r);
20385             context.lineTo(-r, 3 * r);
20386             context.lineTo(-r, r);
20387             context.lineTo(-3 * r, r);
20388             context.closePath();
20389           }
20390         };
20391
20392         var tan30 = Math.sqrt(1 / 3),
20393             tan30_2 = tan30 * 2;
20394
20395         var diamond = {
20396           draw: function(context, size) {
20397             var y = Math.sqrt(size / tan30_2),
20398                 x = y * tan30;
20399             context.moveTo(0, -y);
20400             context.lineTo(x, 0);
20401             context.lineTo(0, y);
20402             context.lineTo(-x, 0);
20403             context.closePath();
20404           }
20405         };
20406
20407         var ka = 0.89081309152928522810,
20408             kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
20409             kx = Math.sin(tau$4 / 10) * kr,
20410             ky = -Math.cos(tau$4 / 10) * kr;
20411
20412         var star = {
20413           draw: function(context, size) {
20414             var r = Math.sqrt(size * ka),
20415                 x = kx * r,
20416                 y = ky * r;
20417             context.moveTo(0, -r);
20418             context.lineTo(x, y);
20419             for (var i = 1; i < 5; ++i) {
20420               var a = tau$4 * i / 5,
20421                   c = Math.cos(a),
20422                   s = Math.sin(a);
20423               context.lineTo(s * r, -c * r);
20424               context.lineTo(c * x - s * y, s * x + c * y);
20425             }
20426             context.closePath();
20427           }
20428         };
20429
20430         var square = {
20431           draw: function(context, size) {
20432             var w = Math.sqrt(size),
20433                 x = -w / 2;
20434             context.rect(x, x, w, w);
20435           }
20436         };
20437
20438         var sqrt3 = Math.sqrt(3);
20439
20440         var triangle = {
20441           draw: function(context, size) {
20442             var y = -Math.sqrt(size / (sqrt3 * 3));
20443             context.moveTo(0, y * 2);
20444             context.lineTo(-sqrt3 * y, -y);
20445             context.lineTo(sqrt3 * y, -y);
20446             context.closePath();
20447           }
20448         };
20449
20450         var c$2 = -0.5,
20451             s = Math.sqrt(3) / 2,
20452             k = 1 / Math.sqrt(12),
20453             a = (k / 2 + 1) * 3;
20454
20455         var wye = {
20456           draw: function(context, size) {
20457             var r = Math.sqrt(size / a),
20458                 x0 = r / 2,
20459                 y0 = r * k,
20460                 x1 = x0,
20461                 y1 = r * k + r,
20462                 x2 = -x1,
20463                 y2 = y1;
20464             context.moveTo(x0, y0);
20465             context.lineTo(x1, y1);
20466             context.lineTo(x2, y2);
20467             context.lineTo(c$2 * x0 - s * y0, s * x0 + c$2 * y0);
20468             context.lineTo(c$2 * x1 - s * y1, s * x1 + c$2 * y1);
20469             context.lineTo(c$2 * x2 - s * y2, s * x2 + c$2 * y2);
20470             context.lineTo(c$2 * x0 + s * y0, c$2 * y0 - s * x0);
20471             context.lineTo(c$2 * x1 + s * y1, c$2 * y1 - s * x1);
20472             context.lineTo(c$2 * x2 + s * y2, c$2 * y2 - s * x2);
20473             context.closePath();
20474           }
20475         };
20476
20477         var symbols = [
20478           circle$2,
20479           cross$2,
20480           diamond,
20481           square,
20482           star,
20483           triangle,
20484           wye
20485         ];
20486
20487         function symbol() {
20488           var type = constant$b(circle$2),
20489               size = constant$b(64),
20490               context = null;
20491
20492           function symbol() {
20493             var buffer;
20494             if (!context) context = buffer = path();
20495             type.apply(this, arguments).draw(context, +size.apply(this, arguments));
20496             if (buffer) return context = null, buffer + "" || null;
20497           }
20498
20499           symbol.type = function(_) {
20500             return arguments.length ? (type = typeof _ === "function" ? _ : constant$b(_), symbol) : type;
20501           };
20502
20503           symbol.size = function(_) {
20504             return arguments.length ? (size = typeof _ === "function" ? _ : constant$b(+_), symbol) : size;
20505           };
20506
20507           symbol.context = function(_) {
20508             return arguments.length ? (context = _ == null ? null : _, symbol) : context;
20509           };
20510
20511           return symbol;
20512         }
20513
20514         function noop$5() {}
20515
20516         function point$2(that, x, y) {
20517           that._context.bezierCurveTo(
20518             (2 * that._x0 + that._x1) / 3,
20519             (2 * that._y0 + that._y1) / 3,
20520             (that._x0 + 2 * that._x1) / 3,
20521             (that._y0 + 2 * that._y1) / 3,
20522             (that._x0 + 4 * that._x1 + x) / 6,
20523             (that._y0 + 4 * that._y1 + y) / 6
20524           );
20525         }
20526
20527         function Basis(context) {
20528           this._context = context;
20529         }
20530
20531         Basis.prototype = {
20532           areaStart: function() {
20533             this._line = 0;
20534           },
20535           areaEnd: function() {
20536             this._line = NaN;
20537           },
20538           lineStart: function() {
20539             this._x0 = this._x1 =
20540             this._y0 = this._y1 = NaN;
20541             this._point = 0;
20542           },
20543           lineEnd: function() {
20544             switch (this._point) {
20545               case 3: point$2(this, this._x1, this._y1); // proceed
20546               case 2: this._context.lineTo(this._x1, this._y1); break;
20547             }
20548             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20549             this._line = 1 - this._line;
20550           },
20551           point: function(x, y) {
20552             x = +x, y = +y;
20553             switch (this._point) {
20554               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20555               case 1: this._point = 2; break;
20556               case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
20557               default: point$2(this, x, y); break;
20558             }
20559             this._x0 = this._x1, this._x1 = x;
20560             this._y0 = this._y1, this._y1 = y;
20561           }
20562         };
20563
20564         function basis$2(context) {
20565           return new Basis(context);
20566         }
20567
20568         function BasisClosed(context) {
20569           this._context = context;
20570         }
20571
20572         BasisClosed.prototype = {
20573           areaStart: noop$5,
20574           areaEnd: noop$5,
20575           lineStart: function() {
20576             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
20577             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
20578             this._point = 0;
20579           },
20580           lineEnd: function() {
20581             switch (this._point) {
20582               case 1: {
20583                 this._context.moveTo(this._x2, this._y2);
20584                 this._context.closePath();
20585                 break;
20586               }
20587               case 2: {
20588                 this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
20589                 this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
20590                 this._context.closePath();
20591                 break;
20592               }
20593               case 3: {
20594                 this.point(this._x2, this._y2);
20595                 this.point(this._x3, this._y3);
20596                 this.point(this._x4, this._y4);
20597                 break;
20598               }
20599             }
20600           },
20601           point: function(x, y) {
20602             x = +x, y = +y;
20603             switch (this._point) {
20604               case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
20605               case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
20606               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;
20607               default: point$2(this, x, y); break;
20608             }
20609             this._x0 = this._x1, this._x1 = x;
20610             this._y0 = this._y1, this._y1 = y;
20611           }
20612         };
20613
20614         function basisClosed$1(context) {
20615           return new BasisClosed(context);
20616         }
20617
20618         function BasisOpen(context) {
20619           this._context = context;
20620         }
20621
20622         BasisOpen.prototype = {
20623           areaStart: function() {
20624             this._line = 0;
20625           },
20626           areaEnd: function() {
20627             this._line = NaN;
20628           },
20629           lineStart: function() {
20630             this._x0 = this._x1 =
20631             this._y0 = this._y1 = NaN;
20632             this._point = 0;
20633           },
20634           lineEnd: function() {
20635             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20636             this._line = 1 - this._line;
20637           },
20638           point: function(x, y) {
20639             x = +x, y = +y;
20640             switch (this._point) {
20641               case 0: this._point = 1; break;
20642               case 1: this._point = 2; break;
20643               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;
20644               case 3: this._point = 4; // proceed
20645               default: point$2(this, x, y); break;
20646             }
20647             this._x0 = this._x1, this._x1 = x;
20648             this._y0 = this._y1, this._y1 = y;
20649           }
20650         };
20651
20652         function basisOpen(context) {
20653           return new BasisOpen(context);
20654         }
20655
20656         function Bundle(context, beta) {
20657           this._basis = new Basis(context);
20658           this._beta = beta;
20659         }
20660
20661         Bundle.prototype = {
20662           lineStart: function() {
20663             this._x = [];
20664             this._y = [];
20665             this._basis.lineStart();
20666           },
20667           lineEnd: function() {
20668             var x = this._x,
20669                 y = this._y,
20670                 j = x.length - 1;
20671
20672             if (j > 0) {
20673               var x0 = x[0],
20674                   y0 = y[0],
20675                   dx = x[j] - x0,
20676                   dy = y[j] - y0,
20677                   i = -1,
20678                   t;
20679
20680               while (++i <= j) {
20681                 t = i / j;
20682                 this._basis.point(
20683                   this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
20684                   this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
20685                 );
20686               }
20687             }
20688
20689             this._x = this._y = null;
20690             this._basis.lineEnd();
20691           },
20692           point: function(x, y) {
20693             this._x.push(+x);
20694             this._y.push(+y);
20695           }
20696         };
20697
20698         var bundle = (function custom(beta) {
20699
20700           function bundle(context) {
20701             return beta === 1 ? new Basis(context) : new Bundle(context, beta);
20702           }
20703
20704           bundle.beta = function(beta) {
20705             return custom(+beta);
20706           };
20707
20708           return bundle;
20709         })(0.85);
20710
20711         function point$3(that, x, y) {
20712           that._context.bezierCurveTo(
20713             that._x1 + that._k * (that._x2 - that._x0),
20714             that._y1 + that._k * (that._y2 - that._y0),
20715             that._x2 + that._k * (that._x1 - x),
20716             that._y2 + that._k * (that._y1 - y),
20717             that._x2,
20718             that._y2
20719           );
20720         }
20721
20722         function Cardinal(context, tension) {
20723           this._context = context;
20724           this._k = (1 - tension) / 6;
20725         }
20726
20727         Cardinal.prototype = {
20728           areaStart: function() {
20729             this._line = 0;
20730           },
20731           areaEnd: function() {
20732             this._line = NaN;
20733           },
20734           lineStart: function() {
20735             this._x0 = this._x1 = this._x2 =
20736             this._y0 = this._y1 = this._y2 = NaN;
20737             this._point = 0;
20738           },
20739           lineEnd: function() {
20740             switch (this._point) {
20741               case 2: this._context.lineTo(this._x2, this._y2); break;
20742               case 3: point$3(this, this._x1, this._y1); break;
20743             }
20744             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20745             this._line = 1 - this._line;
20746           },
20747           point: function(x, y) {
20748             x = +x, y = +y;
20749             switch (this._point) {
20750               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20751               case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
20752               case 2: this._point = 3; // proceed
20753               default: point$3(this, x, y); break;
20754             }
20755             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20756             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20757           }
20758         };
20759
20760         var cardinal = (function custom(tension) {
20761
20762           function cardinal(context) {
20763             return new Cardinal(context, tension);
20764           }
20765
20766           cardinal.tension = function(tension) {
20767             return custom(+tension);
20768           };
20769
20770           return cardinal;
20771         })(0);
20772
20773         function CardinalClosed(context, tension) {
20774           this._context = context;
20775           this._k = (1 - tension) / 6;
20776         }
20777
20778         CardinalClosed.prototype = {
20779           areaStart: noop$5,
20780           areaEnd: noop$5,
20781           lineStart: function() {
20782             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20783             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20784             this._point = 0;
20785           },
20786           lineEnd: function() {
20787             switch (this._point) {
20788               case 1: {
20789                 this._context.moveTo(this._x3, this._y3);
20790                 this._context.closePath();
20791                 break;
20792               }
20793               case 2: {
20794                 this._context.lineTo(this._x3, this._y3);
20795                 this._context.closePath();
20796                 break;
20797               }
20798               case 3: {
20799                 this.point(this._x3, this._y3);
20800                 this.point(this._x4, this._y4);
20801                 this.point(this._x5, this._y5);
20802                 break;
20803               }
20804             }
20805           },
20806           point: function(x, y) {
20807             x = +x, y = +y;
20808             switch (this._point) {
20809               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
20810               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
20811               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
20812               default: point$3(this, x, y); break;
20813             }
20814             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20815             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20816           }
20817         };
20818
20819         var cardinalClosed = (function custom(tension) {
20820
20821           function cardinal(context) {
20822             return new CardinalClosed(context, tension);
20823           }
20824
20825           cardinal.tension = function(tension) {
20826             return custom(+tension);
20827           };
20828
20829           return cardinal;
20830         })(0);
20831
20832         function CardinalOpen(context, tension) {
20833           this._context = context;
20834           this._k = (1 - tension) / 6;
20835         }
20836
20837         CardinalOpen.prototype = {
20838           areaStart: function() {
20839             this._line = 0;
20840           },
20841           areaEnd: function() {
20842             this._line = NaN;
20843           },
20844           lineStart: function() {
20845             this._x0 = this._x1 = this._x2 =
20846             this._y0 = this._y1 = this._y2 = NaN;
20847             this._point = 0;
20848           },
20849           lineEnd: function() {
20850             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
20851             this._line = 1 - this._line;
20852           },
20853           point: function(x, y) {
20854             x = +x, y = +y;
20855             switch (this._point) {
20856               case 0: this._point = 1; break;
20857               case 1: this._point = 2; break;
20858               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
20859               case 3: this._point = 4; // proceed
20860               default: point$3(this, x, y); break;
20861             }
20862             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20863             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20864           }
20865         };
20866
20867         var cardinalOpen = (function custom(tension) {
20868
20869           function cardinal(context) {
20870             return new CardinalOpen(context, tension);
20871           }
20872
20873           cardinal.tension = function(tension) {
20874             return custom(+tension);
20875           };
20876
20877           return cardinal;
20878         })(0);
20879
20880         function point$4(that, x, y) {
20881           var x1 = that._x1,
20882               y1 = that._y1,
20883               x2 = that._x2,
20884               y2 = that._y2;
20885
20886           if (that._l01_a > epsilon$3) {
20887             var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
20888                 n = 3 * that._l01_a * (that._l01_a + that._l12_a);
20889             x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
20890             y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
20891           }
20892
20893           if (that._l23_a > epsilon$3) {
20894             var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
20895                 m = 3 * that._l23_a * (that._l23_a + that._l12_a);
20896             x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
20897             y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
20898           }
20899
20900           that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
20901         }
20902
20903         function CatmullRom(context, alpha) {
20904           this._context = context;
20905           this._alpha = alpha;
20906         }
20907
20908         CatmullRom.prototype = {
20909           areaStart: function() {
20910             this._line = 0;
20911           },
20912           areaEnd: function() {
20913             this._line = NaN;
20914           },
20915           lineStart: function() {
20916             this._x0 = this._x1 = this._x2 =
20917             this._y0 = this._y1 = this._y2 = NaN;
20918             this._l01_a = this._l12_a = this._l23_a =
20919             this._l01_2a = this._l12_2a = this._l23_2a =
20920             this._point = 0;
20921           },
20922           lineEnd: function() {
20923             switch (this._point) {
20924               case 2: this._context.lineTo(this._x2, this._y2); break;
20925               case 3: this.point(this._x2, this._y2); break;
20926             }
20927             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
20928             this._line = 1 - this._line;
20929           },
20930           point: function(x, y) {
20931             x = +x, y = +y;
20932
20933             if (this._point) {
20934               var x23 = this._x2 - x,
20935                   y23 = this._y2 - y;
20936               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
20937             }
20938
20939             switch (this._point) {
20940               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
20941               case 1: this._point = 2; break;
20942               case 2: this._point = 3; // proceed
20943               default: point$4(this, x, y); break;
20944             }
20945
20946             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
20947             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
20948             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
20949             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
20950           }
20951         };
20952
20953         var catmullRom = (function custom(alpha) {
20954
20955           function catmullRom(context) {
20956             return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
20957           }
20958
20959           catmullRom.alpha = function(alpha) {
20960             return custom(+alpha);
20961           };
20962
20963           return catmullRom;
20964         })(0.5);
20965
20966         function CatmullRomClosed(context, alpha) {
20967           this._context = context;
20968           this._alpha = alpha;
20969         }
20970
20971         CatmullRomClosed.prototype = {
20972           areaStart: noop$5,
20973           areaEnd: noop$5,
20974           lineStart: function() {
20975             this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
20976             this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
20977             this._l01_a = this._l12_a = this._l23_a =
20978             this._l01_2a = this._l12_2a = this._l23_2a =
20979             this._point = 0;
20980           },
20981           lineEnd: function() {
20982             switch (this._point) {
20983               case 1: {
20984                 this._context.moveTo(this._x3, this._y3);
20985                 this._context.closePath();
20986                 break;
20987               }
20988               case 2: {
20989                 this._context.lineTo(this._x3, this._y3);
20990                 this._context.closePath();
20991                 break;
20992               }
20993               case 3: {
20994                 this.point(this._x3, this._y3);
20995                 this.point(this._x4, this._y4);
20996                 this.point(this._x5, this._y5);
20997                 break;
20998               }
20999             }
21000           },
21001           point: function(x, y) {
21002             x = +x, y = +y;
21003
21004             if (this._point) {
21005               var x23 = this._x2 - x,
21006                   y23 = this._y2 - y;
21007               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21008             }
21009
21010             switch (this._point) {
21011               case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
21012               case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
21013               case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
21014               default: point$4(this, x, y); break;
21015             }
21016
21017             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21018             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21019             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21020             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21021           }
21022         };
21023
21024         var catmullRomClosed = (function custom(alpha) {
21025
21026           function catmullRom(context) {
21027             return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
21028           }
21029
21030           catmullRom.alpha = function(alpha) {
21031             return custom(+alpha);
21032           };
21033
21034           return catmullRom;
21035         })(0.5);
21036
21037         function CatmullRomOpen(context, alpha) {
21038           this._context = context;
21039           this._alpha = alpha;
21040         }
21041
21042         CatmullRomOpen.prototype = {
21043           areaStart: function() {
21044             this._line = 0;
21045           },
21046           areaEnd: function() {
21047             this._line = NaN;
21048           },
21049           lineStart: function() {
21050             this._x0 = this._x1 = this._x2 =
21051             this._y0 = this._y1 = this._y2 = NaN;
21052             this._l01_a = this._l12_a = this._l23_a =
21053             this._l01_2a = this._l12_2a = this._l23_2a =
21054             this._point = 0;
21055           },
21056           lineEnd: function() {
21057             if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
21058             this._line = 1 - this._line;
21059           },
21060           point: function(x, y) {
21061             x = +x, y = +y;
21062
21063             if (this._point) {
21064               var x23 = this._x2 - x,
21065                   y23 = this._y2 - y;
21066               this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
21067             }
21068
21069             switch (this._point) {
21070               case 0: this._point = 1; break;
21071               case 1: this._point = 2; break;
21072               case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
21073               case 3: this._point = 4; // proceed
21074               default: point$4(this, x, y); break;
21075             }
21076
21077             this._l01_a = this._l12_a, this._l12_a = this._l23_a;
21078             this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
21079             this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
21080             this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
21081           }
21082         };
21083
21084         var catmullRomOpen = (function custom(alpha) {
21085
21086           function catmullRom(context) {
21087             return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
21088           }
21089
21090           catmullRom.alpha = function(alpha) {
21091             return custom(+alpha);
21092           };
21093
21094           return catmullRom;
21095         })(0.5);
21096
21097         function LinearClosed(context) {
21098           this._context = context;
21099         }
21100
21101         LinearClosed.prototype = {
21102           areaStart: noop$5,
21103           areaEnd: noop$5,
21104           lineStart: function() {
21105             this._point = 0;
21106           },
21107           lineEnd: function() {
21108             if (this._point) this._context.closePath();
21109           },
21110           point: function(x, y) {
21111             x = +x, y = +y;
21112             if (this._point) this._context.lineTo(x, y);
21113             else this._point = 1, this._context.moveTo(x, y);
21114           }
21115         };
21116
21117         function linearClosed(context) {
21118           return new LinearClosed(context);
21119         }
21120
21121         function sign$3(x) {
21122           return x < 0 ? -1 : 1;
21123         }
21124
21125         // Calculate the slopes of the tangents (Hermite-type interpolation) based on
21126         // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
21127         // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
21128         // NOV(II), P. 443, 1990.
21129         function slope3(that, x2, y2) {
21130           var h0 = that._x1 - that._x0,
21131               h1 = x2 - that._x1,
21132               s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
21133               s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
21134               p = (s0 * h1 + s1 * h0) / (h0 + h1);
21135           return (sign$3(s0) + sign$3(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
21136         }
21137
21138         // Calculate a one-sided slope.
21139         function slope2(that, t) {
21140           var h = that._x1 - that._x0;
21141           return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
21142         }
21143
21144         // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
21145         // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
21146         // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
21147         function point$5(that, t0, t1) {
21148           var x0 = that._x0,
21149               y0 = that._y0,
21150               x1 = that._x1,
21151               y1 = that._y1,
21152               dx = (x1 - x0) / 3;
21153           that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
21154         }
21155
21156         function MonotoneX(context) {
21157           this._context = context;
21158         }
21159
21160         MonotoneX.prototype = {
21161           areaStart: function() {
21162             this._line = 0;
21163           },
21164           areaEnd: function() {
21165             this._line = NaN;
21166           },
21167           lineStart: function() {
21168             this._x0 = this._x1 =
21169             this._y0 = this._y1 =
21170             this._t0 = NaN;
21171             this._point = 0;
21172           },
21173           lineEnd: function() {
21174             switch (this._point) {
21175               case 2: this._context.lineTo(this._x1, this._y1); break;
21176               case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
21177             }
21178             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21179             this._line = 1 - this._line;
21180           },
21181           point: function(x, y) {
21182             var t1 = NaN;
21183
21184             x = +x, y = +y;
21185             if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
21186             switch (this._point) {
21187               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21188               case 1: this._point = 2; break;
21189               case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
21190               default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
21191             }
21192
21193             this._x0 = this._x1, this._x1 = x;
21194             this._y0 = this._y1, this._y1 = y;
21195             this._t0 = t1;
21196           }
21197         };
21198
21199         function MonotoneY(context) {
21200           this._context = new ReflectContext(context);
21201         }
21202
21203         (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
21204           MonotoneX.prototype.point.call(this, y, x);
21205         };
21206
21207         function ReflectContext(context) {
21208           this._context = context;
21209         }
21210
21211         ReflectContext.prototype = {
21212           moveTo: function(x, y) { this._context.moveTo(y, x); },
21213           closePath: function() { this._context.closePath(); },
21214           lineTo: function(x, y) { this._context.lineTo(y, x); },
21215           bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
21216         };
21217
21218         function monotoneX(context) {
21219           return new MonotoneX(context);
21220         }
21221
21222         function monotoneY(context) {
21223           return new MonotoneY(context);
21224         }
21225
21226         function Natural(context) {
21227           this._context = context;
21228         }
21229
21230         Natural.prototype = {
21231           areaStart: function() {
21232             this._line = 0;
21233           },
21234           areaEnd: function() {
21235             this._line = NaN;
21236           },
21237           lineStart: function() {
21238             this._x = [];
21239             this._y = [];
21240           },
21241           lineEnd: function() {
21242             var x = this._x,
21243                 y = this._y,
21244                 n = x.length;
21245
21246             if (n) {
21247               this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
21248               if (n === 2) {
21249                 this._context.lineTo(x[1], y[1]);
21250               } else {
21251                 var px = controlPoints(x),
21252                     py = controlPoints(y);
21253                 for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
21254                   this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
21255                 }
21256               }
21257             }
21258
21259             if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
21260             this._line = 1 - this._line;
21261             this._x = this._y = null;
21262           },
21263           point: function(x, y) {
21264             this._x.push(+x);
21265             this._y.push(+y);
21266           }
21267         };
21268
21269         // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
21270         function controlPoints(x) {
21271           var i,
21272               n = x.length - 1,
21273               m,
21274               a = new Array(n),
21275               b = new Array(n),
21276               r = new Array(n);
21277           a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
21278           for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
21279           a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
21280           for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
21281           a[n - 1] = r[n - 1] / b[n - 1];
21282           for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
21283           b[n - 1] = (x[n] + a[n - 1]) / 2;
21284           for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
21285           return [a, b];
21286         }
21287
21288         function natural(context) {
21289           return new Natural(context);
21290         }
21291
21292         function Step(context, t) {
21293           this._context = context;
21294           this._t = t;
21295         }
21296
21297         Step.prototype = {
21298           areaStart: function() {
21299             this._line = 0;
21300           },
21301           areaEnd: function() {
21302             this._line = NaN;
21303           },
21304           lineStart: function() {
21305             this._x = this._y = NaN;
21306             this._point = 0;
21307           },
21308           lineEnd: function() {
21309             if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
21310             if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
21311             if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
21312           },
21313           point: function(x, y) {
21314             x = +x, y = +y;
21315             switch (this._point) {
21316               case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
21317               case 1: this._point = 2; // proceed
21318               default: {
21319                 if (this._t <= 0) {
21320                   this._context.lineTo(this._x, y);
21321                   this._context.lineTo(x, y);
21322                 } else {
21323                   var x1 = this._x * (1 - this._t) + x * this._t;
21324                   this._context.lineTo(x1, this._y);
21325                   this._context.lineTo(x1, y);
21326                 }
21327                 break;
21328               }
21329             }
21330             this._x = x, this._y = y;
21331           }
21332         };
21333
21334         function step(context) {
21335           return new Step(context, 0.5);
21336         }
21337
21338         function stepBefore(context) {
21339           return new Step(context, 0);
21340         }
21341
21342         function stepAfter(context) {
21343           return new Step(context, 1);
21344         }
21345
21346         function none$1(series, order) {
21347           if (!((n = series.length) > 1)) return;
21348           for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
21349             s0 = s1, s1 = series[order[i]];
21350             for (j = 0; j < m; ++j) {
21351               s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
21352             }
21353           }
21354         }
21355
21356         function none$2(series) {
21357           var n = series.length, o = new Array(n);
21358           while (--n >= 0) o[n] = n;
21359           return o;
21360         }
21361
21362         function stackValue(d, key) {
21363           return d[key];
21364         }
21365
21366         function stack() {
21367           var keys = constant$b([]),
21368               order = none$2,
21369               offset = none$1,
21370               value = stackValue;
21371
21372           function stack(data) {
21373             var kz = keys.apply(this, arguments),
21374                 i,
21375                 m = data.length,
21376                 n = kz.length,
21377                 sz = new Array(n),
21378                 oz;
21379
21380             for (i = 0; i < n; ++i) {
21381               for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
21382                 si[j] = sij = [0, +value(data[j], ki, j, data)];
21383                 sij.data = data[j];
21384               }
21385               si.key = ki;
21386             }
21387
21388             for (i = 0, oz = order(sz); i < n; ++i) {
21389               sz[oz[i]].index = i;
21390             }
21391
21392             offset(sz, oz);
21393             return sz;
21394           }
21395
21396           stack.keys = function(_) {
21397             return arguments.length ? (keys = typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : keys;
21398           };
21399
21400           stack.value = function(_) {
21401             return arguments.length ? (value = typeof _ === "function" ? _ : constant$b(+_), stack) : value;
21402           };
21403
21404           stack.order = function(_) {
21405             return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$b(slice$a.call(_)), stack) : order;
21406           };
21407
21408           stack.offset = function(_) {
21409             return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
21410           };
21411
21412           return stack;
21413         }
21414
21415         function expand(series, order) {
21416           if (!((n = series.length) > 0)) return;
21417           for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
21418             for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
21419             if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
21420           }
21421           none$1(series, order);
21422         }
21423
21424         function diverging$1(series, order) {
21425           if (!((n = series.length) > 0)) return;
21426           for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
21427             for (yp = yn = 0, i = 0; i < n; ++i) {
21428               if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
21429                 d[0] = yp, d[1] = yp += dy;
21430               } else if (dy < 0) {
21431                 d[1] = yn, d[0] = yn += dy;
21432               } else {
21433                 d[0] = yp;
21434               }
21435             }
21436           }
21437         }
21438
21439         function silhouette(series, order) {
21440           if (!((n = series.length) > 0)) return;
21441           for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
21442             for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
21443             s0[j][1] += s0[j][0] = -y / 2;
21444           }
21445           none$1(series, order);
21446         }
21447
21448         function wiggle(series, order) {
21449           if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
21450           for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
21451             for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
21452               var si = series[order[i]],
21453                   sij0 = si[j][1] || 0,
21454                   sij1 = si[j - 1][1] || 0,
21455                   s3 = (sij0 - sij1) / 2;
21456               for (var k = 0; k < i; ++k) {
21457                 var sk = series[order[k]],
21458                     skj0 = sk[j][1] || 0,
21459                     skj1 = sk[j - 1][1] || 0;
21460                 s3 += skj0 - skj1;
21461               }
21462               s1 += sij0, s2 += s3 * sij0;
21463             }
21464             s0[j - 1][1] += s0[j - 1][0] = y;
21465             if (s1) y -= s2 / s1;
21466           }
21467           s0[j - 1][1] += s0[j - 1][0] = y;
21468           none$1(series, order);
21469         }
21470
21471         function appearance(series) {
21472           var peaks = series.map(peak);
21473           return none$2(series).sort(function(a, b) { return peaks[a] - peaks[b]; });
21474         }
21475
21476         function peak(series) {
21477           var i = -1, j = 0, n = series.length, vi, vj = -Infinity;
21478           while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i;
21479           return j;
21480         }
21481
21482         function ascending$2(series) {
21483           var sums = series.map(sum$2);
21484           return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
21485         }
21486
21487         function sum$2(series) {
21488           var s = 0, i = -1, n = series.length, v;
21489           while (++i < n) if (v = +series[i][1]) s += v;
21490           return s;
21491         }
21492
21493         function descending$1(series) {
21494           return ascending$2(series).reverse();
21495         }
21496
21497         function insideOut(series) {
21498           var n = series.length,
21499               i,
21500               j,
21501               sums = series.map(sum$2),
21502               order = appearance(series),
21503               top = 0,
21504               bottom = 0,
21505               tops = [],
21506               bottoms = [];
21507
21508           for (i = 0; i < n; ++i) {
21509             j = order[i];
21510             if (top < bottom) {
21511               top += sums[j];
21512               tops.push(j);
21513             } else {
21514               bottom += sums[j];
21515               bottoms.push(j);
21516             }
21517           }
21518
21519           return bottoms.reverse().concat(tops);
21520         }
21521
21522         function reverse(series) {
21523           return none$2(series).reverse();
21524         }
21525
21526         function constant$c(x) {
21527           return function() {
21528             return x;
21529           };
21530         }
21531
21532         function x$4(d) {
21533           return d[0];
21534         }
21535
21536         function y$4(d) {
21537           return d[1];
21538         }
21539
21540         function RedBlackTree() {
21541           this._ = null; // root node
21542         }
21543
21544         function RedBlackNode(node) {
21545           node.U = // parent node
21546           node.C = // color - true for red, false for black
21547           node.L = // left node
21548           node.R = // right node
21549           node.P = // previous node
21550           node.N = null; // next node
21551         }
21552
21553         RedBlackTree.prototype = {
21554           constructor: RedBlackTree,
21555
21556           insert: function(after, node) {
21557             var parent, grandpa, uncle;
21558
21559             if (after) {
21560               node.P = after;
21561               node.N = after.N;
21562               if (after.N) after.N.P = node;
21563               after.N = node;
21564               if (after.R) {
21565                 after = after.R;
21566                 while (after.L) after = after.L;
21567                 after.L = node;
21568               } else {
21569                 after.R = node;
21570               }
21571               parent = after;
21572             } else if (this._) {
21573               after = RedBlackFirst(this._);
21574               node.P = null;
21575               node.N = after;
21576               after.P = after.L = node;
21577               parent = after;
21578             } else {
21579               node.P = node.N = null;
21580               this._ = node;
21581               parent = null;
21582             }
21583             node.L = node.R = null;
21584             node.U = parent;
21585             node.C = true;
21586
21587             after = node;
21588             while (parent && parent.C) {
21589               grandpa = parent.U;
21590               if (parent === grandpa.L) {
21591                 uncle = grandpa.R;
21592                 if (uncle && uncle.C) {
21593                   parent.C = uncle.C = false;
21594                   grandpa.C = true;
21595                   after = grandpa;
21596                 } else {
21597                   if (after === parent.R) {
21598                     RedBlackRotateLeft(this, parent);
21599                     after = parent;
21600                     parent = after.U;
21601                   }
21602                   parent.C = false;
21603                   grandpa.C = true;
21604                   RedBlackRotateRight(this, grandpa);
21605                 }
21606               } else {
21607                 uncle = grandpa.L;
21608                 if (uncle && uncle.C) {
21609                   parent.C = uncle.C = false;
21610                   grandpa.C = true;
21611                   after = grandpa;
21612                 } else {
21613                   if (after === parent.L) {
21614                     RedBlackRotateRight(this, parent);
21615                     after = parent;
21616                     parent = after.U;
21617                   }
21618                   parent.C = false;
21619                   grandpa.C = true;
21620                   RedBlackRotateLeft(this, grandpa);
21621                 }
21622               }
21623               parent = after.U;
21624             }
21625             this._.C = false;
21626           },
21627
21628           remove: function(node) {
21629             if (node.N) node.N.P = node.P;
21630             if (node.P) node.P.N = node.N;
21631             node.N = node.P = null;
21632
21633             var parent = node.U,
21634                 sibling,
21635                 left = node.L,
21636                 right = node.R,
21637                 next,
21638                 red;
21639
21640             if (!left) next = right;
21641             else if (!right) next = left;
21642             else next = RedBlackFirst(right);
21643
21644             if (parent) {
21645               if (parent.L === node) parent.L = next;
21646               else parent.R = next;
21647             } else {
21648               this._ = next;
21649             }
21650
21651             if (left && right) {
21652               red = next.C;
21653               next.C = node.C;
21654               next.L = left;
21655               left.U = next;
21656               if (next !== right) {
21657                 parent = next.U;
21658                 next.U = node.U;
21659                 node = next.R;
21660                 parent.L = node;
21661                 next.R = right;
21662                 right.U = next;
21663               } else {
21664                 next.U = parent;
21665                 parent = next;
21666                 node = next.R;
21667               }
21668             } else {
21669               red = node.C;
21670               node = next;
21671             }
21672
21673             if (node) node.U = parent;
21674             if (red) return;
21675             if (node && node.C) { node.C = false; return; }
21676
21677             do {
21678               if (node === this._) break;
21679               if (node === parent.L) {
21680                 sibling = parent.R;
21681                 if (sibling.C) {
21682                   sibling.C = false;
21683                   parent.C = true;
21684                   RedBlackRotateLeft(this, parent);
21685                   sibling = parent.R;
21686                 }
21687                 if ((sibling.L && sibling.L.C)
21688                     || (sibling.R && sibling.R.C)) {
21689                   if (!sibling.R || !sibling.R.C) {
21690                     sibling.L.C = false;
21691                     sibling.C = true;
21692                     RedBlackRotateRight(this, sibling);
21693                     sibling = parent.R;
21694                   }
21695                   sibling.C = parent.C;
21696                   parent.C = sibling.R.C = false;
21697                   RedBlackRotateLeft(this, parent);
21698                   node = this._;
21699                   break;
21700                 }
21701               } else {
21702                 sibling = parent.L;
21703                 if (sibling.C) {
21704                   sibling.C = false;
21705                   parent.C = true;
21706                   RedBlackRotateRight(this, parent);
21707                   sibling = parent.L;
21708                 }
21709                 if ((sibling.L && sibling.L.C)
21710                   || (sibling.R && sibling.R.C)) {
21711                   if (!sibling.L || !sibling.L.C) {
21712                     sibling.R.C = false;
21713                     sibling.C = true;
21714                     RedBlackRotateLeft(this, sibling);
21715                     sibling = parent.L;
21716                   }
21717                   sibling.C = parent.C;
21718                   parent.C = sibling.L.C = false;
21719                   RedBlackRotateRight(this, parent);
21720                   node = this._;
21721                   break;
21722                 }
21723               }
21724               sibling.C = true;
21725               node = parent;
21726               parent = parent.U;
21727             } while (!node.C);
21728
21729             if (node) node.C = false;
21730           }
21731         };
21732
21733         function RedBlackRotateLeft(tree, node) {
21734           var p = node,
21735               q = node.R,
21736               parent = p.U;
21737
21738           if (parent) {
21739             if (parent.L === p) parent.L = q;
21740             else parent.R = q;
21741           } else {
21742             tree._ = q;
21743           }
21744
21745           q.U = parent;
21746           p.U = q;
21747           p.R = q.L;
21748           if (p.R) p.R.U = p;
21749           q.L = p;
21750         }
21751
21752         function RedBlackRotateRight(tree, node) {
21753           var p = node,
21754               q = node.L,
21755               parent = p.U;
21756
21757           if (parent) {
21758             if (parent.L === p) parent.L = q;
21759             else parent.R = q;
21760           } else {
21761             tree._ = q;
21762           }
21763
21764           q.U = parent;
21765           p.U = q;
21766           p.L = q.R;
21767           if (p.L) p.L.U = p;
21768           q.R = p;
21769         }
21770
21771         function RedBlackFirst(node) {
21772           while (node.L) node = node.L;
21773           return node;
21774         }
21775
21776         function createEdge(left, right, v0, v1) {
21777           var edge = [null, null],
21778               index = edges.push(edge) - 1;
21779           edge.left = left;
21780           edge.right = right;
21781           if (v0) setEdgeEnd(edge, left, right, v0);
21782           if (v1) setEdgeEnd(edge, right, left, v1);
21783           cells[left.index].halfedges.push(index);
21784           cells[right.index].halfedges.push(index);
21785           return edge;
21786         }
21787
21788         function createBorderEdge(left, v0, v1) {
21789           var edge = [v0, v1];
21790           edge.left = left;
21791           return edge;
21792         }
21793
21794         function setEdgeEnd(edge, left, right, vertex) {
21795           if (!edge[0] && !edge[1]) {
21796             edge[0] = vertex;
21797             edge.left = left;
21798             edge.right = right;
21799           } else if (edge.left === right) {
21800             edge[1] = vertex;
21801           } else {
21802             edge[0] = vertex;
21803           }
21804         }
21805
21806         // Liang–Barsky line clipping.
21807         function clipEdge(edge, x0, y0, x1, y1) {
21808           var a = edge[0],
21809               b = edge[1],
21810               ax = a[0],
21811               ay = a[1],
21812               bx = b[0],
21813               by = b[1],
21814               t0 = 0,
21815               t1 = 1,
21816               dx = bx - ax,
21817               dy = by - ay,
21818               r;
21819
21820           r = x0 - ax;
21821           if (!dx && r > 0) return;
21822           r /= dx;
21823           if (dx < 0) {
21824             if (r < t0) return;
21825             if (r < t1) t1 = r;
21826           } else if (dx > 0) {
21827             if (r > t1) return;
21828             if (r > t0) t0 = r;
21829           }
21830
21831           r = x1 - ax;
21832           if (!dx && r < 0) return;
21833           r /= dx;
21834           if (dx < 0) {
21835             if (r > t1) return;
21836             if (r > t0) t0 = r;
21837           } else if (dx > 0) {
21838             if (r < t0) return;
21839             if (r < t1) t1 = r;
21840           }
21841
21842           r = y0 - ay;
21843           if (!dy && r > 0) return;
21844           r /= dy;
21845           if (dy < 0) {
21846             if (r < t0) return;
21847             if (r < t1) t1 = r;
21848           } else if (dy > 0) {
21849             if (r > t1) return;
21850             if (r > t0) t0 = r;
21851           }
21852
21853           r = y1 - ay;
21854           if (!dy && r < 0) return;
21855           r /= dy;
21856           if (dy < 0) {
21857             if (r > t1) return;
21858             if (r > t0) t0 = r;
21859           } else if (dy > 0) {
21860             if (r < t0) return;
21861             if (r < t1) t1 = r;
21862           }
21863
21864           if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
21865
21866           if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
21867           if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
21868           return true;
21869         }
21870
21871         function connectEdge(edge, x0, y0, x1, y1) {
21872           var v1 = edge[1];
21873           if (v1) return true;
21874
21875           var v0 = edge[0],
21876               left = edge.left,
21877               right = edge.right,
21878               lx = left[0],
21879               ly = left[1],
21880               rx = right[0],
21881               ry = right[1],
21882               fx = (lx + rx) / 2,
21883               fy = (ly + ry) / 2,
21884               fm,
21885               fb;
21886
21887           if (ry === ly) {
21888             if (fx < x0 || fx >= x1) return;
21889             if (lx > rx) {
21890               if (!v0) v0 = [fx, y0];
21891               else if (v0[1] >= y1) return;
21892               v1 = [fx, y1];
21893             } else {
21894               if (!v0) v0 = [fx, y1];
21895               else if (v0[1] < y0) return;
21896               v1 = [fx, y0];
21897             }
21898           } else {
21899             fm = (lx - rx) / (ry - ly);
21900             fb = fy - fm * fx;
21901             if (fm < -1 || fm > 1) {
21902               if (lx > rx) {
21903                 if (!v0) v0 = [(y0 - fb) / fm, y0];
21904                 else if (v0[1] >= y1) return;
21905                 v1 = [(y1 - fb) / fm, y1];
21906               } else {
21907                 if (!v0) v0 = [(y1 - fb) / fm, y1];
21908                 else if (v0[1] < y0) return;
21909                 v1 = [(y0 - fb) / fm, y0];
21910               }
21911             } else {
21912               if (ly < ry) {
21913                 if (!v0) v0 = [x0, fm * x0 + fb];
21914                 else if (v0[0] >= x1) return;
21915                 v1 = [x1, fm * x1 + fb];
21916               } else {
21917                 if (!v0) v0 = [x1, fm * x1 + fb];
21918                 else if (v0[0] < x0) return;
21919                 v1 = [x0, fm * x0 + fb];
21920               }
21921             }
21922           }
21923
21924           edge[0] = v0;
21925           edge[1] = v1;
21926           return true;
21927         }
21928
21929         function clipEdges(x0, y0, x1, y1) {
21930           var i = edges.length,
21931               edge;
21932
21933           while (i--) {
21934             if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
21935                 || !clipEdge(edge, x0, y0, x1, y1)
21936                 || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
21937                     || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
21938               delete edges[i];
21939             }
21940           }
21941         }
21942
21943         function createCell(site) {
21944           return cells[site.index] = {
21945             site: site,
21946             halfedges: []
21947           };
21948         }
21949
21950         function cellHalfedgeAngle(cell, edge) {
21951           var site = cell.site,
21952               va = edge.left,
21953               vb = edge.right;
21954           if (site === vb) vb = va, va = site;
21955           if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
21956           if (site === va) va = edge[1], vb = edge[0];
21957           else va = edge[0], vb = edge[1];
21958           return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
21959         }
21960
21961         function cellHalfedgeStart(cell, edge) {
21962           return edge[+(edge.left !== cell.site)];
21963         }
21964
21965         function cellHalfedgeEnd(cell, edge) {
21966           return edge[+(edge.left === cell.site)];
21967         }
21968
21969         function sortCellHalfedges() {
21970           for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
21971             if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
21972               var index = new Array(m),
21973                   array = new Array(m);
21974               for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
21975               index.sort(function(i, j) { return array[j] - array[i]; });
21976               for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
21977               for (j = 0; j < m; ++j) halfedges[j] = array[j];
21978             }
21979           }
21980         }
21981
21982         function clipCells(x0, y0, x1, y1) {
21983           var nCells = cells.length,
21984               iCell,
21985               cell,
21986               site,
21987               iHalfedge,
21988               halfedges,
21989               nHalfedges,
21990               start,
21991               startX,
21992               startY,
21993               end,
21994               endX,
21995               endY,
21996               cover = true;
21997
21998           for (iCell = 0; iCell < nCells; ++iCell) {
21999             if (cell = cells[iCell]) {
22000               site = cell.site;
22001               halfedges = cell.halfedges;
22002               iHalfedge = halfedges.length;
22003
22004               // Remove any dangling clipped edges.
22005               while (iHalfedge--) {
22006                 if (!edges[halfedges[iHalfedge]]) {
22007                   halfedges.splice(iHalfedge, 1);
22008                 }
22009               }
22010
22011               // Insert any border edges as necessary.
22012               iHalfedge = 0, nHalfedges = halfedges.length;
22013               while (iHalfedge < nHalfedges) {
22014                 end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
22015                 start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
22016                 if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
22017                   halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
22018                       Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
22019                       : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
22020                       : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
22021                       : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
22022                       : null)) - 1);
22023                   ++nHalfedges;
22024                 }
22025               }
22026
22027               if (nHalfedges) cover = false;
22028             }
22029           }
22030
22031           // If there weren’t any edges, have the closest site cover the extent.
22032           // It doesn’t matter which corner of the extent we measure!
22033           if (cover) {
22034             var dx, dy, d2, dc = Infinity;
22035
22036             for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
22037               if (cell = cells[iCell]) {
22038                 site = cell.site;
22039                 dx = site[0] - x0;
22040                 dy = site[1] - y0;
22041                 d2 = dx * dx + dy * dy;
22042                 if (d2 < dc) dc = d2, cover = cell;
22043               }
22044             }
22045
22046             if (cover) {
22047               var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
22048               cover.halfedges.push(
22049                 edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
22050                 edges.push(createBorderEdge(site, v01, v11)) - 1,
22051                 edges.push(createBorderEdge(site, v11, v10)) - 1,
22052                 edges.push(createBorderEdge(site, v10, v00)) - 1
22053               );
22054             }
22055           }
22056
22057           // Lastly delete any cells with no edges; these were entirely clipped.
22058           for (iCell = 0; iCell < nCells; ++iCell) {
22059             if (cell = cells[iCell]) {
22060               if (!cell.halfedges.length) {
22061                 delete cells[iCell];
22062               }
22063             }
22064           }
22065         }
22066
22067         var circlePool = [];
22068
22069         var firstCircle;
22070
22071         function Circle() {
22072           RedBlackNode(this);
22073           this.x =
22074           this.y =
22075           this.arc =
22076           this.site =
22077           this.cy = null;
22078         }
22079
22080         function attachCircle(arc) {
22081           var lArc = arc.P,
22082               rArc = arc.N;
22083
22084           if (!lArc || !rArc) return;
22085
22086           var lSite = lArc.site,
22087               cSite = arc.site,
22088               rSite = rArc.site;
22089
22090           if (lSite === rSite) return;
22091
22092           var bx = cSite[0],
22093               by = cSite[1],
22094               ax = lSite[0] - bx,
22095               ay = lSite[1] - by,
22096               cx = rSite[0] - bx,
22097               cy = rSite[1] - by;
22098
22099           var d = 2 * (ax * cy - ay * cx);
22100           if (d >= -epsilon2$2) return;
22101
22102           var ha = ax * ax + ay * ay,
22103               hc = cx * cx + cy * cy,
22104               x = (cy * ha - ay * hc) / d,
22105               y = (ax * hc - cx * ha) / d;
22106
22107           var circle = circlePool.pop() || new Circle;
22108           circle.arc = arc;
22109           circle.site = cSite;
22110           circle.x = x + bx;
22111           circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
22112
22113           arc.circle = circle;
22114
22115           var before = null,
22116               node = circles._;
22117
22118           while (node) {
22119             if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
22120               if (node.L) node = node.L;
22121               else { before = node.P; break; }
22122             } else {
22123               if (node.R) node = node.R;
22124               else { before = node; break; }
22125             }
22126           }
22127
22128           circles.insert(before, circle);
22129           if (!before) firstCircle = circle;
22130         }
22131
22132         function detachCircle(arc) {
22133           var circle = arc.circle;
22134           if (circle) {
22135             if (!circle.P) firstCircle = circle.N;
22136             circles.remove(circle);
22137             circlePool.push(circle);
22138             RedBlackNode(circle);
22139             arc.circle = null;
22140           }
22141         }
22142
22143         var beachPool = [];
22144
22145         function Beach() {
22146           RedBlackNode(this);
22147           this.edge =
22148           this.site =
22149           this.circle = null;
22150         }
22151
22152         function createBeach(site) {
22153           var beach = beachPool.pop() || new Beach;
22154           beach.site = site;
22155           return beach;
22156         }
22157
22158         function detachBeach(beach) {
22159           detachCircle(beach);
22160           beaches.remove(beach);
22161           beachPool.push(beach);
22162           RedBlackNode(beach);
22163         }
22164
22165         function removeBeach(beach) {
22166           var circle = beach.circle,
22167               x = circle.x,
22168               y = circle.cy,
22169               vertex = [x, y],
22170               previous = beach.P,
22171               next = beach.N,
22172               disappearing = [beach];
22173
22174           detachBeach(beach);
22175
22176           var lArc = previous;
22177           while (lArc.circle
22178               && Math.abs(x - lArc.circle.x) < epsilon$4
22179               && Math.abs(y - lArc.circle.cy) < epsilon$4) {
22180             previous = lArc.P;
22181             disappearing.unshift(lArc);
22182             detachBeach(lArc);
22183             lArc = previous;
22184           }
22185
22186           disappearing.unshift(lArc);
22187           detachCircle(lArc);
22188
22189           var rArc = next;
22190           while (rArc.circle
22191               && Math.abs(x - rArc.circle.x) < epsilon$4
22192               && Math.abs(y - rArc.circle.cy) < epsilon$4) {
22193             next = rArc.N;
22194             disappearing.push(rArc);
22195             detachBeach(rArc);
22196             rArc = next;
22197           }
22198
22199           disappearing.push(rArc);
22200           detachCircle(rArc);
22201
22202           var nArcs = disappearing.length,
22203               iArc;
22204           for (iArc = 1; iArc < nArcs; ++iArc) {
22205             rArc = disappearing[iArc];
22206             lArc = disappearing[iArc - 1];
22207             setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
22208           }
22209
22210           lArc = disappearing[0];
22211           rArc = disappearing[nArcs - 1];
22212           rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
22213
22214           attachCircle(lArc);
22215           attachCircle(rArc);
22216         }
22217
22218         function addBeach(site) {
22219           var x = site[0],
22220               directrix = site[1],
22221               lArc,
22222               rArc,
22223               dxl,
22224               dxr,
22225               node = beaches._;
22226
22227           while (node) {
22228             dxl = leftBreakPoint(node, directrix) - x;
22229             if (dxl > epsilon$4) node = node.L; else {
22230               dxr = x - rightBreakPoint(node, directrix);
22231               if (dxr > epsilon$4) {
22232                 if (!node.R) {
22233                   lArc = node;
22234                   break;
22235                 }
22236                 node = node.R;
22237               } else {
22238                 if (dxl > -epsilon$4) {
22239                   lArc = node.P;
22240                   rArc = node;
22241                 } else if (dxr > -epsilon$4) {
22242                   lArc = node;
22243                   rArc = node.N;
22244                 } else {
22245                   lArc = rArc = node;
22246                 }
22247                 break;
22248               }
22249             }
22250           }
22251
22252           createCell(site);
22253           var newArc = createBeach(site);
22254           beaches.insert(lArc, newArc);
22255
22256           if (!lArc && !rArc) return;
22257
22258           if (lArc === rArc) {
22259             detachCircle(lArc);
22260             rArc = createBeach(lArc.site);
22261             beaches.insert(newArc, rArc);
22262             newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
22263             attachCircle(lArc);
22264             attachCircle(rArc);
22265             return;
22266           }
22267
22268           if (!rArc) { // && lArc
22269             newArc.edge = createEdge(lArc.site, newArc.site);
22270             return;
22271           }
22272
22273           // else lArc !== rArc
22274           detachCircle(lArc);
22275           detachCircle(rArc);
22276
22277           var lSite = lArc.site,
22278               ax = lSite[0],
22279               ay = lSite[1],
22280               bx = site[0] - ax,
22281               by = site[1] - ay,
22282               rSite = rArc.site,
22283               cx = rSite[0] - ax,
22284               cy = rSite[1] - ay,
22285               d = 2 * (bx * cy - by * cx),
22286               hb = bx * bx + by * by,
22287               hc = cx * cx + cy * cy,
22288               vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
22289
22290           setEdgeEnd(rArc.edge, lSite, rSite, vertex);
22291           newArc.edge = createEdge(lSite, site, null, vertex);
22292           rArc.edge = createEdge(site, rSite, null, vertex);
22293           attachCircle(lArc);
22294           attachCircle(rArc);
22295         }
22296
22297         function leftBreakPoint(arc, directrix) {
22298           var site = arc.site,
22299               rfocx = site[0],
22300               rfocy = site[1],
22301               pby2 = rfocy - directrix;
22302
22303           if (!pby2) return rfocx;
22304
22305           var lArc = arc.P;
22306           if (!lArc) return -Infinity;
22307
22308           site = lArc.site;
22309           var lfocx = site[0],
22310               lfocy = site[1],
22311               plby2 = lfocy - directrix;
22312
22313           if (!plby2) return lfocx;
22314
22315           var hl = lfocx - rfocx,
22316               aby2 = 1 / pby2 - 1 / plby2,
22317               b = hl / plby2;
22318
22319           if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
22320
22321           return (rfocx + lfocx) / 2;
22322         }
22323
22324         function rightBreakPoint(arc, directrix) {
22325           var rArc = arc.N;
22326           if (rArc) return leftBreakPoint(rArc, directrix);
22327           var site = arc.site;
22328           return site[1] === directrix ? site[0] : Infinity;
22329         }
22330
22331         var epsilon$4 = 1e-6;
22332         var epsilon2$2 = 1e-12;
22333         var beaches;
22334         var cells;
22335         var circles;
22336         var edges;
22337
22338         function triangleArea(a, b, c) {
22339           return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
22340         }
22341
22342         function lexicographic(a, b) {
22343           return b[1] - a[1]
22344               || b[0] - a[0];
22345         }
22346
22347         function Diagram(sites, extent) {
22348           var site = sites.sort(lexicographic).pop(),
22349               x,
22350               y,
22351               circle;
22352
22353           edges = [];
22354           cells = new Array(sites.length);
22355           beaches = new RedBlackTree;
22356           circles = new RedBlackTree;
22357
22358           while (true) {
22359             circle = firstCircle;
22360             if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
22361               if (site[0] !== x || site[1] !== y) {
22362                 addBeach(site);
22363                 x = site[0], y = site[1];
22364               }
22365               site = sites.pop();
22366             } else if (circle) {
22367               removeBeach(circle.arc);
22368             } else {
22369               break;
22370             }
22371           }
22372
22373           sortCellHalfedges();
22374
22375           if (extent) {
22376             var x0 = +extent[0][0],
22377                 y0 = +extent[0][1],
22378                 x1 = +extent[1][0],
22379                 y1 = +extent[1][1];
22380             clipEdges(x0, y0, x1, y1);
22381             clipCells(x0, y0, x1, y1);
22382           }
22383
22384           this.edges = edges;
22385           this.cells = cells;
22386
22387           beaches =
22388           circles =
22389           edges =
22390           cells = null;
22391         }
22392
22393         Diagram.prototype = {
22394           constructor: Diagram,
22395
22396           polygons: function() {
22397             var edges = this.edges;
22398
22399             return this.cells.map(function(cell) {
22400               var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
22401               polygon.data = cell.site.data;
22402               return polygon;
22403             });
22404           },
22405
22406           triangles: function() {
22407             var triangles = [],
22408                 edges = this.edges;
22409
22410             this.cells.forEach(function(cell, i) {
22411               if (!(m = (halfedges = cell.halfedges).length)) return;
22412               var site = cell.site,
22413                   halfedges,
22414                   j = -1,
22415                   m,
22416                   s0,
22417                   e1 = edges[halfedges[m - 1]],
22418                   s1 = e1.left === site ? e1.right : e1.left;
22419
22420               while (++j < m) {
22421                 s0 = s1;
22422                 e1 = edges[halfedges[j]];
22423                 s1 = e1.left === site ? e1.right : e1.left;
22424                 if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
22425                   triangles.push([site.data, s0.data, s1.data]);
22426                 }
22427               }
22428             });
22429
22430             return triangles;
22431           },
22432
22433           links: function() {
22434             return this.edges.filter(function(edge) {
22435               return edge.right;
22436             }).map(function(edge) {
22437               return {
22438                 source: edge.left.data,
22439                 target: edge.right.data
22440               };
22441             });
22442           },
22443
22444           find: function(x, y, radius) {
22445             var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
22446
22447             // Use the previously-found cell, or start with an arbitrary one.
22448             while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
22449             var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
22450
22451             // Traverse the half-edges to find a closer cell, if any.
22452             do {
22453               cell = that.cells[i0 = i1], i1 = null;
22454               cell.halfedges.forEach(function(e) {
22455                 var edge = that.edges[e], v = edge.left;
22456                 if ((v === cell.site || !v) && !(v = edge.right)) return;
22457                 var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
22458                 if (v2 < d2) d2 = v2, i1 = v.index;
22459               });
22460             } while (i1 !== null);
22461
22462             that._found = i0;
22463
22464             return radius == null || d2 <= radius * radius ? cell.site : null;
22465           }
22466         };
22467
22468         function voronoi() {
22469           var x = x$4,
22470               y = y$4,
22471               extent = null;
22472
22473           function voronoi(data) {
22474             return new Diagram(data.map(function(d, i) {
22475               var s = [Math.round(x(d, i, data) / epsilon$4) * epsilon$4, Math.round(y(d, i, data) / epsilon$4) * epsilon$4];
22476               s.index = i;
22477               s.data = d;
22478               return s;
22479             }), extent);
22480           }
22481
22482           voronoi.polygons = function(data) {
22483             return voronoi(data).polygons();
22484           };
22485
22486           voronoi.links = function(data) {
22487             return voronoi(data).links();
22488           };
22489
22490           voronoi.triangles = function(data) {
22491             return voronoi(data).triangles();
22492           };
22493
22494           voronoi.x = function(_) {
22495             return arguments.length ? (x = typeof _ === "function" ? _ : constant$c(+_), voronoi) : x;
22496           };
22497
22498           voronoi.y = function(_) {
22499             return arguments.length ? (y = typeof _ === "function" ? _ : constant$c(+_), voronoi) : y;
22500           };
22501
22502           voronoi.extent = function(_) {
22503             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]]];
22504           };
22505
22506           voronoi.size = function(_) {
22507             return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
22508           };
22509
22510           return voronoi;
22511         }
22512
22513         function constant$d(x) {
22514           return function() {
22515             return x;
22516           };
22517         }
22518
22519         function ZoomEvent(target, type, transform) {
22520           this.target = target;
22521           this.type = type;
22522           this.transform = transform;
22523         }
22524
22525         function Transform(k, x, y) {
22526           this.k = k;
22527           this.x = x;
22528           this.y = y;
22529         }
22530
22531         Transform.prototype = {
22532           constructor: Transform,
22533           scale: function(k) {
22534             return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
22535           },
22536           translate: function(x, y) {
22537             return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
22538           },
22539           apply: function(point) {
22540             return [point[0] * this.k + this.x, point[1] * this.k + this.y];
22541           },
22542           applyX: function(x) {
22543             return x * this.k + this.x;
22544           },
22545           applyY: function(y) {
22546             return y * this.k + this.y;
22547           },
22548           invert: function(location) {
22549             return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
22550           },
22551           invertX: function(x) {
22552             return (x - this.x) / this.k;
22553           },
22554           invertY: function(y) {
22555             return (y - this.y) / this.k;
22556           },
22557           rescaleX: function(x) {
22558             return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
22559           },
22560           rescaleY: function(y) {
22561             return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
22562           },
22563           toString: function() {
22564             return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
22565           }
22566         };
22567
22568         var identity$8 = new Transform(1, 0, 0);
22569
22570         transform.prototype = Transform.prototype;
22571
22572         function transform(node) {
22573           return node.__zoom || identity$8;
22574         }
22575
22576         function nopropagation$2() {
22577           event.stopImmediatePropagation();
22578         }
22579
22580         function noevent$2() {
22581           event.preventDefault();
22582           event.stopImmediatePropagation();
22583         }
22584
22585         // Ignore right-click, since that should open the context menu.
22586         function defaultFilter$2() {
22587           return !event.button;
22588         }
22589
22590         function defaultExtent$1() {
22591           var e = this, w, h;
22592           if (e instanceof SVGElement) {
22593             e = e.ownerSVGElement || e;
22594             w = e.width.baseVal.value;
22595             h = e.height.baseVal.value;
22596           } else {
22597             w = e.clientWidth;
22598             h = e.clientHeight;
22599           }
22600           return [[0, 0], [w, h]];
22601         }
22602
22603         function defaultTransform() {
22604           return this.__zoom || identity$8;
22605         }
22606
22607         function defaultWheelDelta() {
22608           return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
22609         }
22610
22611         function defaultTouchable$1() {
22612           return "ontouchstart" in this;
22613         }
22614
22615         function defaultConstrain(transform, extent, translateExtent) {
22616           var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0],
22617               dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0],
22618               dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1],
22619               dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1];
22620           return transform.translate(
22621             dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
22622             dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
22623           );
22624         }
22625
22626         function d3_zoom() {
22627           var filter = defaultFilter$2,
22628               extent = defaultExtent$1,
22629               constrain = defaultConstrain,
22630               wheelDelta = defaultWheelDelta,
22631               touchable = defaultTouchable$1,
22632               scaleExtent = [0, Infinity],
22633               translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
22634               duration = 250,
22635               interpolate = interpolateZoom,
22636               gestures = [],
22637               listeners = dispatch("start", "zoom", "end"),
22638               touchstarting,
22639               touchending,
22640               touchDelay = 500,
22641               wheelDelay = 150,
22642               clickDistance2 = 0;
22643
22644           function zoom(selection) {
22645             selection
22646                 .property("__zoom", defaultTransform)
22647                 .on("wheel.zoom", wheeled)
22648                 .on("mousedown.zoom", mousedowned)
22649                 .on("dblclick.zoom", dblclicked)
22650               .filter(touchable)
22651                 .on("touchstart.zoom", touchstarted)
22652                 .on("touchmove.zoom", touchmoved)
22653                 .on("touchend.zoom touchcancel.zoom", touchended)
22654                 .style("touch-action", "none")
22655                 .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
22656           }
22657
22658           zoom.transform = function(collection, transform) {
22659             var selection = collection.selection ? collection.selection() : collection;
22660             selection.property("__zoom", defaultTransform);
22661             if (collection !== selection) {
22662               schedule(collection, transform);
22663             } else {
22664               selection.interrupt().each(function() {
22665                 gesture(this, arguments)
22666                     .start()
22667                     .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform)
22668                     .end();
22669               });
22670             }
22671           };
22672
22673           zoom.scaleBy = function(selection, k) {
22674             zoom.scaleTo(selection, function() {
22675               var k0 = this.__zoom.k,
22676                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22677               return k0 * k1;
22678             });
22679           };
22680
22681           zoom.scaleTo = function(selection, k) {
22682             zoom.transform(selection, function() {
22683               var e = extent.apply(this, arguments),
22684                   t0 = this.__zoom,
22685                   p0 = centroid(e),
22686                   p1 = t0.invert(p0),
22687                   k1 = typeof k === "function" ? k.apply(this, arguments) : k;
22688               return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
22689             });
22690           };
22691
22692           zoom.translateBy = function(selection, x, y) {
22693             zoom.transform(selection, function() {
22694               return constrain(this.__zoom.translate(
22695                 typeof x === "function" ? x.apply(this, arguments) : x,
22696                 typeof y === "function" ? y.apply(this, arguments) : y
22697               ), extent.apply(this, arguments), translateExtent);
22698             });
22699           };
22700
22701           zoom.translateTo = function(selection, x, y) {
22702             zoom.transform(selection, function() {
22703               var e = extent.apply(this, arguments),
22704                   t = this.__zoom,
22705                   p = centroid(e);
22706               return constrain(identity$8.translate(p[0], p[1]).scale(t.k).translate(
22707                 typeof x === "function" ? -x.apply(this, arguments) : -x,
22708                 typeof y === "function" ? -y.apply(this, arguments) : -y
22709               ), e, translateExtent);
22710             });
22711           };
22712
22713           function scale(transform, k) {
22714             k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
22715             return k === transform.k ? transform : new Transform(k, transform.x, transform.y);
22716           }
22717
22718           function translate(transform, p0, p1) {
22719             var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k;
22720             return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y);
22721           }
22722
22723           function centroid(extent) {
22724             return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
22725           }
22726
22727           function schedule(transition, transform, center) {
22728             transition
22729                 .on("start.zoom", function() { gesture(this, arguments).start(); })
22730                 .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
22731                 .tween("zoom", function() {
22732                   var that = this,
22733                       args = arguments,
22734                       g = gesture(that, args),
22735                       e = extent.apply(that, args),
22736                       p = center || centroid(e),
22737                       w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
22738                       a = that.__zoom,
22739                       b = typeof transform === "function" ? transform.apply(that, args) : transform,
22740                       i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
22741                   return function(t) {
22742                     if (t === 1) t = b; // Avoid rounding error on end.
22743                     else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
22744                     g.zoom(null, t);
22745                   };
22746                 });
22747           }
22748
22749           function gesture(that, args) {
22750             for (var i = 0, n = gestures.length, g; i < n; ++i) {
22751               if ((g = gestures[i]).that === that) {
22752                 return g;
22753               }
22754             }
22755             return new Gesture(that, args);
22756           }
22757
22758           function Gesture(that, args) {
22759             this.that = that;
22760             this.args = args;
22761             this.index = -1;
22762             this.active = 0;
22763             this.extent = extent.apply(that, args);
22764           }
22765
22766           Gesture.prototype = {
22767             start: function() {
22768               if (++this.active === 1) {
22769                 this.index = gestures.push(this) - 1;
22770                 this.emit("start");
22771               }
22772               return this;
22773             },
22774             zoom: function(key, transform) {
22775               if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]);
22776               if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]);
22777               if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]);
22778               this.that.__zoom = transform;
22779               this.emit("zoom");
22780               return this;
22781             },
22782             end: function() {
22783               if (--this.active === 0) {
22784                 gestures.splice(this.index, 1);
22785                 this.index = -1;
22786                 this.emit("end");
22787               }
22788               return this;
22789             },
22790             emit: function(type) {
22791               customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
22792             }
22793           };
22794
22795           function wheeled() {
22796             if (!filter.apply(this, arguments)) return;
22797             var g = gesture(this, arguments),
22798                 t = this.__zoom,
22799                 k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
22800                 p = d3_mouse(this);
22801
22802             // If the mouse is in the same location as before, reuse it.
22803             // If there were recent wheel events, reset the wheel idle timeout.
22804             if (g.wheel) {
22805               if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
22806                 g.mouse[1] = t.invert(g.mouse[0] = p);
22807               }
22808               clearTimeout(g.wheel);
22809             }
22810
22811             // If this wheel event won’t trigger a transform change, ignore it.
22812             else if (t.k === k) return;
22813
22814             // Otherwise, capture the mouse point and location at the start.
22815             else {
22816               g.mouse = [p, t.invert(p)];
22817               interrupt(this);
22818               g.start();
22819             }
22820
22821             noevent$2();
22822             g.wheel = setTimeout(wheelidled, wheelDelay);
22823             g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
22824
22825             function wheelidled() {
22826               g.wheel = null;
22827               g.end();
22828             }
22829           }
22830
22831           function mousedowned() {
22832             if (touchending || !filter.apply(this, arguments)) return;
22833             var g = gesture(this, arguments),
22834                 v = d3_select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
22835                 p = d3_mouse(this),
22836                 x0 = event.clientX,
22837                 y0 = event.clientY;
22838
22839             dragDisable(event.view);
22840             nopropagation$2();
22841             g.mouse = [p, this.__zoom.invert(p)];
22842             interrupt(this);
22843             g.start();
22844
22845             function mousemoved() {
22846               noevent$2();
22847               if (!g.moved) {
22848                 var dx = event.clientX - x0, dy = event.clientY - y0;
22849                 g.moved = dx * dx + dy * dy > clickDistance2;
22850               }
22851               g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3_mouse(g.that), g.mouse[1]), g.extent, translateExtent));
22852             }
22853
22854             function mouseupped() {
22855               v.on("mousemove.zoom mouseup.zoom", null);
22856               yesdrag(event.view, g.moved);
22857               noevent$2();
22858               g.end();
22859             }
22860           }
22861
22862           function dblclicked() {
22863             if (!filter.apply(this, arguments)) return;
22864             var t0 = this.__zoom,
22865                 p0 = d3_mouse(this),
22866                 p1 = t0.invert(p0),
22867                 k1 = t0.k * (event.shiftKey ? 0.5 : 2),
22868                 t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
22869
22870             noevent$2();
22871             if (duration > 0) d3_select(this).transition().duration(duration).call(schedule, t1, p0);
22872             else d3_select(this).call(zoom.transform, t1);
22873           }
22874
22875           function touchstarted() {
22876             if (!filter.apply(this, arguments)) return;
22877             var g = gesture(this, arguments),
22878                 touches = event.changedTouches,
22879                 started,
22880                 n = touches.length, i, t, p;
22881
22882             nopropagation$2();
22883             for (i = 0; i < n; ++i) {
22884               t = touches[i], p = touch(this, touches, t.identifier);
22885               p = [p, this.__zoom.invert(p), t.identifier];
22886               if (!g.touch0) g.touch0 = p, started = true;
22887               else if (!g.touch1) g.touch1 = p;
22888             }
22889
22890             // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
22891             if (touchstarting) {
22892               touchstarting = clearTimeout(touchstarting);
22893               if (!g.touch1) {
22894                 g.end();
22895                 p = d3_select(this).on("dblclick.zoom");
22896                 if (p) p.apply(this, arguments);
22897                 return;
22898               }
22899             }
22900
22901             if (started) {
22902               touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
22903               interrupt(this);
22904               g.start();
22905             }
22906           }
22907
22908           function touchmoved() {
22909             var g = gesture(this, arguments),
22910                 touches = event.changedTouches,
22911                 n = touches.length, i, t, p, l;
22912
22913             noevent$2();
22914             if (touchstarting) touchstarting = clearTimeout(touchstarting);
22915             for (i = 0; i < n; ++i) {
22916               t = touches[i], p = touch(this, touches, t.identifier);
22917               if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
22918               else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
22919             }
22920             t = g.that.__zoom;
22921             if (g.touch1) {
22922               var p0 = g.touch0[0], l0 = g.touch0[1],
22923                   p1 = g.touch1[0], l1 = g.touch1[1],
22924                   dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
22925                   dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
22926               t = scale(t, Math.sqrt(dp / dl));
22927               p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
22928               l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
22929             }
22930             else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
22931             else return;
22932             g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
22933           }
22934
22935           function touchended() {
22936             var g = gesture(this, arguments),
22937                 touches = event.changedTouches,
22938                 n = touches.length, i, t;
22939
22940             nopropagation$2();
22941             if (touchending) clearTimeout(touchending);
22942             touchending = setTimeout(function() { touchending = null; }, touchDelay);
22943             for (i = 0; i < n; ++i) {
22944               t = touches[i];
22945               if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
22946               else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
22947             }
22948             if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
22949             if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
22950             else g.end();
22951           }
22952
22953           zoom.wheelDelta = function(_) {
22954             return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$d(+_), zoom) : wheelDelta;
22955           };
22956
22957           zoom.filter = function(_) {
22958             return arguments.length ? (filter = typeof _ === "function" ? _ : constant$d(!!_), zoom) : filter;
22959           };
22960
22961           zoom.touchable = function(_) {
22962             return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$d(!!_), zoom) : touchable;
22963           };
22964
22965           zoom.extent = function(_) {
22966             return arguments.length ? (extent = typeof _ === "function" ? _ : constant$d([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
22967           };
22968
22969           zoom.scaleExtent = function(_) {
22970             return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
22971           };
22972
22973           zoom.translateExtent = function(_) {
22974             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]]];
22975           };
22976
22977           zoom.constrain = function(_) {
22978             return arguments.length ? (constrain = _, zoom) : constrain;
22979           };
22980
22981           zoom.duration = function(_) {
22982             return arguments.length ? (duration = +_, zoom) : duration;
22983           };
22984
22985           zoom.interpolate = function(_) {
22986             return arguments.length ? (interpolate = _, zoom) : interpolate;
22987           };
22988
22989           zoom.on = function() {
22990             var value = listeners.on.apply(listeners, arguments);
22991             return value === listeners ? zoom : value;
22992           };
22993
22994           zoom.clickDistance = function(_) {
22995             return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
22996           };
22997
22998           return zoom;
22999         }
23000
23001
23002
23003         var index$3 = /*#__PURE__*/Object.freeze({
23004                 version: version,
23005                 bisect: bisectRight,
23006                 bisectRight: bisectRight,
23007                 bisectLeft: bisectLeft,
23008                 ascending: d3_ascending,
23009                 bisector: d3_bisector,
23010                 cross: cross,
23011                 descending: d3_descending,
23012                 deviation: deviation,
23013                 extent: extent,
23014                 histogram: histogram,
23015                 thresholdFreedmanDiaconis: freedmanDiaconis,
23016                 thresholdScott: scott,
23017                 thresholdSturges: thresholdSturges,
23018                 max: max$2,
23019                 mean: mean,
23020                 median: d3_median,
23021                 merge: merge,
23022                 min: min,
23023                 pairs: pairs,
23024                 permute: permute,
23025                 quantile: threshold,
23026                 range: d3_range,
23027                 scan: scan,
23028                 shuffle: shuffle,
23029                 sum: sum,
23030                 ticks: ticks,
23031                 tickIncrement: tickIncrement,
23032                 tickStep: tickStep,
23033                 transpose: transpose,
23034                 variance: variance,
23035                 zip: zip,
23036                 axisTop: axisTop,
23037                 axisRight: axisRight,
23038                 axisBottom: axisBottom,
23039                 axisLeft: axisLeft,
23040                 brush: brush,
23041                 brushX: brushX,
23042                 brushY: brushY,
23043                 brushSelection: brushSelection,
23044                 chord: chord,
23045                 ribbon: ribbon,
23046                 nest: nest,
23047                 set: set$2,
23048                 map: map$3,
23049                 keys: keys$3,
23050                 values: values,
23051                 entries: entries,
23052                 color: color,
23053                 rgb: rgb,
23054                 hsl: hsl,
23055                 lab: lab,
23056                 hcl: hcl,
23057                 lch: lch,
23058                 gray: gray,
23059                 cubehelix: cubehelix,
23060                 contours: contours,
23061                 contourDensity: density,
23062                 dispatch: dispatch,
23063                 drag: d3_drag,
23064                 dragDisable: dragDisable,
23065                 dragEnable: yesdrag,
23066                 dsvFormat: dsvFormat,
23067                 csvParse: csvParse,
23068                 csvParseRows: csvParseRows,
23069                 csvFormat: csvFormat,
23070                 csvFormatBody: csvFormatBody,
23071                 csvFormatRows: csvFormatRows,
23072                 tsvParse: tsvParse,
23073                 tsvParseRows: tsvParseRows,
23074                 tsvFormat: tsvFormat,
23075                 tsvFormatBody: tsvFormatBody,
23076                 tsvFormatRows: tsvFormatRows,
23077                 autoType: autoType,
23078                 easeLinear: linear$1,
23079                 easeQuad: quadInOut,
23080                 easeQuadIn: quadIn,
23081                 easeQuadOut: quadOut,
23082                 easeQuadInOut: quadInOut,
23083                 easeCubic: cubicInOut,
23084                 easeCubicIn: cubicIn,
23085                 easeCubicOut: cubicOut,
23086                 easeCubicInOut: cubicInOut,
23087                 easePoly: polyInOut,
23088                 easePolyIn: polyIn,
23089                 easePolyOut: polyOut,
23090                 easePolyInOut: polyInOut,
23091                 easeSin: sinInOut,
23092                 easeSinIn: sinIn,
23093                 easeSinOut: sinOut,
23094                 easeSinInOut: sinInOut,
23095                 easeExp: expInOut,
23096                 easeExpIn: expIn,
23097                 easeExpOut: expOut,
23098                 easeExpInOut: expInOut,
23099                 easeCircle: circleInOut,
23100                 easeCircleIn: circleIn,
23101                 easeCircleOut: circleOut,
23102                 easeCircleInOut: circleInOut,
23103                 easeBounce: bounceOut,
23104                 easeBounceIn: bounceIn,
23105                 easeBounceOut: bounceOut,
23106                 easeBounceInOut: bounceInOut,
23107                 easeBack: backInOut,
23108                 easeBackIn: backIn,
23109                 easeBackOut: backOut,
23110                 easeBackInOut: backInOut,
23111                 easeElastic: elasticOut,
23112                 easeElasticIn: elasticIn,
23113                 easeElasticOut: elasticOut,
23114                 easeElasticInOut: elasticInOut,
23115                 blob: blob,
23116                 buffer: buffer,
23117                 dsv: dsv,
23118                 csv: csv$1,
23119                 tsv: tsv$1,
23120                 image: image,
23121                 json: d3_json,
23122                 text: d3_text,
23123                 xml: d3_xml,
23124                 html: html,
23125                 svg: svg,
23126                 forceCenter: center$1,
23127                 forceCollide: collide,
23128                 forceLink: link,
23129                 forceManyBody: manyBody,
23130                 forceRadial: radial,
23131                 forceSimulation: simulation,
23132                 forceX: x$2,
23133                 forceY: y$2,
23134                 formatDefaultLocale: defaultLocale,
23135                 get format () { return format; },
23136                 get formatPrefix () { return formatPrefix; },
23137                 formatLocale: formatLocale,
23138                 formatSpecifier: formatSpecifier,
23139                 precisionFixed: precisionFixed,
23140                 precisionPrefix: precisionPrefix,
23141                 precisionRound: precisionRound,
23142                 geoArea: d3_geoArea,
23143                 geoBounds: d3_geoBounds,
23144                 geoCentroid: d3_geoCentroid,
23145                 geoCircle: circle,
23146                 geoClipAntimeridian: clipAntimeridian,
23147                 geoClipCircle: clipCircle,
23148                 geoClipExtent: extent$1,
23149                 geoClipRectangle: clipRectangle,
23150                 geoContains: contains$2,
23151                 geoDistance: distance,
23152                 geoGraticule: graticule,
23153                 geoGraticule10: graticule10,
23154                 geoInterpolate: interpolate$1,
23155                 geoLength: d3_geoLength,
23156                 geoPath: d3_geoPath,
23157                 geoAlbers: albers,
23158                 geoAlbersUsa: albersUsa,
23159                 geoAzimuthalEqualArea: azimuthalEqualArea,
23160                 geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
23161                 geoAzimuthalEquidistant: azimuthalEquidistant,
23162                 geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
23163                 geoConicConformal: conicConformal,
23164                 geoConicConformalRaw: conicConformalRaw,
23165                 geoConicEqualArea: conicEqualArea,
23166                 geoConicEqualAreaRaw: conicEqualAreaRaw,
23167                 geoConicEquidistant: conicEquidistant,
23168                 geoConicEquidistantRaw: conicEquidistantRaw,
23169                 geoEqualEarth: equalEarth,
23170                 geoEqualEarthRaw: equalEarthRaw,
23171                 geoEquirectangular: equirectangular,
23172                 geoEquirectangularRaw: equirectangularRaw,
23173                 geoGnomonic: gnomonic,
23174                 geoGnomonicRaw: gnomonicRaw,
23175                 geoIdentity: d3_geoIdentity,
23176                 geoProjection: projection,
23177                 geoProjectionMutator: projectionMutator,
23178                 geoMercator: mercator,
23179                 geoMercatorRaw: mercatorRaw,
23180                 geoNaturalEarth1: naturalEarth1,
23181                 geoNaturalEarth1Raw: naturalEarth1Raw,
23182                 geoOrthographic: orthographic,
23183                 geoOrthographicRaw: orthographicRaw,
23184                 geoStereographic: stereographic,
23185                 geoStereographicRaw: stereographicRaw,
23186                 geoTransverseMercator: transverseMercator,
23187                 geoTransverseMercatorRaw: transverseMercatorRaw,
23188                 geoRotation: rotation,
23189                 geoStream: d3_geoStream,
23190                 geoTransform: d3_geoTransform,
23191                 cluster: cluster,
23192                 hierarchy: hierarchy,
23193                 pack: index$1,
23194                 packSiblings: siblings,
23195                 packEnclose: enclose,
23196                 partition: partition,
23197                 stratify: stratify,
23198                 tree: tree,
23199                 treemap: index$2,
23200                 treemapBinary: binary,
23201                 treemapDice: treemapDice,
23202                 treemapSlice: treemapSlice,
23203                 treemapSliceDice: sliceDice,
23204                 treemapSquarify: squarify,
23205                 treemapResquarify: resquarify,
23206                 interpolate: d3_interpolate,
23207                 interpolateArray: array$2,
23208                 interpolateBasis: basis$1,
23209                 interpolateBasisClosed: basisClosed,
23210                 interpolateDate: date,
23211                 interpolateDiscrete: discrete,
23212                 interpolateHue: hue$1,
23213                 interpolateNumber: d3_interpolateNumber,
23214                 interpolateObject: object,
23215                 interpolateRound: interpolateRound,
23216                 interpolateString: interpolateString,
23217                 interpolateTransformCss: interpolateTransformCss,
23218                 interpolateTransformSvg: interpolateTransformSvg,
23219                 interpolateZoom: interpolateZoom,
23220                 interpolateRgb: d3_interpolateRgb,
23221                 interpolateRgbBasis: rgbBasis,
23222                 interpolateRgbBasisClosed: rgbBasisClosed,
23223                 interpolateHsl: hsl$2,
23224                 interpolateHslLong: hslLong,
23225                 interpolateLab: lab$1,
23226                 interpolateHcl: hcl$2,
23227                 interpolateHclLong: hclLong,
23228                 interpolateCubehelix: cubehelix$2,
23229                 interpolateCubehelixLong: cubehelixLong,
23230                 piecewise: piecewise,
23231                 quantize: d3_quantize,
23232                 path: path,
23233                 polygonArea: d3_polygonArea,
23234                 polygonCentroid: d3_polygonCentroid,
23235                 polygonHull: d3_polygonHull,
23236                 polygonContains: contains$3,
23237                 polygonLength: length$1,
23238                 quadtree: quadtree,
23239                 randomUniform: uniform,
23240                 randomNormal: normal,
23241                 randomLogNormal: logNormal,
23242                 randomBates: bates,
23243                 randomIrwinHall: irwinHall,
23244                 randomExponential: exponential$1,
23245                 scaleBand: band,
23246                 scalePoint: point$1,
23247                 scaleIdentity: identity$6,
23248                 scaleLinear: linear$2,
23249                 scaleLog: log$1,
23250                 scaleSymlog: symlog,
23251                 scaleOrdinal: ordinal,
23252                 scaleImplicit: implicit,
23253                 scalePow: pow$1,
23254                 scaleSqrt: sqrt$1,
23255                 scaleQuantile: quantile,
23256                 scaleQuantize: quantize,
23257                 scaleThreshold: threshold$1,
23258                 scaleTime: time,
23259                 scaleUtc: utcTime,
23260                 scaleSequential: sequential,
23261                 scaleSequentialLog: sequentialLog,
23262                 scaleSequentialPow: sequentialPow,
23263                 scaleSequentialSqrt: sequentialSqrt,
23264                 scaleSequentialSymlog: sequentialSymlog,
23265                 scaleSequentialQuantile: sequentialQuantile,
23266                 scaleDiverging: diverging,
23267                 scaleDivergingLog: divergingLog,
23268                 scaleDivergingPow: divergingPow,
23269                 scaleDivergingSqrt: divergingSqrt,
23270                 scaleDivergingSymlog: divergingSymlog,
23271                 tickFormat: tickFormat,
23272                 schemeCategory10: category10,
23273                 schemeAccent: Accent,
23274                 schemeDark2: Dark2,
23275                 schemePaired: Paired,
23276                 schemePastel1: Pastel1,
23277                 schemePastel2: Pastel2,
23278                 schemeSet1: Set1,
23279                 schemeSet2: Set2,
23280                 schemeSet3: Set3,
23281                 interpolateBrBG: BrBG,
23282                 schemeBrBG: scheme,
23283                 interpolatePRGn: PRGn,
23284                 schemePRGn: scheme$1,
23285                 interpolatePiYG: PiYG,
23286                 schemePiYG: scheme$2,
23287                 interpolatePuOr: PuOr,
23288                 schemePuOr: scheme$3,
23289                 interpolateRdBu: RdBu,
23290                 schemeRdBu: scheme$4,
23291                 interpolateRdGy: RdGy,
23292                 schemeRdGy: scheme$5,
23293                 interpolateRdYlBu: RdYlBu,
23294                 schemeRdYlBu: scheme$6,
23295                 interpolateRdYlGn: RdYlGn,
23296                 schemeRdYlGn: scheme$7,
23297                 interpolateSpectral: Spectral,
23298                 schemeSpectral: scheme$8,
23299                 interpolateBuGn: BuGn,
23300                 schemeBuGn: scheme$9,
23301                 interpolateBuPu: BuPu,
23302                 schemeBuPu: scheme$a,
23303                 interpolateGnBu: GnBu,
23304                 schemeGnBu: scheme$b,
23305                 interpolateOrRd: OrRd,
23306                 schemeOrRd: scheme$c,
23307                 interpolatePuBuGn: PuBuGn,
23308                 schemePuBuGn: scheme$d,
23309                 interpolatePuBu: PuBu,
23310                 schemePuBu: scheme$e,
23311                 interpolatePuRd: PuRd,
23312                 schemePuRd: scheme$f,
23313                 interpolateRdPu: RdPu,
23314                 schemeRdPu: scheme$g,
23315                 interpolateYlGnBu: YlGnBu,
23316                 schemeYlGnBu: scheme$h,
23317                 interpolateYlGn: YlGn,
23318                 schemeYlGn: scheme$i,
23319                 interpolateYlOrBr: YlOrBr,
23320                 schemeYlOrBr: scheme$j,
23321                 interpolateYlOrRd: YlOrRd,
23322                 schemeYlOrRd: scheme$k,
23323                 interpolateBlues: Blues,
23324                 schemeBlues: scheme$l,
23325                 interpolateGreens: Greens,
23326                 schemeGreens: scheme$m,
23327                 interpolateGreys: Greys,
23328                 schemeGreys: scheme$n,
23329                 interpolatePurples: Purples,
23330                 schemePurples: scheme$o,
23331                 interpolateReds: Reds,
23332                 schemeReds: scheme$p,
23333                 interpolateOranges: Oranges,
23334                 schemeOranges: scheme$q,
23335                 interpolateCubehelixDefault: cubehelix$3,
23336                 interpolateRainbow: rainbow,
23337                 interpolateWarm: warm,
23338                 interpolateCool: cool,
23339                 interpolateSinebow: sinebow,
23340                 interpolateViridis: viridis,
23341                 interpolateMagma: magma,
23342                 interpolateInferno: inferno,
23343                 interpolatePlasma: plasma,
23344                 create: create$5,
23345                 creator: creator,
23346                 local: local,
23347                 matcher: matcher,
23348                 mouse: d3_mouse,
23349                 namespace: namespace,
23350                 namespaces: namespaces,
23351                 clientPoint: point,
23352                 select: d3_select,
23353                 selectAll: d3_selectAll,
23354                 selection: selection,
23355                 selector: selector,
23356                 selectorAll: selectorAll,
23357                 style: styleValue,
23358                 touch: touch,
23359                 touches: d3_touches,
23360                 window: defaultView,
23361                 get event () { return event; },
23362                 customEvent: customEvent,
23363                 arc: arc,
23364                 area: area$1,
23365                 line: line,
23366                 pie: pie,
23367                 areaRadial: areaRadial,
23368                 radialArea: areaRadial,
23369                 lineRadial: lineRadial$1,
23370                 radialLine: lineRadial$1,
23371                 pointRadial: pointRadial,
23372                 linkHorizontal: linkHorizontal,
23373                 linkVertical: linkVertical,
23374                 linkRadial: linkRadial,
23375                 symbol: symbol,
23376                 symbols: symbols,
23377                 symbolCircle: circle$2,
23378                 symbolCross: cross$2,
23379                 symbolDiamond: diamond,
23380                 symbolSquare: square,
23381                 symbolStar: star,
23382                 symbolTriangle: triangle,
23383                 symbolWye: wye,
23384                 curveBasisClosed: basisClosed$1,
23385                 curveBasisOpen: basisOpen,
23386                 curveBasis: basis$2,
23387                 curveBundle: bundle,
23388                 curveCardinalClosed: cardinalClosed,
23389                 curveCardinalOpen: cardinalOpen,
23390                 curveCardinal: cardinal,
23391                 curveCatmullRomClosed: catmullRomClosed,
23392                 curveCatmullRomOpen: catmullRomOpen,
23393                 curveCatmullRom: catmullRom,
23394                 curveLinearClosed: linearClosed,
23395                 curveLinear: curveLinear,
23396                 curveMonotoneX: monotoneX,
23397                 curveMonotoneY: monotoneY,
23398                 curveNatural: natural,
23399                 curveStep: step,
23400                 curveStepAfter: stepAfter,
23401                 curveStepBefore: stepBefore,
23402                 stack: stack,
23403                 stackOffsetExpand: expand,
23404                 stackOffsetDiverging: diverging$1,
23405                 stackOffsetNone: none$1,
23406                 stackOffsetSilhouette: silhouette,
23407                 stackOffsetWiggle: wiggle,
23408                 stackOrderAppearance: appearance,
23409                 stackOrderAscending: ascending$2,
23410                 stackOrderDescending: descending$1,
23411                 stackOrderInsideOut: insideOut,
23412                 stackOrderNone: none$2,
23413                 stackOrderReverse: reverse,
23414                 timeInterval: newInterval,
23415                 timeMillisecond: millisecond,
23416                 timeMilliseconds: milliseconds,
23417                 utcMillisecond: millisecond,
23418                 utcMilliseconds: milliseconds,
23419                 timeSecond: second,
23420                 timeSeconds: seconds,
23421                 utcSecond: second,
23422                 utcSeconds: seconds,
23423                 timeMinute: minute,
23424                 timeMinutes: minutes,
23425                 timeHour: hour,
23426                 timeHours: hours,
23427                 timeDay: day,
23428                 timeDays: days,
23429                 timeWeek: sunday,
23430                 timeWeeks: sundays,
23431                 timeSunday: sunday,
23432                 timeSundays: sundays,
23433                 timeMonday: monday,
23434                 timeMondays: mondays,
23435                 timeTuesday: tuesday,
23436                 timeTuesdays: tuesdays,
23437                 timeWednesday: wednesday,
23438                 timeWednesdays: wednesdays,
23439                 timeThursday: thursday,
23440                 timeThursdays: thursdays,
23441                 timeFriday: friday,
23442                 timeFridays: fridays,
23443                 timeSaturday: saturday,
23444                 timeSaturdays: saturdays,
23445                 timeMonth: month,
23446                 timeMonths: months,
23447                 timeYear: year,
23448                 timeYears: years,
23449                 utcMinute: utcMinute,
23450                 utcMinutes: utcMinutes,
23451                 utcHour: utcHour,
23452                 utcHours: utcHours,
23453                 utcDay: utcDay,
23454                 utcDays: utcDays,
23455                 utcWeek: utcSunday,
23456                 utcWeeks: utcSundays,
23457                 utcSunday: utcSunday,
23458                 utcSundays: utcSundays,
23459                 utcMonday: utcMonday,
23460                 utcMondays: utcMondays,
23461                 utcTuesday: utcTuesday,
23462                 utcTuesdays: utcTuesdays,
23463                 utcWednesday: utcWednesday,
23464                 utcWednesdays: utcWednesdays,
23465                 utcThursday: utcThursday,
23466                 utcThursdays: utcThursdays,
23467                 utcFriday: utcFriday,
23468                 utcFridays: utcFridays,
23469                 utcSaturday: utcSaturday,
23470                 utcSaturdays: utcSaturdays,
23471                 utcMonth: utcMonth,
23472                 utcMonths: utcMonths,
23473                 utcYear: utcYear,
23474                 utcYears: utcYears,
23475                 timeFormatDefaultLocale: defaultLocale$1,
23476                 get timeFormat () { return timeFormat; },
23477                 get timeParse () { return timeParse; },
23478                 get utcFormat () { return utcFormat; },
23479                 get utcParse () { return utcParse; },
23480                 timeFormatLocale: formatLocale$1,
23481                 isoFormat: formatIso,
23482                 isoParse: parseIso,
23483                 now: now,
23484                 timer: timer,
23485                 timerFlush: timerFlush,
23486                 timeout: d3_timeout,
23487                 interval: interval$1,
23488                 transition: transition,
23489                 active: active,
23490                 interrupt: interrupt,
23491                 voronoi: voronoi,
23492                 zoom: d3_zoom,
23493                 zoomTransform: transform,
23494                 zoomIdentity: identity$8
23495         });
23496
23497         function actionAddEntity(way) {
23498             return function(graph) {
23499                 return graph.replace(way);
23500             };
23501         }
23502
23503         /*
23504         Order the nodes of a way in reverse order and reverse any direction dependent tags
23505         other than `oneway`. (We assume that correcting a backwards oneway is the primary
23506         reason for reversing a way.)
23507
23508         In addition, numeric-valued `incline` tags are negated.
23509
23510         The JOSM implementation was used as a guide, but transformations that were of unclear benefit
23511         or adjusted tags that don't seem to be used in practice were omitted.
23512
23513         References:
23514             http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
23515             http://wiki.openstreetmap.org/wiki/Key:direction#Steps
23516             http://wiki.openstreetmap.org/wiki/Key:incline
23517             http://wiki.openstreetmap.org/wiki/Route#Members
23518             http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
23519             http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
23520             http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
23521         */
23522         function actionReverse(wayID, options) {
23523             var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
23524             var numeric = /^([+\-]?)(?=[\d.])/;
23525             var turn_lanes = /^turn:lanes:?/;
23526             var keyReplacements = [
23527                 [/:right$/, ':left'],
23528                 [/:left$/, ':right'],
23529                 [/:forward$/, ':backward'],
23530                 [/:backward$/, ':forward'],
23531                 [/:right:/, ':left:'],
23532                 [/:left:/, ':right:'],
23533                 [/:forward:/, ':backward:'],
23534                 [/:backward:/, ':forward:']
23535             ];
23536             var valueReplacements = {
23537                 left: 'right',
23538                 right: 'left',
23539                 up: 'down',
23540                 down: 'up',
23541                 forward: 'backward',
23542                 backward: 'forward',
23543                 forwards: 'backward',
23544                 backwards: 'forward',
23545             };
23546             var roleReplacements = {
23547                 forward: 'backward',
23548                 backward: 'forward',
23549                 forwards: 'backward',
23550                 backwards: 'forward'
23551             };
23552             var onewayReplacements = {
23553                 yes: '-1',
23554                 '1': '-1',
23555                 '-1': 'yes'
23556             };
23557
23558
23559             function reverseKey(key) {
23560                 for (var i = 0; i < keyReplacements.length; ++i) {
23561                     var replacement = keyReplacements[i];
23562                     if (replacement[0].test(key)) {
23563                         return key.replace(replacement[0], replacement[1]);
23564                     }
23565                 }
23566                 return key;
23567             }
23568
23569
23570             function reverseValue(key, value) {
23571                 if (ignoreKey.test(key)) return value;
23572
23573                 // Turn lanes are left/right to key (not way) direction - #5674
23574                 if (turn_lanes.test(key)) {
23575                     return value;
23576                 } else if (key === 'incline' && numeric.test(value)) {
23577                     return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
23578                 } else if (options && options.reverseOneway && key === 'oneway') {
23579                     return onewayReplacements[value] || value;
23580                 } else {
23581                     return valueReplacements[value] || value;
23582                 }
23583             }
23584
23585
23586             // Reverse the direction of tags attached to the nodes - #3076
23587             function reverseNodeTags(graph, nodeIDs) {
23588                 for (var i = 0; i < nodeIDs.length; i++) {
23589                     var node = graph.hasEntity(nodeIDs[i]);
23590                     if (!node || !Object.keys(node.tags).length) continue;
23591
23592                     var tags = {};
23593                     for (var key in node.tags) {
23594                         tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
23595                     }
23596                     graph = graph.replace(node.update({tags: tags}));
23597                 }
23598                 return graph;
23599             }
23600
23601
23602             return function(graph) {
23603                 var way = graph.entity(wayID);
23604                 var nodes = way.nodes.slice().reverse();
23605                 var tags = {};
23606                 var role;
23607
23608                 for (var key in way.tags) {
23609                     tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
23610                 }
23611
23612                 graph.parentRelations(way).forEach(function(relation) {
23613                     relation.members.forEach(function(member, index) {
23614                         if (member.id === way.id && (role = roleReplacements[member.role])) {
23615                             relation = relation.updateMember({role: role}, index);
23616                             graph = graph.replace(relation);
23617                         }
23618                     });
23619                 });
23620
23621                 // Reverse any associated directions on nodes on the way and then replace
23622                 // the way itself with the reversed node ids and updated way tags
23623                 return reverseNodeTags(graph, nodes)
23624                     .replace(way.update({nodes: nodes, tags: tags}));
23625             };
23626         }
23627
23628         function osmIsInterestingTag(key) {
23629             return key !== 'attribution' &&
23630                 key !== 'created_by' &&
23631                 key !== 'source' &&
23632                 key !== 'odbl' &&
23633                 key.indexOf('tiger:') !== 0;
23634         }
23635
23636         var osmAreaKeys = {};
23637         function osmSetAreaKeys(value) {
23638             osmAreaKeys = value;
23639         }
23640
23641         // Tags that indicate a node can be a standalone point
23642         // e.g. { amenity: { bar: true, parking: true, ... } ... }
23643         var osmPointTags = {};
23644         function osmSetPointTags(value) {
23645             osmPointTags = value;
23646         }
23647         // Tags that indicate a node can be part of a way
23648         // e.g. { amenity: { parking: true, ... }, highway: { stop: true ... } ... }
23649         var osmVertexTags = {};
23650         function osmSetVertexTags(value) {
23651             osmVertexTags = value;
23652         }
23653
23654         function osmNodeGeometriesForTags(nodeTags) {
23655             var geometries = {};
23656             for (var key in nodeTags) {
23657                 if (osmPointTags[key] &&
23658                     (osmPointTags[key]['*'] || osmPointTags[key][nodeTags[key]])) {
23659                     geometries.point = true;
23660                 }
23661                 if (osmVertexTags[key] &&
23662                     (osmVertexTags[key]['*'] || osmVertexTags[key][nodeTags[key]])) {
23663                     geometries.vertex = true;
23664                 }
23665                 // break early if both are already supported
23666                 if (geometries.point && geometries.vertex) break;
23667             }
23668             return geometries;
23669         }
23670
23671         var osmOneWayTags = {
23672             'aerialway': {
23673                 'chair_lift': true,
23674                 'drag_lift': true,
23675                 'j-bar': true,
23676                 'magic_carpet': true,
23677                 'mixed_lift': true,
23678                 'platter': true,
23679                 'rope_tow': true,
23680                 't-bar': true,
23681                 'zip_line': true
23682             },
23683             'highway': {
23684                 'motorway': true
23685             },
23686             'junction': {
23687                 'circular': true,
23688                 'roundabout': true
23689             },
23690             'man_made': {
23691                 'piste:halfpipe': true
23692             },
23693             'piste:type': {
23694                 'downhill': true,
23695                 'sled': true,
23696                 'yes': true
23697             },
23698             'waterway': {
23699                 'canal': true,
23700                 'ditch': true,
23701                 'drain': true,
23702                 'river': true,
23703                 'stream': true
23704             }
23705         };
23706
23707
23708         var osmPavedTags = {
23709             'surface': {
23710                 'paved': true,
23711                 'asphalt': true,
23712                 'concrete': true,
23713                 'concrete:lanes': true,
23714                 'concrete:plates': true
23715             },
23716             'tracktype': {
23717                 'grade1': true
23718             }
23719         };
23720
23721         var osmRightSideIsInsideTags = {
23722             'natural': {
23723                 'cliff': true,
23724                 'coastline': 'coastline',
23725             },
23726             'barrier': {
23727                 'retaining_wall': true,
23728                 'kerb': true,
23729                 'guard_rail': true,
23730                 'city_wall': true,
23731             },
23732             'man_made': {
23733                 'embankment': true
23734             }
23735         };
23736
23737         // "highway" tag values for pedestrian or vehicle right-of-ways that make up the routable network
23738         // (does not include `raceway`)
23739         var osmRoutableHighwayTagValues = {
23740             motorway: true, trunk: true, primary: true, secondary: true, tertiary: true, residential: true,
23741             motorway_link: true, trunk_link: true, primary_link: true, secondary_link: true, tertiary_link: true,
23742             unclassified: true, road: true, service: true, track: true, living_street: true, bus_guideway: true,
23743             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23744         };
23745         // "highway" tag values that generally do not allow motor vehicles
23746         var osmPathHighwayTagValues = {
23747             path: true, footway: true, cycleway: true, bridleway: true, pedestrian: true, corridor: true, steps: true
23748         };
23749
23750         // "railway" tag values representing existing railroad tracks (purposely does not include 'abandoned')
23751         var osmRailwayTrackTagValues = {
23752             rail: true, light_rail: true, tram: true, subway: true,
23753             monorail: true, funicular: true, miniature: true, narrow_gauge: true,
23754             disused: true, preserved: true
23755         };
23756
23757         // "waterway" tag values for line features representing water flow
23758         var osmFlowingWaterwayTagValues = {
23759             canal: true, ditch: true, drain: true, river: true, stream: true
23760         };
23761
23762         // constants
23763         var TAU = 2 * Math.PI;
23764         var EQUATORIAL_RADIUS = 6356752.314245179;
23765         var POLAR_RADIUS = 6378137.0;
23766
23767
23768         function geoLatToMeters(dLat) {
23769             return dLat * (TAU * POLAR_RADIUS / 360);
23770         }
23771
23772
23773         function geoLonToMeters(dLon, atLat) {
23774             return Math.abs(atLat) >= 90 ? 0 :
23775                 dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
23776         }
23777
23778
23779         function geoMetersToLat(m) {
23780             return m / (TAU * POLAR_RADIUS / 360);
23781         }
23782
23783
23784         function geoMetersToLon(m, atLat) {
23785             return Math.abs(atLat) >= 90 ? 0 :
23786                 m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
23787         }
23788
23789
23790         function geoMetersToOffset(meters, tileSize) {
23791             tileSize = tileSize || 256;
23792             return [
23793                 meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
23794                 -meters[1] * tileSize / (TAU * POLAR_RADIUS)
23795             ];
23796         }
23797
23798
23799         function geoOffsetToMeters(offset, tileSize) {
23800             tileSize = tileSize || 256;
23801             return [
23802                 offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
23803                 -offset[1] * TAU * POLAR_RADIUS / tileSize
23804             ];
23805         }
23806
23807
23808         // Equirectangular approximation of spherical distances on Earth
23809         function geoSphericalDistance(a, b) {
23810             var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
23811             var y = geoLatToMeters(a[1] - b[1]);
23812             return Math.sqrt((x * x) + (y * y));
23813         }
23814
23815
23816         // scale to zoom
23817         function geoScaleToZoom(k, tileSize) {
23818             tileSize = tileSize || 256;
23819             var log2ts = Math.log(tileSize) * Math.LOG2E;
23820             return Math.log(k * TAU) / Math.LN2 - log2ts;
23821         }
23822
23823
23824         // zoom to scale
23825         function geoZoomToScale(z, tileSize) {
23826             tileSize = tileSize || 256;
23827             return tileSize * Math.pow(2, z) / TAU;
23828         }
23829
23830
23831         // returns info about the node from `nodes` closest to the given `point`
23832         function geoSphericalClosestNode(nodes, point) {
23833             var minDistance = Infinity, distance;
23834             var indexOfMin;
23835
23836             for (var i in nodes) {
23837                 distance = geoSphericalDistance(nodes[i].loc, point);
23838                 if (distance < minDistance) {
23839                     minDistance = distance;
23840                     indexOfMin = i;
23841                 }
23842             }
23843
23844             if (indexOfMin !== undefined) {
23845                 return { index: indexOfMin, distance: minDistance, node: nodes[indexOfMin] };
23846             } else {
23847                 return null;
23848             }
23849         }
23850
23851         function geoExtent(min, max) {
23852             if (!(this instanceof geoExtent)) {
23853                 return new geoExtent(min, max);
23854             } else if (min instanceof geoExtent) {
23855                 return min;
23856             } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
23857                 this[0] = min[0];
23858                 this[1] = min[1];
23859             } else {
23860                 this[0] = min        || [ Infinity,  Infinity];
23861                 this[1] = max || min || [-Infinity, -Infinity];
23862             }
23863         }
23864
23865         geoExtent.prototype = new Array(2);
23866
23867         Object.assign(geoExtent.prototype, {
23868
23869             equals: function (obj) {
23870                 return this[0][0] === obj[0][0] &&
23871                     this[0][1] === obj[0][1] &&
23872                     this[1][0] === obj[1][0] &&
23873                     this[1][1] === obj[1][1];
23874             },
23875
23876
23877             extend: function(obj) {
23878                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23879                 return geoExtent(
23880                     [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
23881                     [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
23882                 );
23883             },
23884
23885
23886             _extend: function(extent) {
23887                 this[0][0] = Math.min(extent[0][0], this[0][0]);
23888                 this[0][1] = Math.min(extent[0][1], this[0][1]);
23889                 this[1][0] = Math.max(extent[1][0], this[1][0]);
23890                 this[1][1] = Math.max(extent[1][1], this[1][1]);
23891             },
23892
23893
23894             area: function() {
23895                 return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
23896             },
23897
23898
23899             center: function() {
23900                 return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
23901             },
23902
23903
23904             rectangle: function() {
23905                 return [this[0][0], this[0][1], this[1][0], this[1][1]];
23906             },
23907
23908
23909             bbox: function() {
23910                 return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
23911             },
23912
23913
23914             polygon: function() {
23915                 return [
23916                     [this[0][0], this[0][1]],
23917                     [this[0][0], this[1][1]],
23918                     [this[1][0], this[1][1]],
23919                     [this[1][0], this[0][1]],
23920                     [this[0][0], this[0][1]]
23921                 ];
23922             },
23923
23924
23925             contains: function(obj) {
23926                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23927                 return obj[0][0] >= this[0][0] &&
23928                        obj[0][1] >= this[0][1] &&
23929                        obj[1][0] <= this[1][0] &&
23930                        obj[1][1] <= this[1][1];
23931             },
23932
23933
23934             intersects: function(obj) {
23935                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23936                 return obj[0][0] <= this[1][0] &&
23937                        obj[0][1] <= this[1][1] &&
23938                        obj[1][0] >= this[0][0] &&
23939                        obj[1][1] >= this[0][1];
23940             },
23941
23942
23943             intersection: function(obj) {
23944                 if (!this.intersects(obj)) return new geoExtent();
23945                 return new geoExtent(
23946                     [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
23947                     [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
23948                 );
23949             },
23950
23951
23952             percentContainedIn: function(obj) {
23953                 if (!(obj instanceof geoExtent)) obj = new geoExtent(obj);
23954                 var a1 = this.intersection(obj).area();
23955                 var a2 = this.area();
23956
23957                 if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
23958                     return 0;
23959                 } else {
23960                     return a1 / a2;
23961                 }
23962             },
23963
23964
23965             padByMeters: function(meters) {
23966                 var dLat = geoMetersToLat(meters);
23967                 var dLon = geoMetersToLon(meters, this.center()[1]);
23968                 return geoExtent(
23969                     [this[0][0] - dLon, this[0][1] - dLat],
23970                     [this[1][0] + dLon, this[1][1] + dLat]
23971                 );
23972             },
23973
23974
23975             toParam: function() {
23976                 return this.rectangle().join(',');
23977             }
23978
23979         });
23980
23981         // vector equals
23982         function geoVecEqual(a, b, epsilon) {
23983             if (epsilon) {
23984                 return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
23985             } else {
23986                 return (a[0] === b[0]) && (a[1] === b[1]);
23987             }
23988         }
23989
23990         // vector addition
23991         function geoVecAdd(a, b) {
23992             return [ a[0] + b[0], a[1] + b[1] ];
23993         }
23994
23995         // vector subtraction
23996         function geoVecSubtract(a, b) {
23997             return [ a[0] - b[0], a[1] - b[1] ];
23998         }
23999
24000         // vector scaling
24001         function geoVecScale(a, mag) {
24002             return [ a[0] * mag, a[1] * mag ];
24003         }
24004
24005         // vector rounding (was: geoRoundCoordinates)
24006         function geoVecFloor(a) {
24007             return [ Math.floor(a[0]), Math.floor(a[1]) ];
24008         }
24009
24010         // linear interpolation
24011         function geoVecInterp(a, b, t) {
24012             return [
24013                 a[0] + (b[0] - a[0]) * t,
24014                 a[1] + (b[1] - a[1]) * t
24015             ];
24016         }
24017
24018         // http://jsperf.com/id-dist-optimization
24019         function geoVecLength(a, b) {
24020             b = b || [0, 0];
24021             var x = a[0] - b[0];
24022             var y = a[1] - b[1];
24023             return Math.sqrt((x * x) + (y * y));
24024         }
24025
24026         // get a unit vector
24027         function geoVecNormalize(a) {
24028             var length = Math.sqrt((a[0] * a[0]) + (a[1] * a[1]));
24029             if (length !== 0) {
24030                 return geoVecScale(a, 1 / length);
24031             }
24032             return [0, 0];
24033         }
24034
24035         // Return the counterclockwise angle in the range (-pi, pi)
24036         // between the positive X axis and the line intersecting a and b.
24037         function geoVecAngle(a, b) {
24038             return Math.atan2(b[1] - a[1], b[0] - a[0]);
24039         }
24040
24041         // dot product
24042         function geoVecDot(a, b, origin) {
24043             origin = origin || [0, 0];
24044             var p = geoVecSubtract(a, origin);
24045             var q = geoVecSubtract(b, origin);
24046             return (p[0]) * (q[0]) + (p[1]) * (q[1]);
24047         }
24048
24049         // normalized dot product
24050         function geoVecNormalizedDot(a, b, origin) {
24051             origin = origin || [0, 0];
24052             var p = geoVecNormalize(geoVecSubtract(a, origin));
24053             var q = geoVecNormalize(geoVecSubtract(b, origin));
24054             return geoVecDot(p, q);
24055         }
24056
24057         // 2D cross product of OA and OB vectors, returns magnitude of Z vector
24058         // Returns a positive value, if OAB makes a counter-clockwise turn,
24059         // negative for clockwise turn, and zero if the points are collinear.
24060         function geoVecCross(a, b, origin) {
24061             origin = origin || [0, 0];
24062             var p = geoVecSubtract(a, origin);
24063             var q = geoVecSubtract(b, origin);
24064             return (p[0]) * (q[1]) - (p[1]) * (q[0]);
24065         }
24066
24067
24068         // find closest orthogonal projection of point onto points array
24069         function geoVecProject(a, points) {
24070             var min = Infinity;
24071             var idx;
24072             var target;
24073
24074             for (var i = 0; i < points.length - 1; i++) {
24075                 var o = points[i];
24076                 var s = geoVecSubtract(points[i + 1], o);
24077                 var v = geoVecSubtract(a, o);
24078                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24079                 var p;
24080
24081                 if (proj < 0) {
24082                     p = o;
24083                 } else if (proj > 1) {
24084                     p = points[i + 1];
24085                 } else {
24086                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24087                 }
24088
24089                 var dist = geoVecLength(p, a);
24090                 if (dist < min) {
24091                     min = dist;
24092                     idx = i + 1;
24093                     target = p;
24094                 }
24095             }
24096
24097             if (idx !== undefined) {
24098                 return { index: idx, distance: min, target: target };
24099             } else {
24100                 return null;
24101             }
24102         }
24103
24104         // Return the counterclockwise angle in the range (-pi, pi)
24105         // between the positive X axis and the line intersecting a and b.
24106         function geoAngle(a, b, projection) {
24107             return geoVecAngle(projection(a.loc), projection(b.loc));
24108         }
24109
24110
24111         function geoEdgeEqual(a, b) {
24112             return (a[0] === b[0] && a[1] === b[1]) ||
24113                 (a[0] === b[1] && a[1] === b[0]);
24114         }
24115
24116
24117         // Rotate all points counterclockwise around a pivot point by given angle
24118         function geoRotate(points, angle, around) {
24119             return points.map(function(point) {
24120                 var radial = geoVecSubtract(point, around);
24121                 return [
24122                     radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
24123                     radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
24124                 ];
24125             });
24126         }
24127
24128
24129         // Choose the edge with the minimal distance from `point` to its orthogonal
24130         // projection onto that edge, if such a projection exists, or the distance to
24131         // the closest vertex on that edge. Returns an object with the `index` of the
24132         // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
24133         function geoChooseEdge(nodes, point, projection, activeID) {
24134             var dist = geoVecLength;
24135             var points = nodes.map(function(n) { return projection(n.loc); });
24136             var ids = nodes.map(function(n) { return n.id; });
24137             var min = Infinity;
24138             var idx;
24139             var loc;
24140
24141             for (var i = 0; i < points.length - 1; i++) {
24142                 if (ids[i] === activeID || ids[i + 1] === activeID) continue;
24143
24144                 var o = points[i];
24145                 var s = geoVecSubtract(points[i + 1], o);
24146                 var v = geoVecSubtract(point, o);
24147                 var proj = geoVecDot(v, s) / geoVecDot(s, s);
24148                 var p;
24149
24150                 if (proj < 0) {
24151                     p = o;
24152                 } else if (proj > 1) {
24153                     p = points[i + 1];
24154                 } else {
24155                     p = [o[0] + proj * s[0], o[1] + proj * s[1]];
24156                 }
24157
24158                 var d = dist(p, point);
24159                 if (d < min) {
24160                     min = d;
24161                     idx = i + 1;
24162                     loc = projection.invert(p);
24163                 }
24164             }
24165
24166             if (idx !== undefined) {
24167                 return { index: idx, distance: min, loc: loc };
24168             } else {
24169                 return null;
24170             }
24171         }
24172
24173
24174         // Test active (dragged or drawing) segments against inactive segments
24175         // This is used to test e.g. multipolygon rings that cross
24176         // `activeNodes` is the ring containing the activeID being dragged.
24177         // `inactiveNodes` is the other ring to test against
24178         function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
24179             var actives = [];
24180             var inactives = [];
24181             var j, k, n1, n2, segment;
24182
24183             // gather active segments (only segments in activeNodes that contain the activeID)
24184             for (j = 0; j < activeNodes.length - 1; j++) {
24185                 n1 = activeNodes[j];
24186                 n2 = activeNodes[j+1];
24187                 segment = [n1.loc, n2.loc];
24188                 if (n1.id === activeID || n2.id === activeID) {
24189                     actives.push(segment);
24190                 }
24191             }
24192
24193             // gather inactive segments
24194             for (j = 0; j < inactiveNodes.length - 1; j++) {
24195                 n1 = inactiveNodes[j];
24196                 n2 = inactiveNodes[j+1];
24197                 segment = [n1.loc, n2.loc];
24198                 inactives.push(segment);
24199             }
24200
24201             // test
24202             for (j = 0; j < actives.length; j++) {
24203                 for (k = 0; k < inactives.length; k++) {
24204                     var p = actives[j];
24205                     var q = inactives[k];
24206                     var hit = geoLineIntersection(p, q);
24207                     if (hit) {
24208                         return true;
24209                     }
24210                 }
24211             }
24212
24213             return false;
24214         }
24215
24216
24217         // Test active (dragged or drawing) segments against inactive segments
24218         // This is used to test whether a way intersects with itself.
24219         function geoHasSelfIntersections(nodes, activeID) {
24220             var actives = [];
24221             var inactives = [];
24222             var j, k;
24223
24224             // group active and passive segments along the nodes
24225             for (j = 0; j < nodes.length - 1; j++) {
24226                 var n1 = nodes[j];
24227                 var n2 = nodes[j+1];
24228                 var segment = [n1.loc, n2.loc];
24229                 if (n1.id === activeID || n2.id === activeID) {
24230                     actives.push(segment);
24231                 } else {
24232                     inactives.push(segment);
24233                 }
24234             }
24235
24236             // test
24237             for (j = 0; j < actives.length; j++) {
24238                 for (k = 0; k < inactives.length; k++) {
24239                     var p = actives[j];
24240                     var q = inactives[k];
24241                     // skip if segments share an endpoint
24242                     if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
24243                         geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
24244                         continue;
24245                     }
24246
24247                     var hit = geoLineIntersection(p, q);
24248                     if (hit) {
24249                         var epsilon = 1e-8;
24250                         // skip if the hit is at the segment's endpoint
24251                         if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
24252                             geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
24253                             continue;
24254                         } else {
24255                             return true;
24256                         }
24257                     }
24258                 }
24259             }
24260
24261             return false;
24262         }
24263
24264
24265         // Return the intersection point of 2 line segments.
24266         // From https://github.com/pgkelley4/line-segments-intersect
24267         // This uses the vector cross product approach described below:
24268         //  http://stackoverflow.com/a/565282/786339
24269         function geoLineIntersection(a, b) {
24270             var p = [a[0][0], a[0][1]];
24271             var p2 = [a[1][0], a[1][1]];
24272             var q = [b[0][0], b[0][1]];
24273             var q2 = [b[1][0], b[1][1]];
24274             var r = geoVecSubtract(p2, p);
24275             var s = geoVecSubtract(q2, q);
24276             var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
24277             var denominator = geoVecCross(r, s);
24278
24279             if (uNumerator && denominator) {
24280                 var u = uNumerator / denominator;
24281                 var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
24282
24283                 if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
24284                     return geoVecInterp(p, p2, t);
24285                 }
24286             }
24287
24288             return null;
24289         }
24290
24291
24292         function geoPathIntersections(path1, path2) {
24293             var intersections = [];
24294             for (var i = 0; i < path1.length - 1; i++) {
24295                 for (var j = 0; j < path2.length - 1; j++) {
24296                     var a = [ path1[i], path1[i+1] ];
24297                     var b = [ path2[j], path2[j+1] ];
24298                     var hit = geoLineIntersection(a, b);
24299                     if (hit) {
24300                         intersections.push(hit);
24301                     }
24302                 }
24303             }
24304             return intersections;
24305         }
24306
24307         function geoPathHasIntersections(path1, path2) {
24308             for (var i = 0; i < path1.length - 1; i++) {
24309                 for (var j = 0; j < path2.length - 1; j++) {
24310                     var a = [ path1[i], path1[i+1] ];
24311                     var b = [ path2[j], path2[j+1] ];
24312                     var hit = geoLineIntersection(a, b);
24313                     if (hit) {
24314                         return true;
24315                     }
24316                 }
24317             }
24318             return false;
24319         }
24320
24321
24322         // Return whether point is contained in polygon.
24323         //
24324         // `point` should be a 2-item array of coordinates.
24325         // `polygon` should be an array of 2-item arrays of coordinates.
24326         //
24327         // From https://github.com/substack/point-in-polygon.
24328         // ray-casting algorithm based on
24329         // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
24330         //
24331         function geoPointInPolygon(point, polygon) {
24332             var x = point[0];
24333             var y = point[1];
24334             var inside = false;
24335
24336             for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
24337                 var xi = polygon[i][0];
24338                 var yi = polygon[i][1];
24339                 var xj = polygon[j][0];
24340                 var yj = polygon[j][1];
24341
24342                 var intersect = ((yi > y) !== (yj > y)) &&
24343                     (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
24344                 if (intersect) inside = !inside;
24345             }
24346
24347             return inside;
24348         }
24349
24350
24351         function geoPolygonContainsPolygon(outer, inner) {
24352             return inner.every(function(point) {
24353                 return geoPointInPolygon(point, outer);
24354             });
24355         }
24356
24357
24358         function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
24359             function testPoints(outer, inner) {
24360                 return inner.some(function(point) {
24361                     return geoPointInPolygon(point, outer);
24362                 });
24363             }
24364
24365            return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
24366         }
24367
24368
24369         // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
24370         // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
24371         function geoGetSmallestSurroundingRectangle(points) {
24372             var hull = d3_polygonHull(points);
24373             var centroid = d3_polygonCentroid(hull);
24374             var minArea = Infinity;
24375             var ssrExtent = [];
24376             var ssrAngle = 0;
24377             var c1 = hull[0];
24378
24379             for (var i = 0; i <= hull.length - 1; i++) {
24380                 var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1];
24381                 var angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]);
24382                 var poly = geoRotate(hull, -angle, centroid);
24383                 var extent = poly.reduce(function(extent, point) {
24384                     return extent.extend(geoExtent(point));
24385                 }, geoExtent());
24386
24387                 var area = extent.area();
24388                 if (area < minArea) {
24389                     minArea = area;
24390                     ssrExtent = extent;
24391                     ssrAngle = angle;
24392                 }
24393                 c1 = c2;
24394             }
24395
24396             return {
24397                 poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
24398                 angle: ssrAngle
24399             };
24400         }
24401
24402
24403         function geoPathLength(path) {
24404             var length = 0;
24405             for (var i = 0; i < path.length - 1; i++) {
24406                 length += geoVecLength(path[i], path[i + 1]);
24407             }
24408             return length;
24409         }
24410
24411
24412         // If the given point is at the edge of the padded viewport,
24413         // return a vector that will nudge the viewport in that direction
24414         function geoViewportEdge(point, dimensions) {
24415             var pad = [80, 20, 50, 20];   // top, right, bottom, left
24416             var x = 0;
24417             var y = 0;
24418
24419             if (point[0] > dimensions[0] - pad[1])
24420                 x = -10;
24421             if (point[0] < pad[3])
24422                 x = 10;
24423             if (point[1] > dimensions[1] - pad[2])
24424                 y = -10;
24425             if (point[1] < pad[0])
24426                 y = 10;
24427
24428             if (x || y) {
24429                 return [x, y];
24430             } else {
24431                 return null;
24432             }
24433         }
24434
24435         /*
24436             Bypasses features of D3's default projection stream pipeline that are unnecessary:
24437             * Antimeridian clipping
24438             * Spherical rotation
24439             * Resampling
24440         */
24441         function geoRawMercator() {
24442             var project = mercatorRaw;
24443             var k = 512 / Math.PI; // scale
24444             var x = 0;
24445             var y = 0; // translate
24446             var clipExtent = [[0, 0], [0, 0]];
24447
24448
24449             function projection(point) {
24450                 point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
24451                 return [point[0] * k + x, y - point[1] * k];
24452             }
24453
24454
24455             projection.invert = function(point) {
24456                 point = project.invert((point[0] - x) / k, (y - point[1]) / k);
24457                 return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
24458             };
24459
24460
24461             projection.scale = function(_) {
24462                 if (!arguments.length) return k;
24463                 k = +_;
24464                 return projection;
24465             };
24466
24467
24468             projection.translate = function(_) {
24469                 if (!arguments.length) return [x, y];
24470                 x = +_[0];
24471                 y = +_[1];
24472                 return projection;
24473             };
24474
24475
24476             projection.clipExtent = function(_) {
24477                 if (!arguments.length) return clipExtent;
24478                 clipExtent = _;
24479                 return projection;
24480             };
24481
24482
24483             projection.transform = function(obj) {
24484                 if (!arguments.length) return identity$8.translate(x, y).scale(k);
24485                 x = +obj.x;
24486                 y = +obj.y;
24487                 k = +obj.k;
24488                 return projection;
24489             };
24490
24491
24492             projection.stream = d3_geoTransform({
24493                 point: function(x, y) {
24494                     var vec = projection([x, y]);
24495                     this.stream.point(vec[0], vec[1]);
24496                 }
24497             }).stream;
24498
24499
24500             return projection;
24501         }
24502
24503         function geoOrthoNormalizedDotProduct(a, b, origin) {
24504             if (geoVecEqual(origin, a) || geoVecEqual(origin, b)) {
24505                 return 1;  // coincident points, treat as straight and try to remove
24506             }
24507             return geoVecNormalizedDot(a, b, origin);
24508         }
24509
24510
24511         function geoOrthoFilterDotProduct(dotp, epsilon, lowerThreshold, upperThreshold, allowStraightAngles) {
24512             var val = Math.abs(dotp);
24513             if (val < epsilon) {
24514                 return 0;      // already orthogonal
24515             } else if (allowStraightAngles && Math.abs(val-1) < epsilon) {
24516                 return 0;      // straight angle, which is okay in this case
24517             } else if (val < lowerThreshold || val > upperThreshold) {
24518                 return dotp;   // can be adjusted
24519             } else {
24520                 return null;   // ignore vertex
24521             }
24522         }
24523
24524
24525         function geoOrthoCalcScore(points, isClosed, epsilon, threshold) {
24526             var score = 0;
24527             var first = isClosed ? 0 : 1;
24528             var last = isClosed ? points.length : points.length - 1;
24529             var coords = points.map(function(p) { return p.coord; });
24530
24531             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24532             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24533
24534             for (var i = first; i < last; i++) {
24535                 var a = coords[(i - 1 + coords.length) % coords.length];
24536                 var origin = coords[i];
24537                 var b = coords[(i + 1) % coords.length];
24538
24539                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold);
24540                 if (dotp === null) continue;    // ignore vertex
24541                 score = score + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
24542             }
24543
24544             return score;
24545         }
24546
24547         // returns the maximum angle less than `lessThan` between the actual corner and a 0° or 90° corner
24548         function geoOrthoMaxOffsetAngle(coords, isClosed, lessThan) {
24549             var max = -Infinity;
24550
24551             var first = isClosed ? 0 : 1;
24552             var last = isClosed ? coords.length : coords.length - 1;
24553
24554             for (var i = first; i < last; i++) {
24555                 var a = coords[(i - 1 + coords.length) % coords.length];
24556                 var origin = coords[i];
24557                 var b = coords[(i + 1) % coords.length];
24558                 var normalizedDotP = geoOrthoNormalizedDotProduct(a, b, origin);
24559
24560                 var angle = Math.acos(Math.abs(normalizedDotP)) * 180 / Math.PI;
24561
24562                 if (angle > 45) angle = 90 - angle;
24563
24564                 if (angle >= lessThan) continue;
24565
24566                 if (angle > max) max = angle;
24567             }
24568
24569             if (max === -Infinity) return null;
24570
24571             return max;
24572         }
24573
24574
24575         // similar to geoOrthoCalcScore, but returns quickly if there is something to do
24576         function geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles) {
24577             var score = null;
24578             var first = isClosed ? 0 : 1;
24579             var last = isClosed ? coords.length : coords.length - 1;
24580
24581             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
24582             var upperThreshold = Math.cos(threshold * Math.PI / 180);
24583
24584             for (var i = first; i < last; i++) {
24585                 var a = coords[(i - 1 + coords.length) % coords.length];
24586                 var origin = coords[i];
24587                 var b = coords[(i + 1) % coords.length];
24588
24589                 var dotp = geoOrthoFilterDotProduct(geoOrthoNormalizedDotProduct(a, b, origin), epsilon, lowerThreshold, upperThreshold, allowStraightAngles);
24590                 if (dotp === null) continue;        // ignore vertex
24591                 if (Math.abs(dotp) > 0) return 1;   // something to do
24592                 score = 0;                          // already square
24593             }
24594
24595             return score;
24596         }
24597
24598         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"]];
24599
24600         var wikibooks$1 = /*#__PURE__*/Object.freeze({
24601                 'default': wikibooks
24602         });
24603
24604         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"]];
24605
24606         var wikinews$1 = /*#__PURE__*/Object.freeze({
24607                 'default': wikinews
24608         });
24609
24610         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"]];
24611
24612         var wikiquote$1 = /*#__PURE__*/Object.freeze({
24613                 'default': wikiquote
24614         });
24615
24616         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"]];
24617
24618         var wikiversity$1 = /*#__PURE__*/Object.freeze({
24619                 'default': wikiversity
24620         });
24621
24622         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"]];
24623
24624         var wikivoyage$1 = /*#__PURE__*/Object.freeze({
24625                 'default': wikivoyage
24626         });
24627
24628         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"]];
24629
24630         var wiktionary$1 = /*#__PURE__*/Object.freeze({
24631                 'default': wiktionary
24632         });
24633
24634         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"]];
24635
24636         var wikipedia$1 = /*#__PURE__*/Object.freeze({
24637                 'default': wikipedia
24638         });
24639
24640         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"]];
24641
24642         var wikisource$1 = /*#__PURE__*/Object.freeze({
24643                 'default': wikisource
24644         });
24645
24646         getCjsExportFromNamespace(wikibooks$1);
24647
24648         getCjsExportFromNamespace(wikinews$1);
24649
24650         getCjsExportFromNamespace(wikiquote$1);
24651
24652         getCjsExportFromNamespace(wikiversity$1);
24653
24654         getCjsExportFromNamespace(wikivoyage$1);
24655
24656         getCjsExportFromNamespace(wiktionary$1);
24657
24658         var require$$6 = getCjsExportFromNamespace(wikipedia$1);
24659
24660         getCjsExportFromNamespace(wikisource$1);
24661
24662         var wikipedia$2 = require$$6;
24663
24664         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"]]}];
24665
24666         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:"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:"entrance"},replace:{entrance:"*"}},{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":"yes"}},{old:{cuisine:"halal"},replace:{"diet:halal":"yes"}},{old:{cuisine:"kosher"},replace:{"diet:kosher":"yes"}},{old:{cuisine:"vegan"},replace:{"diet:vegan":"yes"}},{old:{cuisine:"vegetarian"},replace:{"diet:vegetarian":"yes"}},{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:{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:{nosquare:"*"},replace:{nonsquare:"$1"}},{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:"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:"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:{sport:"horse_shoes"},replace:{sport:"horseshoes"}},{old:{sport:"horseshoe"},replace:{sport:"horseshoes"}},{old:{sport:"shuffle_board"},replace:{sport:"shuffleboard"}},{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:{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"}}];
24667
24668         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};
24669
24670         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}};
24671
24672         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"};
24673
24674         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"}]}]}];
24675
24676         var type$1 = "FeatureCollection";
24677         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]]]}}];
24678         var dataImperial = {
24679         type: type$1,
24680         features: features
24681         };
24682
24683         var type$2 = "FeatureCollection";
24684         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]]]}}];
24685         var dataDriveLeft = {
24686         type: type$2,
24687         features: features$1
24688         };
24689
24690         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."}},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."}},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..."},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",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",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",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},traffic_signals:{label:"Type"},"traffic_signals/direction":{label:"Direction",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"},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"}},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"},"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"},"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"},"amenity/bicycle_repair_station":{name:"Bicycle Repair Tool Stand",terms:"bike,repair,chain,pump"},"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:""},"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/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:"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,post"},"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"},"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/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/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"},"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/bunker":{name:"Military Bunker",terms:"air force,army,base,fight,force,guard,marine,navy,troop,war"},"landuse/military/checkpoint":{name:"Checkpoint",terms:"air force,army,base,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/nuclear_explosion_site":{name:"Nuclear Explosion Site",terms:"atom,blast,bomb,detonat*,nuke,site,test"},"landuse/military/obstacle_course":{name:"Obstacle Course",terms:"army,base,force,guard,marine,navy,troop,war"},"landuse/military/office":{name:"Military Office",terms:"air force,army,base,enlist,fight,force,guard,marine,navy,recruit,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/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/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"},"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/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/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/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:""},"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:""},"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:""},"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"},"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"},"Maptime-Australia-Slack":{name:"Maptime Australia Slack",description:"Sign up at {signupUrl}"},"talk-au":{name:"Talk-au Mailing List",description:"Place for Aussie mappers to chat"},"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"},"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"}}}}};
24691
24692         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]]]}},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]]]}},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]]]}}};
24693
24694         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/"},"Maptime-Australia-Slack":{id:"Maptime-Australia-Slack",featureId:"australia_full",type:"slack",countryCodes:["au"],languageCodes:["en"],name:"Maptime Australia Slack",description:"Sign up at {signupUrl}",signupUrl:"https://bit.ly/maptimeau",url:"https://maptimeaustralia.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-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"}]},"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"}]},"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/"}]}};
24695
24696         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-overlay",name:"basemap.at Beschriftungen (annotations)",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-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:"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:"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:"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_Setores_Rurais.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_Setores_Rurais.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:"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://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_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]]]},{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"}];
24697
24698         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"],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","indoor","lit","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","inscription","lit"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-bicycle",fields:["bicycle_parking","capacity","operator","covered","access_simple","fee","payment_multi_fee"],moreFields:["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:["opening_hours","address","website","phone","email","fax","wheelchair","covered"],geometry:["point","vertex","area"],terms:["bike"],tags:{amenity:"bicycle_rental"},name:"Bicycle Rental"},"amenity/bicycle_repair_station":{icon:"maki-bicycle",fields:["operator","brand","opening_hours","fee","service/bicycle"],moreFields:["payment_multi_fee","covered"],geometry:["point","vertex"],terms:["bike","repair","chain","pump"],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","fee","payment_multi_fee"],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:["indoor","lit"],geometry:["point","vertex"],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","fee","payment_multi_fee","lit"],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:["website","phone","email","fax","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:["lit","covered"],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:["website","phone","email","fax","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","lit"],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:["access_simple"],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","opening_hours","smoking","outdoor_seating","payment_multi","website","phone","email","fax","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"],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","building_area","address","service_times"],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","building_area","address","service_times"],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/hindu":{icon:"temaki-hinduism",fields:["name","religion","denomination","building_area","address","service_times"],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","building_area","address","service_times"],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","building_area","address","service_times"],geometry:["point","area"],terms:["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","building_area","address","service_times"],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","building_area","address","service_times"],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","building_area","address","service_times"],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:["wheelchair"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],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"],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","capacity","website","lit"],moreFields:["wheelchair"],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"],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"],moreFields:["address","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:["website","phone","email","fax","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:["covered","indoor"],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"],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:["website","phone","email","fax","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"],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"],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.95,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"],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"],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:[],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"],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","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/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/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:"maki-hospital",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:{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:{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:{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"],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/bunker":{icon:"temaki-military",fields:["name","bunker_type","building_area"],geometry:["point","area"],tags:{military:"bunker"},addTags:{building:"bunker",landuse:"military",military:"bunker"},terms:["air force","army","base","fight","force","guard","marine","navy","troop","war"],name:"Military Bunker"},"landuse/military/checkpoint":{icon:"maki-barrier",fields:["name"],geometry:["point","vertex","area"],tags:{military:"checkpoint"},addTags:{landuse:"military",military:"checkpoint"},terms:["air force","army","base","force","guard","marine","navy","troop","war"],name:"Checkpoint"},"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/nuclear_explosion_site":{icon:"maki-danger",fields:["name"],geometry:["point","vertex","area"],tags:{military:"nuclear_explosion_site"},addTags:{landuse:"military",military:"nuclear_explosion_site"},terms:["atom","blast","bomb","detonat*","nuke","site","test"],name:"Nuclear Explosion Site"},"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/office":{icon:"temaki-military",fields:["name","building_area"],geometry:["point","area"],tags:{military:"office"},addTags:{landuse:"military",military:"office"},terms:["air force","army","base","enlist","fight","force","guard","marine","navy","recruit","troop","war"],name:"Military Office"},"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/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","internet_access"],moreFields:["payment_multi","internet_access/fee","internet_access/ssid","smoking","phone","email","fax"],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:["fee","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"},addTags:{leisure:"track",sport:"cycling",highway:"cycleway"},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"},addTags:{leisure:"track",sport:"horse_racing",highway:"bridleway"},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"},addTags:{leisure:"track",sport:"running",highway:"footway"},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"},"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"},addTags:{highway:"footway",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:["location","operator","substance","layer"],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/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"},"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"],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",replacement:"office/government"},"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/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"},addTags:{public_transport:"platform",highway:"footway"},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"},addTags:{public_transport:"platform",aerialway:"yes",highway:"footway"},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"},addTags:{public_transport:"platform",bus:"yes",highway:"footway"},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"},addTags:{public_transport:"platform",ferry:"yes",highway:"footway"},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",highway:"footway"},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",highway:"footway"},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",highway:"footway"},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",highway:"footway"},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",highway:"footway"},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"},addTags:{public_transport:"platform",trolleybus:"yes",highway:"footway"},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/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/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"],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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAddiko%20Bank%20Logo.svg&width=100",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/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",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/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",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://pbs.twimg.com/profile_images/441617450262491136/GDkx0IIP_bigger.png",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/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://graph.facebook.com/BBVABancomer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer",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://graph.facebook.com/bbvacompass/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835088",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass",official_name:"BBVA Compass Bancshares",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/BBVAContinental/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://graph.facebook.com/BBVAFrancesArg/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876788",amenity:"bank"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:en":"BBVA France","brand:fr":"BBVA France","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés","name:en":"BBVA France","name:fr":"BBVA Francés",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogobcp.png&width=100",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",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://graph.facebook.com/bmcebank/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2300433",amenity:"bank"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},terms:["bmce"],matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",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",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"},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%2FChinese%20Bank%20of%20China.jpg&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:["bank of the philippine islands","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://graph.facebook.com/bancamarch/picture?type=large",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 Agrario de Colombia":{name:"Banco Agrario de Colombia",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 de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"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",geometry:["point","area"],tags:{"brand:wikidata":"Q27331643",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"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",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:wikidata":"Q62054564",name:"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/BBVAContinental/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"},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://graph.facebook.com/BancoInternacionalEcuador/picture?type=large",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":"Nation Bank","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:["pr","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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco Sol (Angola)":{name:"Banco Sol (Angola)",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q62118744",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","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:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","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:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},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:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco de Desarrollo Banrural":{name:"Banco de Desarrollo Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupofinancierobanrural/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"},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:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"Banco de Fomento Angola (BFA)"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20do%20Brasil%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20BNB%20(1).svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBancolombia%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q806206",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},countryCodes:["co"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",imageURL:"https://graph.facebook.com/BBVABancomer/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2876794",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},countryCodes:["mx"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q4854143",amenity:"bank"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},countryCodes:["ro"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",imageURL:"https://graph.facebook.com/BanescoBancoUniversal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854841",amenity:"bank"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Bangkok%20Bank%20Public%20Company%20Limited.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBankalhabiblogo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankAustria/picture?type=large",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Mandiri%20(1998-2008).svg&width=100",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",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",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank Pekao":{name:"Bank Pekao",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Pekao%20SA%20Logo%20(2017).svg&width=100",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",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q790068",amenity:"bank"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank-of-Ireland-Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",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 Montreal":{name:"Bank of Montreal",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:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},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://pbs.twimg.com/profile_images/1103424843482058752/wb7kFeSw_bigger.png",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-BP-VF%2BS.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2883441",amenity:"bank"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",imageURL:"https://graph.facebook.com/banrisul/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4857098",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Banrural":{name:"Banrural",icon:"maki-bank",imageURL:"https://graph.facebook.com/grupofinancierobanrural/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5719130",amenity:"bank"},addTags:{amenity:"bank",brand:"Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banrural"},countryCodes:["gt","hn"],terms:[],matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",imageURL:"https://graph.facebook.com/BarclaysUK/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q245343",amenity:"bank"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},terms:["barclays bank"],matchScore:2,suggestion:true},"amenity/bank/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",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"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCICBanqueLogo.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCIMB%20Group%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCIMB%20Niaga%20logo.svg&width=100",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",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/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDesjardins%20Group%20logo.svg&width=100",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://pbs.twimg.com/profile_images/963786966771863554/TO9mBEU1_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCaixa%20Econ%C3%B4mica%20Federal.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caixabank (Spain)":{name:"Caixabank (Spain)",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20CaixaBank.svg&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Caja Rural de Jaén":{name:"Caja Rural de Jaén",icon:"maki-bank",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCanara%20Bank%20Logo.svg&width=100",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"},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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChina%20Bank%20logo%20wiki.jpg&width=100",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",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/926109116233166848/xR88n-q7_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q857063",amenity:"bank"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q25209674",amenity:"bank"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},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",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 (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://pbs.twimg.com/profile_images/875682015106007042/Ogpdl-Lh_bigger.jpg",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FComerica%20Inc.%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/706619944633389058/8ohO3e8b_bigger.jpg",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-banco-Credicoop.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4854086",amenity:"bank"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCredit%20Suisse%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",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",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://pbs.twimg.com/profile_images/1059770497590878208/qL4i_SGK_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Cr%C3%A9dit%20Mutuel.svg&width=100",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://pbs.twimg.com/profile_images/668742184938643456/ZHoL5MoD_bigger.png",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Crédito Agrícola":{name:"Crédito Agrícola",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Cбербанк":{name:"Cбербанк",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:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDanske%20Bank%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",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://pbs.twimg.com/profile_images/794192531588321280/OybdjoEC_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDesjardins%20Group%20logo.svg&width=100",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/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEcobank%20Logo.svg&width=100",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"},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://graph.facebook.com/equitybankusa/picture?type=large",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FErste%20Bank%20Logo.svg&width=100",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":{name:"FNB",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFederal%20Bank.jpg&width=100",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/1013779792141914120/FJ0U_8zw_bigger.jpg",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","5/3 bank"],matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q1416237",amenity:"bank"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},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:["1stbank"],matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",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"},terms:[],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":{name:"First National Bank",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/Frost Bank":{name:"Frost Bank",icon:"maki-bank",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/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"},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",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",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/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",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",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",geometry:["point","area"],tags:{"brand:wikidata":"Q3310164",amenity:"bank"},addTags:{amenity:"bank",brand:"Halifax","brand:wikidata":"Q3310164","brand:wikipedia":"en:Halifax (bank)",name:"Halifax"},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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",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"},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",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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FICICI%20Bank%20Logo.svg&width=100",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FING%20logo.png&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIndian%20Overseas%20Bank%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInterbank%20Logo.jpg&width=100",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/Itaú (Brazil)":{name:"Itaú (Brazil)",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":"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:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"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",geometry:["point","area"],tags:{"brand:wikidata":"Q941020",amenity:"bank"},addTags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKomer%C4%8Dn%C3%AD%20banka%20logo.svg&width=100",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",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/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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Laboral%20Kutxa.JPG&width=100",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Liberbank.png&width=100",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",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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Moneta%20Money%20Bank.png&width=100",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"},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",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/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"},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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",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/1130392887198453761/-d8gnvTW_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"},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/770597713893285888/ItnmL0YM_bigger.jpg",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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNordea%20logo16.png&width=100",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOberbank%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2009139",amenity:"bank"},addTags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Occidental de Descuento":{name:"Occidental de Descuento",icon:"maki-bank",imageURL:"https://graph.facebook.com/BODOficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4854108",amenity:"bank"},addTags:{amenity:"bank",brand:"Occidental de Descuento","brand:wikidata":"Q4854108","brand:wikipedia":"en:Banco Occidental de Descuento",name:"Occidental de Descuento"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOP%20Financial%20Group.svg&width=100",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:["philippine national bank"],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"},terms:["pnc"],matchScore:2,suggestion:true},"amenity/bank/PSBank":{name:"PSBank",icon:"maki-bank",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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Banco%20Patagonia.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBank%20Pekao%20SA%20Logo%20(2017).svg&width=100",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/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",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPostbank-Logo.svg&width=100",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",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://graph.facebook.com/bbvaprovincial/picture?type=large",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",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","royal bank of canada"],matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",imageURL:"https://pbs.twimg.com/profile_images/1130393457191727105/wuHZFFaL_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"},terms:["royal bank of scotland"],matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",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",geometry:["point","area"],tags:{"brand:wikidata":"Q252004",amenity:"bank"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRegions-Financial-Logo.svg&width=100",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":{name:"Republic Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20Republic%20Bank%20of%20Trinidad%20and%20Tobago.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SEB":{name:"SEB",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSEB%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q975655",amenity:"bank"},addTags:{amenity:"bank",brand:"SEB","brand:wikidata":"Q975655","brand:wikipedia":"en:SEB Group",name:"SEB"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SGBCI":{name:"SGBCI",icon:"maki-bank",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",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",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://pbs.twimg.com/profile_images/977265312969232384/7W4a261r_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBanco%20Santander%20Logotipo.svg&width=100",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FThe%20Security%20Bank%20Logo%201.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",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",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"},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",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/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSonali%20Bank%20logo.JPG&width=100",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"},terms:["sonali bank limited","sonali bank limited সোনালী ব্যাংক লিমিটেড"],matchScore:2,suggestion:true},"amenity/bank/South Indian Bank":{name:"South Indian Bank",icon:"maki-bank",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSparda%20Bank%202003%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FState-Bank-of-India-Logo.svg&width=100",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/Summit Bank":{name:"Summit Bank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSunTrust%20Banks%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSupervielle%20logo14.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSwedbank%20skylt.JPG&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1145493",amenity:"bank"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FToronto-Dominion%20Bank%20logo.svg&width=100",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",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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Takarékszövetkezet":{name:"Takarékszövetkezet",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTargobank%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1455437",amenity:"bank"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTatra%20banka%20logo.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FT%C3%BCrkiye%20%C4%B0%C5%9F%20Bankas%C4%B1%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FU.S.%20Bancorp%20logo.svg&width=100",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",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUCPB%20logo.svg&width=100",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/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/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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",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://graph.facebook.com/UniCreditItalia/picture?type=large",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",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"},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",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/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"},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":{name:"Volksbank",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20German%20Volksbanken%20Raiffeisenbanken.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q695110",amenity:"bank"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},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",official_name:"Volksbank Köln Bonn eG"},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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWestpac%20logo.svg&width=100",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",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZiraat%20Bankas%C4%B1%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMbank-logo.jpg&width=100",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/Č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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCeska%20Sporitelna.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FT%C3%BCrkiye%20%C4%B0%C5%9F%20Bankas%C4%B1%20logo.svg&width=100",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",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",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",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":"Альфа-Банк"},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",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"},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",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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFUIB%20eng%20300.jpg&width=100",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",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"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%9F%D1%80%D0%BE%D0%BC%D1%81%D0%B2%D1%8F%D0%B7%D1%8C%D0%B1%D0%B0%D0%BD%D0%BA%20logo%20NEW%202008.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/РНКБ":{name:"РНКБ",icon:"maki-bank",geometry:["point","area"],tags:{"brand:wikidata":"Q16912944",amenity:"bank"},addTags:{amenity:"bank",brand:"РНКБ","brand:wikidata":"Q16912944","brand:wikipedia":"en:Russian National Commercial Bank",name:"РНКБ"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%A0%D0%B0%D0%B9%D1%84%D1%84%D0%B0%D0%B9%D0%B7%D0%B5%D0%BD%20%D0%B1%D0%B0%D0%BD%D0%BA%20%D0%90%D0%B2%D0%B0%D0%BB%D1%8C%20(%D0%BB%D0%BE%D0%B3%D0%BE%D1%82%D0%B8%D0%BF).gif&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosbank%20logo%20en.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",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",geometry:["point","area"],tags:{"brand:wikidata":"Q4378147",amenity:"bank"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},terms:["приднестровский сбербанк","сбербанк россии"],matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",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"},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",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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",imageURL:"https://graph.facebook.com/BankHapoalimSocial/picture?type=large",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Bangkok%20Bank%20Public%20Company%20Limited.svg&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSumitomo%20Mitsui%20Banking%20Logo.svg&width=100",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",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"},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"},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%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"},terms:[],matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChinese%20Bank%20of%20China.jpg&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"},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":"jp:京都中央信用金庫",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:"农业银行"},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",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",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",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",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/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":"en:Nextbike"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/Abitab":{name:"Abitab",icon:"maki-bank",imageURL:"https://graph.facebook.com/Abitaboficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16488129",amenity:"bureau_de_change"},addTags:{amenity:"bureau_de_change",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"},countryCodes:["uy"],terms:[],matchScore:2,suggestion:true},"amenity/bureau_de_change/CADECA":{name:"CADECA",icon:"maki-bank",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",name:"85°C",takeaway:"yes"},countryCodes:["au","us"],terms:["85 cafe","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/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"},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:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",cuisine:"coffee_shop",name:"Chatime",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"},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"},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/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"},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"},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/ValerieCafe/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://graph.facebook.com/pronto.jp/picture?type=large",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/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",takeaway:"yes"},terms:["starbucks coffee"],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/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"},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"},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",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",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/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/스타벅스":{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:[],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"},terms:[],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"},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"},terms:["enterprise rent-a-car"],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:[],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/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:[],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"},terms:[],matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",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",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",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",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/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/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"},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"},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://graph.facebook.com/160983117271970/picture?type=large",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"},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"},terms:[],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"},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 (GermanyAndDenmark)":{name:"Cinemaxx (GermanyAndDenmark)",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;da: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"},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"},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"},terms:[],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/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"},terms:[],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."},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"],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:["dci","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"},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/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/fast_food/burger/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/434046919812214784/sTmhuLO-_bigger.png",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/angelsburgerofficial/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"},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:[],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"},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/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"},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"},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://graph.facebook.com/burgerking/picture?type=large",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCheckers%20logo.svg&width=100",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"},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"},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:["chipotle mexican grill"],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"},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/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/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"},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"},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"},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:{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","einstein brothers bagels"],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"},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"},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"},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:["five guys burgers and fries"],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"},terms:["freddy's frozen custard & 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/Gold Star Chili":{name:"Gold Star Chili",icon:"maki-fast-food",imageURL:"https://pbs.twimg.com/profile_images/850405811494895617/FZSowiLf_bigger.jpg",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:["gold star"],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/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"},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://graph.facebook.com/HotHeadBurritos/picture?type=large",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://graph.facebook.com/innout/picture?type=large",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"},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"},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"},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"},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"},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://graph.facebook.com/KFC/picture?type=large",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","pl","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:[],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"},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/Manchu Wok":{name:"Manchu Wok",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FManchu%20Wok%20logo.svg&width=100",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/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"},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"},terms:[],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/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/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"},terms:[],matchScore:2,suggestion:true},"amenity/fast_food/Oporto":{name:"Oporto",icon:"maki-fast-food",geometry:["point","area"],tags:{"brand:wikidata":"Q4412342",amenity:"fast_food"},addTags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",name:"Oporto",takeaway:"yes"},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",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["pals sudden service"],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",takeaway:"yes"},reference:{key:"cuisine",value:"sandwich"},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:["popeyes louisiana kitchen"],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"},terms:[],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"},terms:[],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"},terms:["qdoba mexican grill"],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"},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:["raising canes chicken fingers"],matchScore:2,suggestion:true},"amenity/fast_food/burger/Rally's":{name:"Rally's",icon:"maki-fast-food",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRally's%20logo.svg&width=100",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"},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/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:[],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"},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"},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"},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/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"},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"},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"},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"},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"},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:{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",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["us"],terms:["habit burger","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:{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/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"},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:["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"},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/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:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης",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://graph.facebook.com/burgerking/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q177054",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},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:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка",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:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's",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:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's",takeaway:"yes"},reference:{key:"cuisine",value:"pizza"},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:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин",takeaway:"yes"},reference:{key:"cuisine",value:"burger"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/sandwich/Русский Аппетит":{name:"Русский Аппетит",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/Русский-Аппетит-1502979646622576/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62086063",amenity:"fast_food",cuisine:"sandwich;salad;regional"},addTags:{amenity:"fast_food",brand:"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит",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:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!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:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi 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:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok",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://graph.facebook.com/KFC/picture?type=large",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",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://graph.facebook.com/KFC/picture?type=large",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://pbs.twimg.com/profile_images/712033394109124608/kVGTqBLR_bigger.jpg",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://pbs.twimg.com/profile_images/712033394109124608/kVGTqBLR_bigger.jpg",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",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"},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://graph.facebook.com/KFC/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q524757",amenity:"fast_food",cuisine:"chicken"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",cuisine:"chicken",name:"肯德基","name:en":"KFC",takeaway:"yes"},reference:{key:"cuisine",value:"chicken"},countryCodes:["cn","hk","mo","sg","tw"],terms:[],matchScore:2,suggestion:true},"amenity/fast_food/burger/麥當勞":{name:"麥當勞",icon:"maki-fast-food",imageURL:"https://graph.facebook.com/mcdonalds/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q38076",amenity:"fast_food",cuisine:"burger"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's",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:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's",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/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"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAbu%20Dhabi%20National%20Oil%20Company%20logo.png&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAgrola%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q397351",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Agrola","brand:wikidata":"Q397351","brand:wikipedia":"de:Agrola",name:"Agrola"},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",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",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"},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://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAVIA%20International%20logo.svg&width=100",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:[],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",geometry:["point","area"],tags:{"brand:wikidata":"Q6579719",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Bangchak","brand:wikidata":"Q6579719","brand:wikipedia":"zh:曼差石油股份",name:"Bangchak"},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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",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 Market":{name:"Carrefour Market",icon:"maki-fuel",imageURL:"https://graph.facebook.com/carrefouritalia/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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Casey's General Store":{name:"Casey's General Store",icon:"maki-fuel",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChevron%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCitgo%20logo.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q5127157",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Co-op (Canada)":{name:"Co-op (Canada)",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",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",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"},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",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",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",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","pr"],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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDOMO%20Gasoline%20Logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJXTG%20Nippon%20Oil%20%26%20Energy%20logo.svg&width=100",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",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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",imageURL:"https://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExxon%20logo%202016.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4781944",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},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",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"},terms:["fas gas plus"],matchScore:2,suggestion:true},"amenity/fuel/Firezone":{name:"Firezone",icon:"maki-fuel",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 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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGalp.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGazprom%20Avia%20Logo.svg&width=100",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",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",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"},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",geometry:["point","area"],tags:{"brand:wikidata":"Q5617739",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/H-E-B Fuel":{name:"H-E-B Fuel",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",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"},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",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"},terms:["hindustan petroleum","hp petrol pump"],matchScore:2,suggestion:true},"amenity/fuel/Harnois":{name:"Harnois",icon:"maki-fuel",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHess%20Corporation%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1615684",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Hess","brand:wikidata":"Q1615684","brand:wikipedia":"en:Hess Corporation",name:"Hess"},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",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/IES":{name:"IES",icon:"maki-fuel",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIndian%20Oil%20Logo.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q17048617",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIrving%20Oil%20Logo.svg&width=100",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/Jetti-Petroleum-Inc-1733916930229227/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/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"},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",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLove%E2%80%99s%20Travel%20Stops%20%26%20Country%20Stores%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLUK%20OIL%20Logo%20kyr.svg&width=100",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://pbs.twimg.com/profile_images/378800000474004977/cf7c3082d7151bad59c596ac0def6604_bigger.png",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",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",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:[],matchScore:2,suggestion:true},"amenity/fuel/Maverik":{name:"Maverik",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q16974822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maverik","brand:wikidata":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q3302837",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMobil%20logo.svg&width=100",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://pbs.twimg.com/profile_images/1069883324204769280/cbPhjnwc_bigger.jpg",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"},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://pbs.twimg.com/profile_images/1015138866095906816/Va1aA79Z_bigger.jpg",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20Opet.jpg&width=100",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",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"},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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Petr%C3%B3leos%20Mexicanos.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q871308",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPertamina%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1641044",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},terms:[],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",geometry:["point","area"],tags:{"brand:wikidata":"Q61743540",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petro-T","brand:wikidata":"Q61743540",name:"Petro-T"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Petroperu%20vertical%20negativo.jpg&width=100",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",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",geometry:["point","area"],tags:{"brand:wikidata":"Q1812822",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPetronas%20Logo.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q1726547",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Phoenix":{name:"Phoenix",icon:"maki-fuel",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":"Q1434601",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",name:"Pilot"},countryCodes:["ca","us"],terms:["flying j","pilot flying j"],matchScore:2,suggestion:true},"amenity/fuel/Pioneer":{name:"Pioneer",icon:"maki-fuel",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",geometry:["point","area"],tags:{"brand:wikidata":"Q598835",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPuma%20Energy%20Logo.jpg&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Q8 Easy":{name:"Q8 Easy",icon:"maki-fuel",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"},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://pbs.twimg.com/profile_images/978987077554581504/R7x8NTvv_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Repsol.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo-Rompetrol%20KMG%20colored%20approved.jpg&width=100",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",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://pbs.twimg.com/profile_images/813782141259497472/inQrmCRf_bigger.jpg",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://pbs.twimg.com/profile_images/1101419025421225984/xsPc8EfW_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSasol.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q905998",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSinclair%20gas%20station%20sign.JPG&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%A1%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0%D1%84%D1%82.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1587563",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FState%20Oil%20Company%20of%20Azerbaijan%20Republic%20logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSt1%20Logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7592214",amenity:"fuel"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Stewart's":{name:"Stewart's",icon:"maki-fuel",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTamoil.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q706793",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Tango":{name:"Tango",icon:"maki-fuel",geometry:["point","area"],tags:{"brand:wikidata":"Q2423920",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Tango","brand:wikidata":"Q2423920","brand:wikipedia":"nl:Tango CV",name:"Tango"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTeboil%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7692079",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTexaco%20textlogo.svg&width=100",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",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://pbs.twimg.com/profile_images/876776431543615489/1QCXAxs1_bigger.jpg",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://pbs.twimg.com/profile_images/876776431543615489/1QCXAxs1_bigger.jpg",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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Turkey Hill":{name:"Turkey Hill",icon:"maki-fuel",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20turmoel%20hoch.png&width=100",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"},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","udf fuels","united dairy farmers"],matchScore:2,suggestion:true},"amenity/fuel/Ultramar":{name:"Ultramar",icon:"maki-fuel",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUno-X%20logo.png&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q12663942",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Viada","brand:wikidata":"Q12663942","brand:wikipedia":"en:Lukoil Baltija",name:"Viada"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWOG%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Walmart":{name:"Walmart",icon:"maki-fuel",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",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://graph.facebook.com/XTRenergy/picture?type=large",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYpf%20logo13.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FZEnergylogo.png&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBashneft%20logo.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q1461799",amenity:"fuel"},addTags:{amenity:"fuel",brand:"Газпромнефть","brand:wikidata":"Q1461799","brand:wikipedia":"en:Gazprom Neft",name:"Газпромнефть"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLUK%20OIL%20Logo%20kyr.svg&width=100",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",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",geometry:["point","area"],tags:{"brand:wikidata":"Q4063700",amenity:"fuel"},addTags:{amenity:"fuel",brand:"НК Альянс","brand:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOmv%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F%D0%9B%D0%BE%D0%B3%D0%BE%D1%82%D0%B8%D0%BF%20%D0%9F%D0%B5%D1%82%D0%B5%D1%80%D0%B1%D1%83%D1%80%D0%B3%D1%81%D0%BA%D0%BE%D0%B9%20%D1%82%D0%BE%D0%BF%D0%BB%D0%B8%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D0%B8.jpg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/Петрол":{name:"Петрол",icon:"maki-fuel",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRosneft%20logo.svg&width=100",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"},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:"ТНК"},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"},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"},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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAbu%20Dhabi%20National%20Oil%20Company%20logo.png&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/fuel/บางจาก":{name:"บางจาก",icon:"maki-fuel",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",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://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",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://pbs.twimg.com/profile_images/595503093447598080/4ooH4R98_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJXTG%20Nippon%20Oil%20%26%20Energy%20logo.svg&width=100",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",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"},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/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"},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/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","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:["rita's water ice"],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:["kindercare learning center"],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/Orange Money":{name:"Orange Money",icon:"maki-bank",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"},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"},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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBartell%20Drugs%20(logo).gif&width=100",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",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",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",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/Boticas-Salud-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",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",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"},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://graph.facebook.com/dbamozdrowie/picture?type=large",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Droga Raia":{name:"Droga Raia",icon:"maki-pharmacy",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExtrafarma%20Logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFamiliprix.jpg&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",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 SalcoBrand":{name:"Farmacias SalcoBrand",icon:"maki-pharmacy",geometry:["point","area"],tags:{"brand:wikidata":"Q2877054",amenity:"pharmacy"},addTags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"},reference:{key:"amenity",value:"pharmacy"},countryCodes:["cl"],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",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",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Inkafarma.png&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",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://pbs.twimg.com/profile_images/3785151714/bacbe389277bb2f5477016a7fde79bcd_bigger.jpeg",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"},terms:["lloyds"],matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLondon%20Drugs%20Logo%20-%20with%20border.png&width=100",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",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",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",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://pbs.twimg.com/profile_images/854306359071961089/tyVjOiXp_bigger.jpg",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FShoppers-Drug-Mart-Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave (Canada)":{name:"Pharmasave (Canada)",icon:"maki-pharmacy",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",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",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/Rite Aid":{name:"Rite Aid",icon:"maki-pharmacy",imageURL:"https://pbs.twimg.com/profile_images/1096082254231613441/2lYTJj1d_bigger.png",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",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:[],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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FShoppers-Drug-Mart-Logo.svg&width=100",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",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://pbs.twimg.com/profile_images/1010086590536929280/Dy5TpFig_bigger.jpg",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",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:["the generics pharmacy"],matchScore:2,suggestion:true},"amenity/pharmacy/TerryWhite Chemmart":{name:"TerryWhite Chemmart",icon:"maki-pharmacy",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTerry%20White%20Chemists.png&width=100",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",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",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://pbs.twimg.com/profile_images/875789275668918273/7l9RDOnl_bigger.jpg",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"},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",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",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"},terms:["ziko"],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",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"},terms:[],matchScore:2,suggestion:true},"amenity/pharmacy/סופר-פארם":{name:"סופר-פארם",icon:"maki-pharmacy",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",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",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",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"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",imageURL:"https://pbs.twimg.com/profile_images/1050581738009718785/uXnrUC3X_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMacau%20DSC.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q909429",amenity:"post_office"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},countryCodes:["mo"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",imageURL:"https://graph.facebook.com/canadapost/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1032001",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},countryCodes:["ca"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",imageURL:"https://graph.facebook.com/correiosoficial/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3375004",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},countryCodes:["br"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreoOficialSA/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4036566",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},countryCodes:["ar"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",imageURL:"https://graph.facebook.com/correoschile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172893",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},countryCodes:["cl"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",imageURL:"https://graph.facebook.com/CorreosdeCostaRica/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5172894",amenity:"post_office"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},countryCodes:["cr"],terms:[],matchScore:2,suggestion:true},"amenity/post_office/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"},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",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",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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLaurent%20Vincenti%20La%20Poste.JPG&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCorreos%20logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPoste-Italiane-Logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogoSlovakPost.gif&width=100",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://pbs.twimg.com/profile_images/1080841709934780417/MTIJnZHk_bigger.jpg",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"},terms:["ups","ups store"],matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US 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:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},countryCodes:["us"],terms:["united states post office","united states postal service","usps"],matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNova%20Poshta%202014%20logo.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q28665980",amenity:"post_office"},addTags:{amenity:"post_office",brand:"СДЭК","brand:wikidata":"Q28665980","brand:wikipedia":"ru:СДЭК",name:"СДЭК"},terms:[],matchScore:2,suggestion:true},"amenity/post_office/Укрпошта":{name:"Укрпошта",icon:"maki-post",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUkrposhta.svg&width=100",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/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","sylvan learning center"],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"},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 & bar","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"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/american/BJ's":{name:"BJ's",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/BJsRestaurants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4835755",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/italian/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/bellaitalia.co.uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q4883362",amenity:"restaurant",cuisine:"italian"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"},reference:{key:"cuisine",value:"italian"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/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/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"},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"},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://pbs.twimg.com/profile_images/553567478693908481/BWWI_wgN_bigger.jpeg",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"},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/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 & bar","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://graph.facebook.com/OfficialChuckECheeses/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2438391",amenity:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},reference:{key:"cuisine",value:"pizza"},countryCodes:["ca","us"],terms:[],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"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",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/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/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"},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",shop:"gift"},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:[],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/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:[],matchScore:2,suggestion:true},"amenity/restaurant/american/First Watch":{name:"First Watch",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q5454064",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american",name:"First Watch"},reference:{key:"cuisine",value:"american"},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"},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/Godfather's Pizza":{name:"Godfather's Pizza",icon:"maki-restaurant-pizza",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"},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"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],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"},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/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/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:[],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/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:[],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",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/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"},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"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/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:"restaurant",cuisine:"pizza"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},reference:{key:"cuisine",value:"pizza"},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"},terms:[],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 of Manila",cuisine:"asian",name:"Max's Restaurant"},reference:{key:"cuisine",value:"asian"},countryCodes:["ph"],terms:["maxs of manila"],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/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/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:["mountain mike's pizza"],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:[],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/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://graph.facebook.com/outback/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1064893",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",cuisine:"american",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"},reference:{key:"cuisine",value:"asian"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/Pardos Chicken":{name:"Pardos Chicken",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/pardoschicken/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q17624435",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"Pardos Chicken","brand:wikidata":"Q17624435","brand:wikipedia":"en:Pardos chicken",cuisine:"peruvian",name:"Pardos Chicken"},countryCodes:["pe"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/asian/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/peiwei/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7160898",amenity:"restaurant",cuisine:"asian"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",cuisine:"asian",name:"Pei Wei"},reference:{key:"cuisine",value:"asian"},countryCodes:["us"],terms:["pei wei asian diner"],matchScore:2,suggestion:true},"amenity/restaurant/american/Perkins":{name:"Perkins",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/eatatperkins/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7169056",amenity:"restaurant",cuisine:"american"},addTags:{amenity:"restaurant",brand:"Perkins","brand:wikidata":"Q7169056","brand:wikipedia":"en:Perkins Restaurant and Bakery",cuisine:"american",name:"Perkins",official_name:"Perkins Restaurant and Bakery"},reference:{key:"cuisine",value:"american"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở 24":{name:"Phở 24",icon:"maki-restaurant-noodle",imageURL:"https://graph.facebook.com/pho24.24giavitinhte/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q63863118",amenity:"restaurant",cuisine:"vietnamese;noodle"},addTags:{amenity:"restaurant",brand:"Phở 24","brand:wikidata":"Q63863118",cuisine:"vietnamese;noodle",name:"Phở 24","name:en":"Pho 24","name:vi":"Phở 24"},reference:{key:"cuisine",value:"vietnamese"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/vietnamese/Phở Hòa (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"},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/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/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"},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:[],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/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://pbs.twimg.com/profile_images/849232685667168256/Wg-1LDp5_bigger.jpg",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"},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"},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:{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"},terms:["cheesecake factory"],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"},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:{amenity:"restaurant",brand:"The Melting Pot","brand:wikidata":"Q7750948","brand:wikipedia":"en:The Melting Pot (restaurant)",cuisine:"fondue",name:"The Melting Pot"},terms:["melting pot"],matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",imageURL:"https://graph.facebook.com/tobycarvery/picture?type=large",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/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/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"},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"},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"},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"},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"},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/デニーズ":{name:"デニーズ",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11320661",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:ja":"デニーズ","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's","name:ja":"デニーズ"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",imageURL:"https://pbs.twimg.com/profile_images/1098907474789163010/uXiRaQ9S_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q11328598",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:ja":"バーミヤン","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan","name:ja":"バーミヤン"},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":"八方雲集"},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"},terms:[],matchScore:2,suggestion:true},"amenity/restaurant/永和豆漿":{name:"永和豆漿",icon:"maki-restaurant",geometry:["point","area"],tags:{"brand:wikidata":"Q11131335",amenity:"restaurant"},addTags:{amenity:"restaurant",brand:"永和豆漿","brand:en":"Yonghe Soy Milk","brand:wikidata":"Q11131335","brand:wikipedia":"zh:永和豆漿",name:"永和豆漿","name:en":"Yonghe Soy Milk"},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"},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:{alt_name:"American Legion Hall",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 lodge","foe","fraternal order of eagles"],matchScore:2,suggestion:true},"amenity/social_centre/Elks Lodge":{name:"Elks Lodge",icon:"fas-handshake",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:["benevolent and protective order of elks","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:{alt_name:"Moose Lodge",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:["loyal order of 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:["independent order of odd fellows","ioof","odd fellow","odd fellows"],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"},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"},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"},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"},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/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/1131670878872317957/_hx0-AFB_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",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},"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/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/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/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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20McFIT%20GmbH.jpg&width=100",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:["ae","au","ca","cl","cn","co","cr","de","do","es","gb","gt","il","jp","kw","mx","nz","pa","pe","pl","pr","sa","sg","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/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},"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/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/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/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/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/Grange Insurance":{name:"Grange Insurance",icon:"maki-suitcase",imageURL:"https://graph.facebook.com/GrangeInsuranceMarketing/picture?type=large",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/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/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/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:["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:{alt_name:"Jackson Hewitt Tax Service",brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor"},countryCodes:["us"],terms:["jackson hewitt tax service"],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:["liberty tax service"],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/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","de","fr","gb","pl"],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/1130938873150922752/iWHfbRSk_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",shop:"alcohol"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/alcohol/Virginia ABC":{name:"Virginia ABC",icon:"fas-wine-bottle",imageURL:"https://pbs.twimg.com/profile_images/981178074137055233/nSvQCkEL_bigger.jpg",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://pbs.twimg.com/profile_images/1106166467274440704/iwQRyG3O_bigger.png",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://pbs.twimg.com/profile_images/1116601617699102720/CVI31i0C_bigger.jpg",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/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"},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",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"},terms:[],matchScore:2,suggestion:true},"shop/bag/Samsonite":{name:"Samsonite",icon:"fas-suitcase-rolling",imageURL:"https://graph.facebook.com/Samsonite/picture?type=large",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",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",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",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",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",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://pbs.twimg.com/profile_images/590867289953738753/OftDrPao_bigger.jpg",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/Bäckerei Fuchs":{name:"Bäckerei Fuchs",icon:"maki-bakery",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDer%20Beck.svg&width=100",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",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",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://pbs.twimg.com/profile_images/1001837345728016385/86hcMlm8_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKuU-Logo.png&width=100",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",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",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/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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSch%C3%A4fers%20Brot%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSehne%20Backwaren%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%204C.png&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q15854357",shop:"bakery"},addTags:{brand:"Wiener Feinbäcker","brand:wikidata":"Q15854357","brand:wikipedia":"de:Wiener Feinbäckerei Heberer",name:"Wiener Feinbäcker",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/von Allwörden":{name:"von Allwörden",icon:"maki-bakery",imageURL:"https://graph.facebook.com/allwoerden/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60411349",shop:"bakery"},addTags:{brand:"von Allwörden","brand:wikidata":"Q60411349","brand:wikipedia":"nds:Heinrich von Allwörden GmbH",name:"von Allwörden",shop:"bakery"},countryCodes:["de"],terms:[],matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",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/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",imageURL:"https://pbs.twimg.com/profile_images/1077920705352777733/OtRwUUoo_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q810773",shop:"beauty"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},terms:[],matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",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/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:"beauty"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},countryCodes:["us"],terms:["ulta"],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:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"},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:[],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://graph.facebook.com/trinkgut/picture?type=large",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",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",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://pbs.twimg.com/profile_images/964533060942299136/XCPfJNxf_bigger.jpg",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFonbet%20logo.jpg&width=100",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/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",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/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/TSUTAYA":{name:"TSUTAYA",icon:"fas-book",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",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://pbs.twimg.com/profile_images/624022283103801344/YjAC-2vv_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVinzenzmurr%20logo.svg&width=100",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",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",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:["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","pr","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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAuto-Teile-Unger%20Logo.svg&width=100",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/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/572348690115751936/8zWGjm2u_bigger.jpeg",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",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://graph.facebook.com/BrakesPlus.CompleteAutoService/picture?type=large",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCarglass-Logo.svg&width=100",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/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/Dekra":{name:"Dekra",icon:"maki-car-repair",geometry:["point","area"],tags:{"brand:wikidata":"Q383711",shop:"car_repair"},addTags:{brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",shop:"car_repair"},countryCodes:["de","fr"],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"},terms:[],matchScore:2,suggestion:true},"shop/car_repair/Feu Vert":{name:"Feu Vert",icon:"maki-car-repair",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFirestone.svg&width=100",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:["firestone complete auto care"],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://pbs.twimg.com/profile_images/954462463201693697/KjS76bom_bigger.jpg",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://pbs.twimg.com/profile_images/378800000339987868/7c204edba540760550511092472c11a0_bigger.jpeg",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://pbs.twimg.com/profile_images/763666491522879488/IDO6pgKh_bigger.jpg",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",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://pbs.twimg.com/profile_images/725269358449152000/1BFagDRC_bigger.jpg",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/Meineke":{name:"Meineke",icon:"maki-car-repair",imageURL:"https://pbs.twimg.com/profile_images/724988942840266755/kpMpvs5I_bigger.jpg",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",shop:"car_repair"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/car_repair/Mekonomen":{name:"Mekonomen",icon:"maki-car-repair",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://pbs.twimg.com/profile_images/448587010475692032/6J-h3__O_bigger.jpeg",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",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:["pr","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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPointS%204c%20klein.svg&width=100",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",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://pbs.twimg.com/profile_images/941319713149333505/oSj6thH6_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSpeedy%20France%20logo%20officiel.png&width=100",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 Tire & Auto Service":{name:"Tuffy Tire & Auto Service",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 Tire & Auto Service","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy Tire & Auto Service",shop:"car_repair"},countryCodes:["us"],terms:["tuffy tire and auto service"],matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",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",shop:"car_repair"},countryCodes:["us"],terms:["valvoline instant oil change"],matchScore:2,suggestion:true},"shop/car_repair/ÖAMTC":{name:"ÖAMTC",icon:"maki-car-repair",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:[],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",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"},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"},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"},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"},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"},terms:[],matchScore:2,suggestion:true},"shop/chemist/Trekpleister":{name:"Trekpleister",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTrekpleister%20logo.png&width=100",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://pbs.twimg.com/profile_images/875789275668918273/7l9RDOnl_bigger.jpg",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",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/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/clothes/AOKI":{name:"AOKI",icon:"maki-clothing-store",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://pbs.twimg.com/profile_images/1090830222302298112/W60h63qk_bigger.jpg",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1014248943121813505/qNRJq7zh_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3069980",shop:"clothes"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAckermans-Logo.jpg&width=100",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://pbs.twimg.com/profile_images/1022567836043173895/8EvkF14a_bigger.jpg",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/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/926225107445366786/HNAMY-nG_bigger.jpg",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"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Ann Taylor":{name:"Ann Taylor",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/632020433571676162/jq9ErOl5_bigger.jpg",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://pbs.twimg.com/profile_images/1013829328205991938/mMkaMqhL_bigger.jpg",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/Ardene":{name:"Ardene",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FArdene%20logo.png&width=100",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/Armand Thiery":{name:"Armand Thiery",icon:"maki-clothing-store",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",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/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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBig%20Star%20logo.svg&width=100",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"},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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Bonobo":{name:"Bonobo",icon:"maki-clothing-store",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20BRICE%20Noir.png&width=100",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://pbs.twimg.com/profile_images/1115302398023614465/o1kNm_G5_bigger.jpg",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/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://pbs.twimg.com/profile_images/1024961047009157121/2xSmZUHV_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q390107",shop:"clothes"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1131652532697276417/j5NY54aO_bigger.jpg",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://pbs.twimg.com/profile_images/966321347923271680/THD9mE6x_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FC-und-A-Logo-2011.svg&width=100",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",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://pbs.twimg.com/profile_images/889490770687905792/N8mVqffO_bigger.jpg",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",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",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/Carhartt":{name:"Carhartt",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1130882629887246337/bleprNYj_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q527877",shop:"clothes"},addTags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",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",geometry:["point","area"],tags:{"brand:wikidata":"Q5047083",shop:"clothes"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cato":{name:"Cato",icon:"maki-clothing-store",geometry:["point","area"],tags:{"brand:wikidata":"Q16956136",shop:"clothes"},addTags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",shop:"clothes"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20celio%20RVB.jpg&width=100",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/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"},countryCodes:["at","be","ch","de","hu","nl"],terms:["vögele"],matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCharlotte%20russe.png&width=100",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/Chico's":{name:"Chico's",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChico's%20FAS%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FChristopher%20%26%20Banks%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FClub-monaco-logo.jpg&width=100",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",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://pbs.twimg.com/profile_images/378800000507623403/444cd8e60cf59b6fab58ba06c80c2a6c_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1112588",shop:"clothes"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Cropp":{name:"Cropp",icon:"maki-clothing-store",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",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",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"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/clothes/Damart":{name:"Damart",icon:"maki-clothing-store",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",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://pbs.twimg.com/profile_images/1105077887680548864/MXN9rGjm_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20DEVRED%201902.jpg&width=100",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://pbs.twimg.com/profile_images/1059404541618253824/3amvryNj_bigger.jpg",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/Diverse":{name:"Diverse",icon:"maki-clothing-store",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/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1124235640613351425/ZKhEqGyl_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDressBarn%20new%20logo.gif&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEngbers%20(Unternehmen)%20logo.svg&width=100",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEsprit%20Logo%20neu.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExpress%2C%20Inc.%20logo.svg&width=100",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://pbs.twimg.com/profile_images/1055013284485779458/dtR2OyFc_bigger.jpg",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/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FForever%2021%20logo.png&width=100",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/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGerry%20Weber%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGina%20Laura%20Logo.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGloria%20Jeans.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Guess.jpg&width=100",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://pbs.twimg.com/profile_images/1018723545122131968/mBlwxTN2_bigger.jpg",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",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/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHH%20LOGO%202013.svg&width=100",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",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:[],matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1116351964030341120/DzjEYbxH_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q1257477",shop:"clothes"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",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://pbs.twimg.com/profile_images/981463273836089344/mZoBl9wy_bigger.jpg",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"},terms:["boss"],matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHunkemoeller%20Logo.png&width=100",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"},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/JBC":{name:"JBC",icon:"maki-clothing-store",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://pbs.twimg.com/profile_images/2735852177/8e4633c7fe64dadc067689fa0064c9c6_bigger.jpeg",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://pbs.twimg.com/profile_images/1121360723555299328/6uEb8cP1_bigger.png",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/Jeans Fritz":{name:"Jeans Fritz",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJeans-Fritz-Logo.svg&width=100",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",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",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://pbs.twimg.com/profile_images/1001953978790313984/rZx5Eh6N_bigger.jpg",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:[],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/Justice":{name:"Justice",icon:"maki-clothing-store",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"},countryCodes:["ca","us"],terms:["kate spade","kate spade ny"],matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKiK-Logo.svg&width=100",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",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://pbs.twimg.com/profile_images/1112757964300083208/j-i4NaSr_bigger.png",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"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLevi's%20logo.svg&width=100",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:[],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/M&Co":{name:"M&Co",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/3060281697/0cf4741ed2fcb2ab442637e226a3d538_bigger.jpeg",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/Mango":{name:"Mango",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMango-logo.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarc%20O%E2%80%99Polo%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Mark's":{name:"Mark's",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMark's%20Work%20Wearhouse%20Logo.svg&width=100",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/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/marksandspencerrussia/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q714491",shop:"clothes"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"clothes"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",imageURL:"https://graph.facebook.com/massimodutti/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://pbs.twimg.com/profile_images/1059530620374867970/wCJvqGG5_bigger.jpg",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",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",geometry:["point","area"],tags:{"brand:wikidata":"Q57405513",shop:"clothes"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",clothes:"suits",name:"Men's Wearhouse",shop:"clothes"},terms:["mens warehouse"],matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMexx%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMichael%20Kors%20Logo.svg&width=100",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://pbs.twimg.com/profile_images/1014248943121813505/qNRJq7zh_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2F150707%20NKD%20Logog%20Wikipedia.svg&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1057923508460761088/9Gem24tH_bigger.jpg",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNew%20Yorker.svg&width=100",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://pbs.twimg.com/profile_images/1047405356635344896/fbsYbE_N_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCurrent%20Nordstrom%20Rack%20Logo.jpg&width=100",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/OVS/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/Okaïdi":{name:"Okaïdi",icon:"maki-clothing-store",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FOld%20Navy%20Logo.svg&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FORSAY.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20oysho%20wikipedia.png&width=100",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://pbs.twimg.com/profile_images/763503514890842112/oY_iKSnB_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPalmerslogo.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Peek%20%26%20Cloppenburg.svg&width=100",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",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",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://pbs.twimg.com/profile_images/826031206961647617/L_YJKtfM_bigger.jpg",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/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",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/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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPromod-Boutique%20Francaise.jpg&width=100",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://pbs.twimg.com/profile_images/1065168584450674690/8NL1vlQR_bigger.jpg",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/playitagainsports/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7203029",shop:"clothes"},addTags:{brand:"Puma","brand:wikidata":"Q7203029","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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRainbow-logo.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q7284708",shop:"clothes"},addTags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"},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",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://pbs.twimg.com/profile_images/1131447933407252485/bMfTsmgx_bigger.png",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/Ross":{name:"Ross",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/666413791169503233/rCEE7G_S_bigger.jpg",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:["ross dress for less"],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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSisley%20logo.svg&width=100",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/Springfield":{name:"Springfield",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarca-springfield.png&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/1110919224480931841/ptq3UAwr_bigger.png",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",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",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://pbs.twimg.com/profile_images/1021773831546056704/C5cZqYeP_bigger.jpg",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://pbs.twimg.com/profile_images/578229320994295808/nAHcV1yx_bigger.png",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://pbs.twimg.com/profile_images/1078275977426468866/QgWrQjee_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTakkoLogo.svg&width=100",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://pbs.twimg.com/profile_images/648526811479961600/EcfZDBkl_bigger.png",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTALLY%20WEiJL%20Logo.svg&width=100",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://pbs.twimg.com/profile_images/200694312/Twitter_Logo_TCP_lockup_2995_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q3520257",shop:"clothes"},addTags:{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://pbs.twimg.com/profile_images/1042076860023275523/9qahAU7A_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q152784",shop:"clothes"},addTags:{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",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/Timberland":{name:"Timberland",icon:"maki-clothing-store",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://pbs.twimg.com/profile_images/817443720060506113/MAMMKuhr_bigger.jpg",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://pbs.twimg.com/profile_images/1029280250331627520/VUFItzJv_bigger.jpg",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://pbs.twimg.com/profile_images/1121788834755125248/dla2FNMm_bigger.png",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",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/Triumph":{name:"Triumph",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTriumph%20International%20Logo%202008.svg&width=100",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",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/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUlla%20Popken%20neu.png&width=100",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"},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/BenettonItalia/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"},terms:["benetton"],matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",imageURL:"https://pbs.twimg.com/profile_images/761568776471052289/Wv_Cpxbw_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBS%20DK.JPG&width=100",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/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",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/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWHBM%20Logo.png&width=100",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://pbs.twimg.com/profile_images/633617979469524993/ydbUTjT3_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWibra%20Wallonie%20logo.png&width=100",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/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/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",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/Yamamay":{name:"Yamamay",icon:"maki-clothing-store",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYamamay%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q2599214",shop:"clothes"},addTags:{brand:"Yamamay","brand:wikidata":"Q2599214","brand:wikipedia":"it:Yamamay",name:"Yamamay",shop:"clothes"},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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Mister*lady.jpg&width=100",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://pbs.twimg.com/profile_images/793801428380835840/XsjVskJq_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FS.Oliver.svg&width=100",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",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",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",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"},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"},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: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"},terms:[],matchScore:2,suggestion:true},"shop/confectionery/Jamin":{name:"Jamin",icon:"maki-confectionery",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/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"},terms:[],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"},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",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","lv"],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/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",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"},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://pbs.twimg.com/profile_images/796001828966203392/69ZeL67f_bigger.jpg",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/Chata Polska":{name:"Chata Polska",icon:"fas-shopping-basket",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/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/Co-op (Canada)":{name:"Co-op (Canada)",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",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/Coop Pronto":{name:"Coop Pronto",icon:"fas-shopping-basket",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop.svg&width=100",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/Daisy Mart":{name:"Daisy Mart",icon:"fas-shopping-basket",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",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/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"},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"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Freshmarket":{name:"Freshmarket",icon:"fas-shopping-basket",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/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",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/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",geometry:["point","area"],tags:{"brand:wikidata":"Q6117880",shop:"convenience"},addTags:{brand:"Jacksons","brand:wikidata":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"},countryCodes:["us"],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/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"},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/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"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MarathonPetroleumCorporation/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q458363",shop:"convenience"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/malpkaexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q18431946",shop:"convenience"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"pl:Małpka Express",name:"Małpka Express",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/YourMcColls/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q16997477",shop:"convenience"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},countryCodes:["gb"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Migrolino":{name:"Migrolino",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/migrolino/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q56745088",shop:"convenience"},addTags:{brand:"Migrolino","brand:wikidata":"Q56745088","brand:wikipedia":"de:Migrolino",name:"Migrolino",shop:"convenience"},countryCodes:["ch"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/MiniStop-374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"fas-shopping-basket",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMobil%20logo.svg&width=100",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/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"},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/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 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:["udf"],matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ULesCommercants/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2529029",shop:"convenience"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},countryCodes:["fr"],terms:[],matchScore:2,suggestion:true},"shop/convenience/VinMart+":{name:"VinMart+",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/sieuthivinmart/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q60245505",shop:"convenience"},addTags:{brand:"VinMart","brand:wikidata":"Q60245505","brand:wikipedia":"vi:VinMart",name:"VinMart+",shop:"convenience"},countryCodes:["vn"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Vival":{name:"Vival",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q7937525",shop:"convenience"},addTags:{brand:"Vival","brand:wikidata":"Q7937525","brand:wikipedia":"en:Vival (shop)",name:"Vival",shop:"convenience"},countryCodes:["fr","pe"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/wawa/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5936320",shop:"convenience"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/Weltladen":{name:"Weltladen",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q1640782",shop:"convenience"},addTags:{brand:"Weltladen","brand:wikidata":"Q1640782","brand:wikipedia":"de:Weltladen",name:"Weltladen",shop:"convenience"},countryCodes:["at","ch","de"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/woolworths/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5023980",shop:"convenience"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},countryCodes:["au"],terms:[],matchScore:2,suggestion:true},"shop/convenience/abc (Poland)":{name:"abc (Poland)",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11683985",shop:"convenience"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:Abc (sieć handlowa)",name:"abc",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/ampm/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q306960",shop:"convenience"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},terms:[],matchScore:2,suggestion:true},"shop/convenience/miniピアゴ":{name:"miniピアゴ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11188499",shop:"convenience"},addTags:{brand:"miniピアゴ","brand:en":"mini Piago","brand:ja":"miniピアゴ","brand:wikidata":"Q11188499","brand:wikipedia":"ja:Miniピアゴ",name:"miniピアゴ","name:en":"mini Piago","name:ja":"miniピアゴ",shop:"convenience"},countryCodes:["jp"],terms:["ミニピアゴ"],matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/zabkapolska/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2589061",shop:"convenience"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"pl:Żabka (sieć sklepów)",name:"Żabka",shop:"convenience"},countryCodes:["pl"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ВкусВилл":{name:"ВкусВилл",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/izbenka/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q57271676",shop:"convenience"},addTags:{brand:"ВкусВилл","brand:wikidata":"Q57271676","brand:wikipedia":"ru:Вкусвилл",name:"ВкусВилл",shop:"convenience"},countryCodes:["ru"],terms:[],matchScore:2,suggestion:true},"shop/convenience/Гроздь":{name:"Гроздь",icon:"fas-shopping-basket",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://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSilpo.png&width=100",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",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://graph.facebook.com/MiniStop-374173965530/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1038929",shop:"convenience"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:ja":"ミニストップ","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop","name:ja":"ミニストップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11345131",shop:"convenience"},addTags:{brand:"ヤマザキショップ","brand:ja":"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop","name:ja":"ヤマザキショップ",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"fas-shopping-basket",imageURL:"https://graph.facebook.com/lawson.fanpage/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1557223",shop:"convenience"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:ja":"ローソン","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson","name:ja":"ローソン",shop:"convenience"},countryCodes:["jp"],terms:["ローソン"],matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q11350960",shop:"convenience"},addTags:{brand:"ローソンストア100","brand:en":"LAWSON STORE 100","brand:ja":"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100","name:en":"Lawson Store 100","name:ja":"ローソンストア100",shop:"convenience"},countryCodes:["jp"],terms:[],matchScore:2,suggestion:true},"shop/convenience/ローソン・スリーエフ":{name:"ローソン・スリーエフ",icon:"fas-shopping-basket",geometry:["point","area"],tags:{"brand:wikidata":"Q24866804",shop:"convenience"},addTags:{brand:"ローソン・スリーエフ","brand:en":"LAWSON・Three F","brand:ja":"ローソン・スリーエフ","brand:wikidata":"Q24866804","brand:wikipedia":"ja:ローソン・スリーエフ",name:"ローソン・スリーエフ","name:en":"Lawson・Three F","name:ja":"ローソン・スリーエフ",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/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:["mac"],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/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/Л'Этуаль":{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://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",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/WynnstayGroup/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/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/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/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"},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"},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"},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"},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"},terms:[],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"},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/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"},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"},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"},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"},terms:[],matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",imageURL:"https://graph.facebook.com/shopko/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7501155",shop:"department_store"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},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"},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:[],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://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"},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"},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"},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"},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"},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"},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"},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":{name:"Home Building Centre",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 Depot":{name:"Home Depot",icon:"temaki-tools",imageURL:"https://graph.facebook.com/homedepot/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q864407",shop:"doityourself"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},countryCodes:["ca","mx","us"],terms:["the home depot"],matchScore:2,suggestion:true},"shop/doityourself/Home Hardware Building Centre":{name:"Home Hardware Building Centre",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/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"},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"},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"},terms:[],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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPraktiker%20Logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q680214",shop:"doityourself"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},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"},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/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"},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"},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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FKOMERI%20LOGO.svg&width=100",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",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"},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",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",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/batterieprofessionnelcom-1734242166818176/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"},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"},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"},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/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"},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/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 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/М.Видео":{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"},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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNoimage%20pr.gif&width=100",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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Blumen%20Risse.jpg&width=100",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",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"},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:["pompes funèbres générales"],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"},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://pbs.twimg.com/profile_images/1112819902178582528/GeuCBPI0_bigger.png",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",name:"Arhaus",shop:"furniture"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/furniture/Ashley HomeStore":{name:"Ashley HomeStore",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/793453568288325636/UiWzv4oc_bigger.jpg",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/Black Red White":{name:"Black Red White",icon:"fas-couch",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBob's%20Discount%20Furniture%20Logo.png&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCabinets%20To%20Go%20logo.png&width=100",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://pbs.twimg.com/profile_images/1122801701830955008/6KvpWuQS_bigger.png",geometry:["point","area"],tags:{"brand:wikidata":"Q541134",shop:"furniture"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Crate & Barrel":{name:"Crate & Barrel",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCrateandBarrelLogo.svg&width=100",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"},terms:["crate and barrel"],matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/676402722946621440/S5P4YZXG_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q5204927",shop:"furniture"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20JYSK.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FEthan%20Allen%20Logo.JPG&width=100",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"},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"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/644090357416873984/nuqIAG7O_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHavertys-logo-new.jpg&width=100",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/JYSK":{name:"JYSK",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLOGO%20JYSK.jpg&width=100",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/La-Z-Boy":{name:"La-Z-Boy",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLa-Z-Boy%20Logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Pottery Barn":{name:"Pottery Barn",icon:"fas-couch",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRaymour%20%26%20Flanigan%20logo%202018.jpg&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Restoration Hardware":{name:"Restoration Hardware",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20RH.gif&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Roller":{name:"Roller",icon:"fas-couch",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FROLLER%20Logo.jpg&width=100",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",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://pbs.twimg.com/profile_images/1113810857723609089/CHZevsPZ_bigger.png",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",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"},terms:[],matchScore:2,suggestion:true},"shop/furniture/Urban Barn":{name:"Urban Barn",icon:"fas-couch",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/Williams-Sonoma":{name:"Williams-Sonoma",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/811867470206214144/p1nrNSEb_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q2581220",shop:"furniture"},addTags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"furniture"},countryCodes:["ca","us"],terms:["william sonoma"],matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",imageURL:"https://pbs.twimg.com/profile_images/911049695601991682/HCnF523x_bigger.jpg",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"},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/Magasin-Point-Vert-EST-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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCardfactorylogo.jpg&width=100",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://pbs.twimg.com/profile_images/979391762551668736/CpD6EAk9_bigger.jpg",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/Disney Store":{name:"Disney Store",icon:"maki-gift",imageURL:"https://pbs.twimg.com/profile_images/378800000036541261/d457adabeec5508a3fd78d152896f12d_bigger.png",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:[],matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHallmark%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1521910",shop:"gift"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},terms:[],matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNanu%20Nana%20Logo%20500x417%2002.png&width=100",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/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"},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"},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"},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/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"},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"},terms:[],matchScore:2,suggestion:true},"shop/hairdresser/Sport Clips":{name:"Sport Clips",icon:"temaki-beauty_salon",imageURL:"https://pbs.twimg.com/profile_images/969348279170342913/n2vPf8mc_bigger.jpg",geometry:["point","area"],tags:{"brand:wikidata":"Q7579310",shop:"hairdresser"},addTags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",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"},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"},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/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"},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"},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/1106856523878289408/YgV0vPoe_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"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",imageURL:"https://graph.facebook.com/AmplifonGroupCareers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q477222",shop:"hearing_aids"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},terms:[],matchScore:2,suggestion:true},"shop/hearing_aids/Audika":{name:"Audika",icon:"maki-shop",imageURL:"https://graph.facebook.com/audikafrance/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2870745",shop:"hearing_aids"},addTags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"},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"},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/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/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"},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"},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"},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/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/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/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/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/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/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"},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"},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"},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"},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"},terms:["tiffany","tiffany & co","tiffany and company","tiffany's"],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:wikidata":"Q62393709",name:"Адамас",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"},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"},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"},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",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",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:[],matchScore:2,suggestion:true},"shop/medical_supply/Pofam-Poznań":{name:"Pofam-Poznań",icon:"maki-shop",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"},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:[],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:[],matchScore:2,suggestion:true},"shop/mobile_phone/Bitė":{name:"Bitė",icon:"fas-mobile-alt",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"},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:["wind mobile"],matchScore:2,suggestion:true},"shop/mobile_phone/MTN":{name:"MTN",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MTN/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1813361",shop:"mobile_phone"},addTags:{brand:"MTN","brand:wikidata":"Q1813361","brand:wikipedia":"en:MTN Group",name:"MTN",shop:"mobile_phone"},terms:["agence mtn"],matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/MetroByTMobile/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1925685",shop:"mobile_phone"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"fas-mobile-alt",geometry:["point","area"],tags:{"brand:wikidata":"Q344744",shop:"mobile_phone"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},countryCodes:["de","ir"],terms:["debitel"],matchScore:2,suggestion:true},"shop/mobile_phone/Moov":{name:"Moov",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/moovcotedivoire/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q3323637",shop:"mobile_phone"},addTags:{brand:"Moov","brand:wikidata":"Q3323637","brand:wikipedia":"fr:Moov Côte d'Ivoire",name:"Moov",shop:"mobile_phone"},countryCodes:["ci","tg"],terms:["agence moov"],matchScore:2,suggestion:true},"shop/mobile_phone/Movistar":{name:"Movistar",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/movistar.es/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q967735",shop:"mobile_phone"},addTags:{brand:"Movistar","brand:wikidata":"Q967735","brand:wikipedia":"en:Movistar",name:"Movistar",shop:"mobile_phone"},terms:[],matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"fas-mobile-alt",imageURL:"https://graph.facebook.com/o2uk/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7072246",shop:"mobile_phone"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",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"},terms:["the phone house"],matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"fas-mobile-alt",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPlay%20logo.svg&width=100",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/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"},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/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"},terms:[],matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"fas-compact-disc",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",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"},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",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",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"},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"},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:[],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/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"},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"},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"},countryCodes:["de"],terms:["apollo"],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"},terms:[],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"},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"},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"},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"},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"},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":{name:"Pearle",icon:"maki-optician",imageURL:"https://graph.facebook.com/pearlevision/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2231148",shop:"optician"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},terms:["pearle vision"],matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",imageURL:"https://graph.facebook.com/Specsavers/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q2000610",shop:"optician"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",imageURL:"https://graph.facebook.com/SunglassHut/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q136311",shop:"optician"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",imageURL:"https://graph.facebook.com/synoptiksverige/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q10687541",shop:"optician"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},countryCodes:["se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",imageURL:"https://graph.facebook.com/synsam.se/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q12004589",shop:"optician"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},countryCodes:["fi","no","se"],terms:[],matchScore:2,suggestion:true},"shop/optician/Target Optical":{name:"Target Optical",icon:"maki-optician",geometry:["point","area"],tags:{"brand:wikidata":"Q19903688",shop:"optician"},addTags:{brand:"Target Optical","brand:wikidata":"Q19903688","brand:wikipedia":"en:Target Optical",name:"Target Optical",shop:"optician"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",imageURL:"https://graph.facebook.com/visionexpress/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q7936150",shop:"optician"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},terms:[],matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",imageURL:"https://graph.facebook.com/Visionworks/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q5422607",shop:"optician"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},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/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"},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",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"},terms:[],matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FComex.png&width=100",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",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"},terms:[],matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",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 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"},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"},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/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"},terms:[],matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",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"},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/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"},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/André":{name:"André",icon:"maki-shoe",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/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:[],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/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FHumanic%202013.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q1636668",shop:"shoes"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Hush Puppies":{name:"Hush Puppies",icon:"maki-shoe",imageURL:"https://graph.facebook.com/hushpuppiesglobal/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q1828588",shop:"shoes"},addTags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"},terms:[],matchScore:2,suggestion:true},"shop/shoes/Johnston & Murphy":{name:"Johnston & Murphy",icon:"maki-shoe",imageURL:"https://graph.facebook.com/johnstonmurphy/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q6268615",shop:"shoes"},addTags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"},countryCodes:["ca","us"],terms:[],matchScore:2,suggestion:true},"shop/shoes/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/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/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"},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:[],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"},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:[],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/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",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:[],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:[],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:[],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:[],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"},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:[],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"},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"},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:["pr","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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/8 à Huit":{name:"8 à Huit",icon:"maki-grocery",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",geometry:["point","area"],tags:{"brand:wikidata":"Q3600279",shop:"supermarket"},addTags:{brand:"99 Ranch Market","brand:wikidata":"Q3600279","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",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://pbs.twimg.com/profile_images/996489765544448000/kwXc3FEH_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAdeg%20logo%20gruen%202015.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAcme%20Markets%20lolo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlbert%20Logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlbertsons%20logo.svg&width=100",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:[],matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAldiWorldwideLogo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FALDI%20Nord%20Logo%202015.png&width=100",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://pbs.twimg.com/profile_images/659793335503204352/7J6NiZzm_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FAlnatura-Logo-2017.png&width=100",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",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://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",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/BM":{name:"BM",icon:"maki-grocery",imageURL:"https://graph.facebook.com/BM-Supermercados-147042362658546/picture?type=large",geometry:["point","area"],tags:{"brand:wikidata":"Q62073462",shop:"supermarket"},addTags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBI%E2%80%A2LO-brand.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q4835622",shop:"supermarket"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},countryCodes:["au","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGda%C5%84sk%20ulica%20Pomorska%2024%20(Biedronka).JPG&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBilla-Logo.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBio%20Company%20logo.svg&width=100",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",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",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",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://pbs.twimg.com/profile_images/796001828966203392/69ZeL67f_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FBulk%20Barn%20Logo.jpg&width=100",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",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",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",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/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",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/carrefouritalia/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",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",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 Express":{name:"Carrefour Express",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q2940190",shop:"supermarket"},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:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCarulla%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Chata Polska":{name:"Chata Polska",icon:"maki-grocery",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSaskatoon%20Co-op%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FColes%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FColruyt%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCombi.svg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q2985173",shop:"supermarket"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},countryCodes:["mx","us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FConsum%20Cooperativa.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogocontinente.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop%20Prix.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoop.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCora%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCoto%20superm%20logo.png&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FCub%20Foods.png&width=100",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDenner%20Logo%202014.jpg&width=100",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",geometry:["point","area"],tags:{"brand:wikidata":"Q61994849",shop:"supermarket"},addTags:{brand:"Despensa Familiar","brand:wikidata":"Q61994849",name:"Despensa Familiar",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",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://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDirk%20logo.png&width=100",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://pbs.twimg.com/profile_images/839449686054432768/Udhd8DjK_bigger.jpg",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/E-Center":{name:"E-Center",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FE.Leclerc%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FExtra%20mobillogo.png&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFareway%20Food%20Stores%2C%20Inc-%20company%20logo-%202014-04-03%2017-22.jpg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFarmfoods%20Limited%20Logo.jpg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFood4Less%20logo.svg&width=100",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",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":{name:"Food City",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5465306",shop:"supermarket"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",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 (US)":{name:"FoodLand (US)",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFoodworks-Logo.jpg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFred%20Meyer%20logo.svg&width=100",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/FreshCo":{name:"FreshCo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FFreshCo%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FF%C3%B8tex%20logo.svg&width=100",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",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:website":"http://www.gbarbosa.com.br","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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGiantEagle.svg&width=100",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/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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGroceryoutlet%20logo.png&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q5609934",shop:"supermarket"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20geant%202015%20rvb.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20of%20the%20HEB%20Grocery%20Company%2C%20LP.png&width=100",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",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/Hannaford":{name:"Hannaford",icon:"maki-grocery",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",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://pbs.twimg.com/profile_images/589070024230440960/ZBf4EE6m_bigger.png",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",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIGA%20logo.svg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q3146662",shop:"supermarket"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/998234843736457216/AqtyY1Rc_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FIngles%20Markets%20Logo.svg&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJewel%20Osco%20logo.svg&width=100",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/Joker":{name:"Joker",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJoker%20butikkjede%20norgesgruppen%20joker.jpg&width=100",geometry:["point","area"],tags:{"brand:wikidata":"Q716328",shop:"supermarket"},addTags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",shop:"supermarket"},countryCodes:["no"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FJumbo%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FK%2BK%20Logo.svg&width=100",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/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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",imageURL:"https://pbs.twimg.com/profile_images/829113723746922497/a4882k9S_bigger.jpg",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/Kiwi":{name:"Kiwi",icon:"maki-grocery",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/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:[],matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSupermercados%20La%20anonima%20logo.jpg&width=100",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 Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLandi.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLeader%20Price%202010%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FL%C3%ADder%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FL%C3%ADder%20logo.svg&width=100",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",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",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMPreis%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarket%20Basket%20Logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMarktkauf.svg&width=100",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",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",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://pbs.twimg.com/profile_images/800711981225410560/cuzfS3Pk_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",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","pl"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxima%20logo.svg&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMeijer%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMeny%20butikkjede%20norgesgruppen%20logo.jpg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Merkur.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMetro%20Inc.%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Metro%20Cencosud.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMigros.svg&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMIX%20Markt%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMonoprix%20logo.svg&width=100",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",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://pbs.twimg.com/profile_images/1069883324204769280/cbPhjnwc_bigger.jpg",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNaturalia%20logo.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FGda%C5%84sk%20ulica%20D%C4%85browszczak%C3%B3w%2020%20(logo%20Netto).JPG&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNetto%20Marken-Discount%202018%20logo.svg&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FNorfa%20Logo.svg&width=100",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20de%20Walmart%20Mexico%20y%20Centroamerica.jpg&width=100",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",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",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/PennyDeutschland/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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FPingo%20Doce%20Advertising%2011%20September%202015.JPG&width=100",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",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",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",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",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",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",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/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",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",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",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",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",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",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",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",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://pbs.twimg.com/profile_images/829113387929972737/Ve6U9Jd9_bigger.jpg",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FREMA1000.jpg&width=100",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",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://pbs.twimg.com/profile_images/813782141259497472/inQrmCRf_bigger.jpg",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://pbs.twimg.com/profile_images/1101419025421225984/xsPc8EfW_bigger.jpg",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",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",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Save-On-Foods":{name:"Save-On-Foods",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSave%20On%20Foods%20Logo.svg&width=100",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",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",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://pbs.twimg.com/profile_images/466948326969987072/F66s5ItP_bigger.png",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogoSoriana.PNG&width=100",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",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",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://pbs.twimg.com/profile_images/913035570263314432/JnBRkmWC_bigger.jpg",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSB%20logo%20rektangel%20RGB%20standard.jpg&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTegut%E2%80%A6.svg&width=100",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",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",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://pbs.twimg.com/profile_images/791251254337036288/0VUcaeIf_bigger.jpg",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Todis%20lungo%20verde.jpg&width=100",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",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",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",geometry:["point","area"],tags:{"brand:wikidata":"Q7825137",shop:"supermarket"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},countryCodes:["us"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",imageURL:"https://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogotipo%20Tottus.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FTrader%20Joes%20Logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Edeka.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FLogo%20Dico.png&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnimarc%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FUnimarktLogoNeu.jpg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVolg.svg&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FVons%20logo.svg&width=100",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://pbs.twimg.com/profile_images/1036753874512687104/1ef8sudl_bigger.jpg",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWegmansLogo.svg&width=100",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",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDenns%20Biomarkt%20logo.svg&width=100",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",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://pbs.twimg.com/profile_images/831881850201194496/HxDzAV5x_bigger.jpg",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",geometry:["point","area"],tags:{"brand:wikidata":"Q4721807",shop:"supermarket"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q5518063",shop:"supermarket"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},countryCodes:["gr"],terms:[],matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",geometry:["point","area"],tags:{"brand:wikidata":"Q6783887",shop:"supermarket"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","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:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","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",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",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://pbs.twimg.com/profile_images/877095334316576768/bhQDPUWZ_bigger.jpg",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"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FDixi.gif&width=100",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"},terms:["евроопт market"],matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",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",geometry:["point","area"],tags:{"brand:wikidata":"Q63301903",shop:"supermarket"},addTags:{brand:"Кировский","brand:wikidata":"Q63301903",name:"Кировский",shop:"supermarket"},terms:[],matchScore:2,suggestion:true},"shop/supermarket/Командор":{name:"Командор",icon:"maki-grocery",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",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://pbs.twimg.com/profile_images/1098477357390856192/wILY9KdL_bigger.png",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FRadezh%20logo.png&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSilpo.png&width=100",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FInageya%20Co.%20logo.png&width=100",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",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",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FMaxValu.JPG&width=100",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FYork%20benimaru%20logo.svg&width=100",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",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",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",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/carrefouritalia/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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",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",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",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FSEIYU%20logo.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",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://commons.wikimedia.org/w/index.php?title=Special%3ARedirect%2Ffile%2FWellcome%20Supermarket.svg&width=100",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"},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/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"},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",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:[],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/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","pr","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/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/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"},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"},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/Vianor":{name:"Vianor",icon:"maki-shop",imageURL:"https://graph.facebook.com/VianorNorthAmerica/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 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"},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"},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"},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://graph.facebook.com/dollartree/picture?type=large",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"},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/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"},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"},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"},terms:[],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"},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"},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"},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"},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"},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://graph.facebook.com/blockbuster/picture?type=large",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"},terms:[],matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"temaki-movie_rental",imageURL:"https://pbs.twimg.com/profile_images/1016247734720851968/R9agm3pA_bigger.jpg",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"},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"},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"},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"},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"},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"},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"},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"},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"},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"},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"},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"},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"},terms:["hampton inn","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"},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"},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"},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"},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/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"},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"},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"},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"},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"},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"},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"},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"},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"},terms:[],matchScore:2,suggestion:true}};
24699
24700         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"]};
24701
24702         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"]}};
24703
24704         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..."},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",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",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",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",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"},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"}}},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"}}}};
24705
24706         var quickselect = createCommonjsModule(function (module, exports) {
24707         (function (global, factory) {
24708                 module.exports = factory();
24709         }(commonjsGlobal, (function () {
24710         function quickselect(arr, k, left, right, compare) {
24711             quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
24712         }
24713
24714         function quickselectStep(arr, k, left, right, compare) {
24715
24716             while (right > left) {
24717                 if (right - left > 600) {
24718                     var n = right - left + 1;
24719                     var m = k - left + 1;
24720                     var z = Math.log(n);
24721                     var s = 0.5 * Math.exp(2 * z / 3);
24722                     var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
24723                     var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
24724                     var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
24725                     quickselectStep(arr, k, newLeft, newRight, compare);
24726                 }
24727
24728                 var t = arr[k];
24729                 var i = left;
24730                 var j = right;
24731
24732                 swap(arr, left, k);
24733                 if (compare(arr[right], t) > 0) swap(arr, left, right);
24734
24735                 while (i < j) {
24736                     swap(arr, i, j);
24737                     i++;
24738                     j--;
24739                     while (compare(arr[i], t) < 0) i++;
24740                     while (compare(arr[j], t) > 0) j--;
24741                 }
24742
24743                 if (compare(arr[left], t) === 0) swap(arr, left, j);
24744                 else {
24745                     j++;
24746                     swap(arr, j, right);
24747                 }
24748
24749                 if (j <= k) left = j + 1;
24750                 if (k <= j) right = j - 1;
24751             }
24752         }
24753
24754         function swap(arr, i, j) {
24755             var tmp = arr[i];
24756             arr[i] = arr[j];
24757             arr[j] = tmp;
24758         }
24759
24760         function defaultCompare(a, b) {
24761             return a < b ? -1 : a > b ? 1 : 0;
24762         }
24763
24764         return quickselect;
24765
24766         })));
24767         });
24768
24769         var rbush_1 = rbush;
24770         var default_1 = rbush;
24771
24772
24773
24774         function rbush(maxEntries, format) {
24775             if (!(this instanceof rbush)) return new rbush(maxEntries, format);
24776
24777             // max entries in a node is 9 by default; min node fill is 40% for best performance
24778             this._maxEntries = Math.max(4, maxEntries || 9);
24779             this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
24780
24781             if (format) {
24782                 this._initFormat(format);
24783             }
24784
24785             this.clear();
24786         }
24787
24788         rbush.prototype = {
24789
24790             all: function () {
24791                 return this._all(this.data, []);
24792             },
24793
24794             search: function (bbox) {
24795
24796                 var node = this.data,
24797                     result = [],
24798                     toBBox = this.toBBox;
24799
24800                 if (!intersects$1(bbox, node)) return result;
24801
24802                 var nodesToSearch = [],
24803                     i, len, child, childBBox;
24804
24805                 while (node) {
24806                     for (i = 0, len = node.children.length; i < len; i++) {
24807
24808                         child = node.children[i];
24809                         childBBox = node.leaf ? toBBox(child) : child;
24810
24811                         if (intersects$1(bbox, childBBox)) {
24812                             if (node.leaf) result.push(child);
24813                             else if (contains$4(bbox, childBBox)) this._all(child, result);
24814                             else nodesToSearch.push(child);
24815                         }
24816                     }
24817                     node = nodesToSearch.pop();
24818                 }
24819
24820                 return result;
24821             },
24822
24823             collides: function (bbox) {
24824
24825                 var node = this.data,
24826                     toBBox = this.toBBox;
24827
24828                 if (!intersects$1(bbox, node)) return false;
24829
24830                 var nodesToSearch = [],
24831                     i, len, child, childBBox;
24832
24833                 while (node) {
24834                     for (i = 0, len = node.children.length; i < len; i++) {
24835
24836                         child = node.children[i];
24837                         childBBox = node.leaf ? toBBox(child) : child;
24838
24839                         if (intersects$1(bbox, childBBox)) {
24840                             if (node.leaf || contains$4(bbox, childBBox)) return true;
24841                             nodesToSearch.push(child);
24842                         }
24843                     }
24844                     node = nodesToSearch.pop();
24845                 }
24846
24847                 return false;
24848             },
24849
24850             load: function (data) {
24851                 if (!(data && data.length)) return this;
24852
24853                 if (data.length < this._minEntries) {
24854                     for (var i = 0, len = data.length; i < len; i++) {
24855                         this.insert(data[i]);
24856                     }
24857                     return this;
24858                 }
24859
24860                 // recursively build the tree with the given data from scratch using OMT algorithm
24861                 var node = this._build(data.slice(), 0, data.length - 1, 0);
24862
24863                 if (!this.data.children.length) {
24864                     // save as is if tree is empty
24865                     this.data = node;
24866
24867                 } else if (this.data.height === node.height) {
24868                     // split root if trees have the same height
24869                     this._splitRoot(this.data, node);
24870
24871                 } else {
24872                     if (this.data.height < node.height) {
24873                         // swap trees if inserted one is bigger
24874                         var tmpNode = this.data;
24875                         this.data = node;
24876                         node = tmpNode;
24877                     }
24878
24879                     // insert the small tree into the large tree at appropriate level
24880                     this._insert(node, this.data.height - node.height - 1, true);
24881                 }
24882
24883                 return this;
24884             },
24885
24886             insert: function (item) {
24887                 if (item) this._insert(item, this.data.height - 1);
24888                 return this;
24889             },
24890
24891             clear: function () {
24892                 this.data = createNode([]);
24893                 return this;
24894             },
24895
24896             remove: function (item, equalsFn) {
24897                 if (!item) return this;
24898
24899                 var node = this.data,
24900                     bbox = this.toBBox(item),
24901                     path = [],
24902                     indexes = [],
24903                     i, parent, index, goingUp;
24904
24905                 // depth-first iterative tree traversal
24906                 while (node || path.length) {
24907
24908                     if (!node) { // go up
24909                         node = path.pop();
24910                         parent = path[path.length - 1];
24911                         i = indexes.pop();
24912                         goingUp = true;
24913                     }
24914
24915                     if (node.leaf) { // check current node
24916                         index = findItem(item, node.children, equalsFn);
24917
24918                         if (index !== -1) {
24919                             // item found, remove the item and condense tree upwards
24920                             node.children.splice(index, 1);
24921                             path.push(node);
24922                             this._condense(path);
24923                             return this;
24924                         }
24925                     }
24926
24927                     if (!goingUp && !node.leaf && contains$4(node, bbox)) { // go down
24928                         path.push(node);
24929                         indexes.push(i);
24930                         i = 0;
24931                         parent = node;
24932                         node = node.children[0];
24933
24934                     } else if (parent) { // go right
24935                         i++;
24936                         node = parent.children[i];
24937                         goingUp = false;
24938
24939                     } else node = null; // nothing found
24940                 }
24941
24942                 return this;
24943             },
24944
24945             toBBox: function (item) { return item; },
24946
24947             compareMinX: compareNodeMinX,
24948             compareMinY: compareNodeMinY,
24949
24950             toJSON: function () { return this.data; },
24951
24952             fromJSON: function (data) {
24953                 this.data = data;
24954                 return this;
24955             },
24956
24957             _all: function (node, result) {
24958                 var nodesToSearch = [];
24959                 while (node) {
24960                     if (node.leaf) result.push.apply(result, node.children);
24961                     else nodesToSearch.push.apply(nodesToSearch, node.children);
24962
24963                     node = nodesToSearch.pop();
24964                 }
24965                 return result;
24966             },
24967
24968             _build: function (items, left, right, height) {
24969
24970                 var N = right - left + 1,
24971                     M = this._maxEntries,
24972                     node;
24973
24974                 if (N <= M) {
24975                     // reached leaf level; return leaf
24976                     node = createNode(items.slice(left, right + 1));
24977                     calcBBox(node, this.toBBox);
24978                     return node;
24979                 }
24980
24981                 if (!height) {
24982                     // target height of the bulk-loaded tree
24983                     height = Math.ceil(Math.log(N) / Math.log(M));
24984
24985                     // target number of root entries to maximize storage utilization
24986                     M = Math.ceil(N / Math.pow(M, height - 1));
24987                 }
24988
24989                 node = createNode([]);
24990                 node.leaf = false;
24991                 node.height = height;
24992
24993                 // split the items into M mostly square tiles
24994
24995                 var N2 = Math.ceil(N / M),
24996                     N1 = N2 * Math.ceil(Math.sqrt(M)),
24997                     i, j, right2, right3;
24998
24999                 multiSelect(items, left, right, N1, this.compareMinX);
25000
25001                 for (i = left; i <= right; i += N1) {
25002
25003                     right2 = Math.min(i + N1 - 1, right);
25004
25005                     multiSelect(items, i, right2, N2, this.compareMinY);
25006
25007                     for (j = i; j <= right2; j += N2) {
25008
25009                         right3 = Math.min(j + N2 - 1, right2);
25010
25011                         // pack each entry recursively
25012                         node.children.push(this._build(items, j, right3, height - 1));
25013                     }
25014                 }
25015
25016                 calcBBox(node, this.toBBox);
25017
25018                 return node;
25019             },
25020
25021             _chooseSubtree: function (bbox, node, level, path) {
25022
25023                 var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
25024
25025                 while (true) {
25026                     path.push(node);
25027
25028                     if (node.leaf || path.length - 1 === level) break;
25029
25030                     minArea = minEnlargement = Infinity;
25031
25032                     for (i = 0, len = node.children.length; i < len; i++) {
25033                         child = node.children[i];
25034                         area = bboxArea(child);
25035                         enlargement = enlargedArea(bbox, child) - area;
25036
25037                         // choose entry with the least area enlargement
25038                         if (enlargement < minEnlargement) {
25039                             minEnlargement = enlargement;
25040                             minArea = area < minArea ? area : minArea;
25041                             targetNode = child;
25042
25043                         } else if (enlargement === minEnlargement) {
25044                             // otherwise choose one with the smallest area
25045                             if (area < minArea) {
25046                                 minArea = area;
25047                                 targetNode = child;
25048                             }
25049                         }
25050                     }
25051
25052                     node = targetNode || node.children[0];
25053                 }
25054
25055                 return node;
25056             },
25057
25058             _insert: function (item, level, isNode) {
25059
25060                 var toBBox = this.toBBox,
25061                     bbox = isNode ? item : toBBox(item),
25062                     insertPath = [];
25063
25064                 // find the best node for accommodating the item, saving all nodes along the path too
25065                 var node = this._chooseSubtree(bbox, this.data, level, insertPath);
25066
25067                 // put the item into the node
25068                 node.children.push(item);
25069                 extend$1(node, bbox);
25070
25071                 // split on node overflow; propagate upwards if necessary
25072                 while (level >= 0) {
25073                     if (insertPath[level].children.length > this._maxEntries) {
25074                         this._split(insertPath, level);
25075                         level--;
25076                     } else break;
25077                 }
25078
25079                 // adjust bboxes along the insertion path
25080                 this._adjustParentBBoxes(bbox, insertPath, level);
25081             },
25082
25083             // split overflowed node into two
25084             _split: function (insertPath, level) {
25085
25086                 var node = insertPath[level],
25087                     M = node.children.length,
25088                     m = this._minEntries;
25089
25090                 this._chooseSplitAxis(node, m, M);
25091
25092                 var splitIndex = this._chooseSplitIndex(node, m, M);
25093
25094                 var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
25095                 newNode.height = node.height;
25096                 newNode.leaf = node.leaf;
25097
25098                 calcBBox(node, this.toBBox);
25099                 calcBBox(newNode, this.toBBox);
25100
25101                 if (level) insertPath[level - 1].children.push(newNode);
25102                 else this._splitRoot(node, newNode);
25103             },
25104
25105             _splitRoot: function (node, newNode) {
25106                 // split root node
25107                 this.data = createNode([node, newNode]);
25108                 this.data.height = node.height + 1;
25109                 this.data.leaf = false;
25110                 calcBBox(this.data, this.toBBox);
25111             },
25112
25113             _chooseSplitIndex: function (node, m, M) {
25114
25115                 var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
25116
25117                 minOverlap = minArea = Infinity;
25118
25119                 for (i = m; i <= M - m; i++) {
25120                     bbox1 = distBBox(node, 0, i, this.toBBox);
25121                     bbox2 = distBBox(node, i, M, this.toBBox);
25122
25123                     overlap = intersectionArea(bbox1, bbox2);
25124                     area = bboxArea(bbox1) + bboxArea(bbox2);
25125
25126                     // choose distribution with minimum overlap
25127                     if (overlap < minOverlap) {
25128                         minOverlap = overlap;
25129                         index = i;
25130
25131                         minArea = area < minArea ? area : minArea;
25132
25133                     } else if (overlap === minOverlap) {
25134                         // otherwise choose distribution with minimum area
25135                         if (area < minArea) {
25136                             minArea = area;
25137                             index = i;
25138                         }
25139                     }
25140                 }
25141
25142                 return index;
25143             },
25144
25145             // sorts node children by the best axis for split
25146             _chooseSplitAxis: function (node, m, M) {
25147
25148                 var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
25149                     compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
25150                     xMargin = this._allDistMargin(node, m, M, compareMinX),
25151                     yMargin = this._allDistMargin(node, m, M, compareMinY);
25152
25153                 // if total distributions margin value is minimal for x, sort by minX,
25154                 // otherwise it's already sorted by minY
25155                 if (xMargin < yMargin) node.children.sort(compareMinX);
25156             },
25157
25158             // total margin of all possible split distributions where each node is at least m full
25159             _allDistMargin: function (node, m, M, compare) {
25160
25161                 node.children.sort(compare);
25162
25163                 var toBBox = this.toBBox,
25164                     leftBBox = distBBox(node, 0, m, toBBox),
25165                     rightBBox = distBBox(node, M - m, M, toBBox),
25166                     margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
25167                     i, child;
25168
25169                 for (i = m; i < M - m; i++) {
25170                     child = node.children[i];
25171                     extend$1(leftBBox, node.leaf ? toBBox(child) : child);
25172                     margin += bboxMargin(leftBBox);
25173                 }
25174
25175                 for (i = M - m - 1; i >= m; i--) {
25176                     child = node.children[i];
25177                     extend$1(rightBBox, node.leaf ? toBBox(child) : child);
25178                     margin += bboxMargin(rightBBox);
25179                 }
25180
25181                 return margin;
25182             },
25183
25184             _adjustParentBBoxes: function (bbox, path, level) {
25185                 // adjust bboxes along the given tree path
25186                 for (var i = level; i >= 0; i--) {
25187                     extend$1(path[i], bbox);
25188                 }
25189             },
25190
25191             _condense: function (path) {
25192                 // go through the path, removing empty nodes and updating bboxes
25193                 for (var i = path.length - 1, siblings; i >= 0; i--) {
25194                     if (path[i].children.length === 0) {
25195                         if (i > 0) {
25196                             siblings = path[i - 1].children;
25197                             siblings.splice(siblings.indexOf(path[i]), 1);
25198
25199                         } else this.clear();
25200
25201                     } else calcBBox(path[i], this.toBBox);
25202                 }
25203             },
25204
25205             _initFormat: function (format) {
25206                 // data format (minX, minY, maxX, maxY accessors)
25207
25208                 // uses eval-type function compilation instead of just accepting a toBBox function
25209                 // because the algorithms are very sensitive to sorting functions performance,
25210                 // so they should be dead simple and without inner calls
25211
25212                 var compareArr = ['return a', ' - b', ';'];
25213
25214                 this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
25215                 this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
25216
25217                 this.toBBox = new Function('a',
25218                     'return {minX: a' + format[0] +
25219                     ', minY: a' + format[1] +
25220                     ', maxX: a' + format[2] +
25221                     ', maxY: a' + format[3] + '};');
25222             }
25223         };
25224
25225         function findItem(item, items, equalsFn) {
25226             if (!equalsFn) return items.indexOf(item);
25227
25228             for (var i = 0; i < items.length; i++) {
25229                 if (equalsFn(item, items[i])) return i;
25230             }
25231             return -1;
25232         }
25233
25234         // calculate node's bbox from bboxes of its children
25235         function calcBBox(node, toBBox) {
25236             distBBox(node, 0, node.children.length, toBBox, node);
25237         }
25238
25239         // min bounding rectangle of node children from k to p-1
25240         function distBBox(node, k, p, toBBox, destNode) {
25241             if (!destNode) destNode = createNode(null);
25242             destNode.minX = Infinity;
25243             destNode.minY = Infinity;
25244             destNode.maxX = -Infinity;
25245             destNode.maxY = -Infinity;
25246
25247             for (var i = k, child; i < p; i++) {
25248                 child = node.children[i];
25249                 extend$1(destNode, node.leaf ? toBBox(child) : child);
25250             }
25251
25252             return destNode;
25253         }
25254
25255         function extend$1(a, b) {
25256             a.minX = Math.min(a.minX, b.minX);
25257             a.minY = Math.min(a.minY, b.minY);
25258             a.maxX = Math.max(a.maxX, b.maxX);
25259             a.maxY = Math.max(a.maxY, b.maxY);
25260             return a;
25261         }
25262
25263         function compareNodeMinX(a, b) { return a.minX - b.minX; }
25264         function compareNodeMinY(a, b) { return a.minY - b.minY; }
25265
25266         function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
25267         function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
25268
25269         function enlargedArea(a, b) {
25270             return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
25271                    (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
25272         }
25273
25274         function intersectionArea(a, b) {
25275             var minX = Math.max(a.minX, b.minX),
25276                 minY = Math.max(a.minY, b.minY),
25277                 maxX = Math.min(a.maxX, b.maxX),
25278                 maxY = Math.min(a.maxY, b.maxY);
25279
25280             return Math.max(0, maxX - minX) *
25281                    Math.max(0, maxY - minY);
25282         }
25283
25284         function contains$4(a, b) {
25285             return a.minX <= b.minX &&
25286                    a.minY <= b.minY &&
25287                    b.maxX <= a.maxX &&
25288                    b.maxY <= a.maxY;
25289         }
25290
25291         function intersects$1(a, b) {
25292             return b.minX <= a.maxX &&
25293                    b.minY <= a.maxY &&
25294                    b.maxX >= a.minX &&
25295                    b.maxY >= a.minY;
25296         }
25297
25298         function createNode(children) {
25299             return {
25300                 children: children,
25301                 height: 1,
25302                 leaf: true,
25303                 minX: Infinity,
25304                 minY: Infinity,
25305                 maxX: -Infinity,
25306                 maxY: -Infinity
25307             };
25308         }
25309
25310         // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
25311         // combines selection algorithm with binary divide & conquer approach
25312
25313         function multiSelect(arr, left, right, n, compare) {
25314             var stack = [left, right],
25315                 mid;
25316
25317             while (stack.length) {
25318                 right = stack.pop();
25319                 left = stack.pop();
25320
25321                 if (right - left <= n) continue;
25322
25323                 mid = left + Math.ceil((right - left) / n / 2) * n;
25324                 quickselect(arr, mid, left, right, compare);
25325
25326                 stack.push(left, mid, mid, right);
25327             }
25328         }
25329         rbush_1.default = default_1;
25330
25331         var lineclip_1 = lineclip;
25332
25333         lineclip.polyline = lineclip;
25334         lineclip.polygon = polygonclip;
25335
25336
25337         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
25338         // handle polylines rather than just segments
25339
25340         function lineclip(points, bbox, result) {
25341
25342             var len = points.length,
25343                 codeA = bitCode(points[0], bbox),
25344                 part = [],
25345                 i, a, b, codeB, lastCode;
25346
25347             if (!result) result = [];
25348
25349             for (i = 1; i < len; i++) {
25350                 a = points[i - 1];
25351                 b = points[i];
25352                 codeB = lastCode = bitCode(b, bbox);
25353
25354                 while (true) {
25355
25356                     if (!(codeA | codeB)) { // accept
25357                         part.push(a);
25358
25359                         if (codeB !== lastCode) { // segment went outside
25360                             part.push(b);
25361
25362                             if (i < len - 1) { // start a new line
25363                                 result.push(part);
25364                                 part = [];
25365                             }
25366                         } else if (i === len - 1) {
25367                             part.push(b);
25368                         }
25369                         break;
25370
25371                     } else if (codeA & codeB) { // trivial reject
25372                         break;
25373
25374                     } else if (codeA) { // a outside, intersect with clip edge
25375                         a = intersect$1(a, b, codeA, bbox);
25376                         codeA = bitCode(a, bbox);
25377
25378                     } else { // b outside
25379                         b = intersect$1(a, b, codeB, bbox);
25380                         codeB = bitCode(b, bbox);
25381                     }
25382                 }
25383
25384                 codeA = lastCode;
25385             }
25386
25387             if (part.length) result.push(part);
25388
25389             return result;
25390         }
25391
25392         // Sutherland-Hodgeman polygon clipping algorithm
25393
25394         function polygonclip(points, bbox) {
25395
25396             var result, edge, prev, prevInside, i, p, inside;
25397
25398             // clip against each side of the clip rectangle
25399             for (edge = 1; edge <= 8; edge *= 2) {
25400                 result = [];
25401                 prev = points[points.length - 1];
25402                 prevInside = !(bitCode(prev, bbox) & edge);
25403
25404                 for (i = 0; i < points.length; i++) {
25405                     p = points[i];
25406                     inside = !(bitCode(p, bbox) & edge);
25407
25408                     // if segment goes through the clip window, add an intersection
25409                     if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
25410
25411                     if (inside) result.push(p); // add a point if it's inside
25412
25413                     prev = p;
25414                     prevInside = inside;
25415                 }
25416
25417                 points = result;
25418
25419                 if (!points.length) break;
25420             }
25421
25422             return result;
25423         }
25424
25425         // intersect a segment against one of the 4 lines that make up the bbox
25426
25427         function intersect$1(a, b, edge, bbox) {
25428             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
25429                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
25430                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
25431                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
25432                    null;
25433         }
25434
25435         // bit code reflects the point position relative to the bbox:
25436
25437         //         left  mid  right
25438         //    top  1001  1000  1010
25439         //    mid  0001  0000  0010
25440         // bottom  0101  0100  0110
25441
25442         function bitCode(p, bbox) {
25443             var code = 0;
25444
25445             if (p[0] < bbox[0]) code |= 1; // left
25446             else if (p[0] > bbox[2]) code |= 2; // right
25447
25448             if (p[1] < bbox[1]) code |= 4; // bottom
25449             else if (p[1] > bbox[3]) code |= 8; // top
25450
25451             return code;
25452         }
25453
25454         var whichPolygon_1 = whichPolygon;
25455
25456         function whichPolygon(data) {
25457             var bboxes = [];
25458             for (var i = 0; i < data.features.length; i++) {
25459                 var feature = data.features[i];
25460                 var coords = feature.geometry.coordinates;
25461
25462                 if (feature.geometry.type === 'Polygon') {
25463                     bboxes.push(treeItem(coords, feature.properties));
25464
25465                 } else if (feature.geometry.type === 'MultiPolygon') {
25466                     for (var j = 0; j < coords.length; j++) {
25467                         bboxes.push(treeItem(coords[j], feature.properties));
25468                     }
25469                 }
25470             }
25471
25472             var tree = rbush_1().load(bboxes);
25473
25474             function query(p, multi) {
25475                 var output = [],
25476                     result = tree.search({
25477                         minX: p[0],
25478                         minY: p[1],
25479                         maxX: p[0],
25480                         maxY: p[1]
25481                     });
25482                 for (var i = 0; i < result.length; i++) {
25483                     if (insidePolygon(result[i].coords, p)) {
25484                         if (multi)
25485                             output.push(result[i].props);
25486                         else
25487                             return result[i].props;
25488                     }
25489                 }
25490                 return multi && output.length ? output : null;
25491             }
25492
25493             query.tree = tree;
25494             query.bbox = function queryBBox(bbox) {
25495                 var output = [];
25496                 var result = tree.search({
25497                     minX: bbox[0],
25498                     minY: bbox[1],
25499                     maxX: bbox[2],
25500                     maxY: bbox[3]
25501                 });
25502                 for (var i = 0; i < result.length; i++) {
25503                     if (polygonIntersectsBBox(result[i].coords, bbox)) {
25504                         output.push(result[i].props);
25505                     }
25506                 }
25507                 return output;
25508             };
25509
25510             return query;
25511         }
25512
25513         function polygonIntersectsBBox(polygon, bbox) {
25514             var bboxCenter = [
25515                 (bbox[0] + bbox[2]) / 2,
25516                 (bbox[1] + bbox[3]) / 2
25517             ];
25518             if (insidePolygon(polygon, bboxCenter)) return true;
25519             for (var i = 0; i < polygon.length; i++) {
25520                 if (lineclip_1(polygon[i], bbox).length > 0) return true;
25521             }
25522             return false;
25523         }
25524
25525         // ray casting algorithm for detecting if point is in polygon
25526         function insidePolygon(rings, p) {
25527             var inside = false;
25528             for (var i = 0, len = rings.length; i < len; i++) {
25529                 var ring = rings[i];
25530                 for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
25531                     if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
25532                 }
25533             }
25534             return inside;
25535         }
25536
25537         function rayIntersect(p, p1, p2) {
25538             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]);
25539         }
25540
25541         function treeItem(coords, props) {
25542             var item = {
25543                 minX: Infinity,
25544                 minY: Infinity,
25545                 maxX: -Infinity,
25546                 maxY: -Infinity,
25547                 coords: coords,
25548                 props: props
25549             };
25550
25551             for (var i = 0; i < coords[0].length; i++) {
25552                 var p = coords[0][i];
25553                 item.minX = Math.min(item.minX, p[0]);
25554                 item.minY = Math.min(item.minY, p[1]);
25555                 item.maxX = Math.max(item.maxX, p[0]);
25556                 item.maxY = Math.max(item.maxY, p[1]);
25557             }
25558             return item;
25559         }
25560
25561         // index the osm-community-index
25562         var ociFeatureCollection = Object.values(features$2).map(function(feature) {
25563             // workaround for which-polygon: only supports `properties`, not `id`
25564             // https://github.com/mapbox/which-polygon/pull/6
25565             feature.properties = {
25566                 id: feature.id,
25567                 area: d3_geoArea(feature)   // also precompute areas
25568             };
25569             return feature;
25570         });
25571
25572
25573         var data = {
25574             community: {
25575                 features: features$2,
25576                 resources: resources,
25577                 query: whichPolygon_1({
25578                     type: 'FeatureCollection',
25579                     features: ociFeatureCollection
25580                 })
25581             },
25582             imagery: dataImagery,  //legacy
25583             presets: {
25584                 presets: presets,
25585                 defaults: defaults,
25586                 categories: categories,
25587                 fields: fields
25588             }
25589         };
25590
25591         // http://2ality.com/2015/01/es6-set-operations.html
25592
25593         // Difference (a \ b): create a set that contains those elements of set a that are not in set b.
25594         // This operation is also sometimes called minus (-).
25595         // var a = [1,2,3];
25596         // var b = [4,3,2];
25597         // utilArrayDifference(a, b)
25598         //   [1]
25599         // utilArrayDifference(b, a)
25600         //   [4]
25601         function utilArrayDifference(a, b) {
25602             var other = new Set(b);
25603             return Array.from(new Set(a))
25604                 .filter(function(v) { return !other.has(v); });
25605         }
25606
25607         // Intersection (a ∩ b): create a set that contains those elements of set a that are also in set b.
25608         // var a = [1,2,3];
25609         // var b = [4,3,2];
25610         // utilArrayIntersection(a, b)
25611         //   [2,3]
25612         function utilArrayIntersection(a, b) {
25613             var other = new Set(b);
25614             return Array.from(new Set(a))
25615                 .filter(function(v) { return other.has(v); });
25616         }
25617
25618         // Union (a ∪ b): create a set that contains the elements of both set a and set b.
25619         // var a = [1,2,3];
25620         // var b = [4,3,2];
25621         // utilArrayUnion(a, b)
25622         //   [1,2,3,4]
25623         function utilArrayUnion(a, b) {
25624             var result = new Set(a);
25625             b.forEach(function(v) { result.add(v); });
25626             return Array.from(result);
25627         }
25628
25629         // Returns an Array with all the duplicates removed
25630         // var a = [1,1,2,3,3];
25631         // utilArrayUniq(a)
25632         //   [1,2,3]
25633         function utilArrayUniq(a) {
25634             return Array.from(new Set(a));
25635         }
25636
25637
25638         // Splits array into chunks of given chunk size
25639         // var a = [1,2,3,4,5,6,7];
25640         // utilArrayChunk(a, 3);
25641         //   [[1,2,3],[4,5,6],[7]];
25642         function utilArrayChunk(a, chunkSize) {
25643             if (!chunkSize || chunkSize < 0) return [a.slice()];
25644
25645             var result = new Array(Math.ceil(a.length / chunkSize));
25646             return Array.from(result, function(item, i) {
25647                 return a.slice(i * chunkSize, i * chunkSize + chunkSize);
25648             });
25649         }
25650
25651
25652         // Flattens two level array into a single level
25653         // var a = [[1,2,3],[4,5,6],[7]];
25654         // utilArrayFlatten(a);
25655         //   [1,2,3,4,5,6,7];
25656         function utilArrayFlatten(a) {
25657             return a.reduce(function(acc, val) {
25658                 return acc.concat(val);
25659             }, []);
25660         }
25661
25662
25663         // Groups the items of the Array according to the given key
25664         // `key` can be passed as a property or as a key function
25665         //
25666         // var pets = [
25667         //     { type: 'Dog', name: 'Spot' },
25668         //     { type: 'Cat', name: 'Tiger' },
25669         //     { type: 'Dog', name: 'Rover' },
25670         //     { type: 'Cat', name: 'Leo' }
25671         // ];
25672         //
25673         // utilArrayGroupBy(pets, 'type')
25674         //   {
25675         //     'Dog': [{type: 'Dog', name: 'Spot'}, {type: 'Dog', name: 'Rover'}],
25676         //     'Cat': [{type: 'Cat', name: 'Tiger'}, {type: 'Cat', name: 'Leo'}]
25677         //   }
25678         //
25679         // utilArrayGroupBy(pets, function(item) { return item.name.length; })
25680         //   {
25681         //     3: [{type: 'Cat', name: 'Leo'}],
25682         //     4: [{type: 'Dog', name: 'Spot'}],
25683         //     5: [{type: 'Cat', name: 'Tiger'}, {type: 'Dog', name: 'Rover'}]
25684         //   }
25685         function utilArrayGroupBy(a, key) {
25686             return a.reduce(function(acc, item) {
25687                 var group = (typeof key === 'function') ? key(item) : item[key];
25688                 (acc[group] = acc[group] || []).push(item);
25689                 return acc;
25690             }, {});
25691         }
25692
25693
25694         // Returns an Array with all the duplicates removed
25695         // where uniqueness determined by the given key
25696         // `key` can be passed as a property or as a key function
25697         //
25698         // var pets = [
25699         //     { type: 'Dog', name: 'Spot' },
25700         //     { type: 'Cat', name: 'Tiger' },
25701         //     { type: 'Dog', name: 'Rover' },
25702         //     { type: 'Cat', name: 'Leo' }
25703         // ];
25704         //
25705         // utilArrayUniqBy(pets, 'type')
25706         //   [
25707         //     { type: 'Dog', name: 'Spot' },
25708         //     { type: 'Cat', name: 'Tiger' }
25709         //   ]
25710         //
25711         // utilArrayUniqBy(pets, function(item) { return item.name.length; })
25712         //   [
25713         //     { type: 'Dog', name: 'Spot' },
25714         //     { type: 'Cat', name: 'Tiger' },
25715         //     { type: 'Cat', name: 'Leo' }
25716         //   }
25717         function utilArrayUniqBy(a, key) {
25718             var seen = new Set();
25719             return a.reduce(function(acc, item) {
25720                 var val = (typeof key === 'function') ? key(item) : item[key];
25721                 if (val && !seen.has(val)) {
25722                     seen.add(val);
25723                     acc.push(item);
25724                 }
25725                 return acc;
25726             }, []);
25727         }
25728
25729         var remove$1 = removeDiacritics;
25730
25731         var replacementList = [
25732           {
25733             base: ' ',
25734             chars: "\u00A0",
25735           }, {
25736             base: '0',
25737             chars: "\u07C0",
25738           }, {
25739             base: 'A',
25740             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",
25741           }, {
25742             base: 'AA',
25743             chars: "\uA732",
25744           }, {
25745             base: 'AE',
25746             chars: "\u00C6\u01FC\u01E2",
25747           }, {
25748             base: 'AO',
25749             chars: "\uA734",
25750           }, {
25751             base: 'AU',
25752             chars: "\uA736",
25753           }, {
25754             base: 'AV',
25755             chars: "\uA738\uA73A",
25756           }, {
25757             base: 'AY',
25758             chars: "\uA73C",
25759           }, {
25760             base: 'B',
25761             chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
25762           }, {
25763             base: 'C',
25764             chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
25765           }, {
25766             base: 'D',
25767             chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
25768           }, {
25769             base: 'Dh',
25770             chars: "\u00D0",
25771           }, {
25772             base: 'DZ',
25773             chars: "\u01F1\u01C4",
25774           }, {
25775             base: 'Dz',
25776             chars: "\u01F2\u01C5",
25777           }, {
25778             base: 'E',
25779             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",
25780           }, {
25781             base: 'F',
25782             chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
25783           }, {
25784             base: 'G',
25785             chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
25786           }, {
25787             base: 'H',
25788             chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
25789           }, {
25790             base: 'I',
25791             chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
25792           }, {
25793             base: 'J',
25794             chars: "\u24BF\uFF2A\u0134\u0248\u0237",
25795           }, {
25796             base: 'K',
25797             chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
25798           }, {
25799             base: 'L',
25800             chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
25801           }, {
25802             base: 'LJ',
25803             chars: "\u01C7",
25804           }, {
25805             base: 'Lj',
25806             chars: "\u01C8",
25807           }, {
25808             base: 'M',
25809             chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
25810           }, {
25811             base: 'N',
25812             chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
25813           }, {
25814             base: 'NJ',
25815             chars: "\u01CA",
25816           }, {
25817             base: 'Nj',
25818             chars: "\u01CB",
25819           }, {
25820             base: 'O',
25821             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",
25822           }, {
25823             base: 'OE',
25824             chars: "\u0152",
25825           }, {
25826             base: 'OI',
25827             chars: "\u01A2",
25828           }, {
25829             base: 'OO',
25830             chars: "\uA74E",
25831           }, {
25832             base: 'OU',
25833             chars: "\u0222",
25834           }, {
25835             base: 'P',
25836             chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
25837           }, {
25838             base: 'Q',
25839             chars: "\u24C6\uFF31\uA756\uA758\u024A",
25840           }, {
25841             base: 'R',
25842             chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
25843           }, {
25844             base: 'S',
25845             chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
25846           }, {
25847             base: 'T',
25848             chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
25849           }, {
25850             base: 'Th',
25851             chars: "\u00DE",
25852           }, {
25853             base: 'TZ',
25854             chars: "\uA728",
25855           }, {
25856             base: 'U',
25857             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",
25858           }, {
25859             base: 'V',
25860             chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
25861           }, {
25862             base: 'VY',
25863             chars: "\uA760",
25864           }, {
25865             base: 'W',
25866             chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
25867           }, {
25868             base: 'X',
25869             chars: "\u24CD\uFF38\u1E8A\u1E8C",
25870           }, {
25871             base: 'Y',
25872             chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
25873           }, {
25874             base: 'Z',
25875             chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
25876           }, {
25877             base: 'a',
25878             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",
25879           }, {
25880             base: 'aa',
25881             chars: "\uA733",
25882           }, {
25883             base: 'ae',
25884             chars: "\u00E6\u01FD\u01E3",
25885           }, {
25886             base: 'ao',
25887             chars: "\uA735",
25888           }, {
25889             base: 'au',
25890             chars: "\uA737",
25891           }, {
25892             base: 'av',
25893             chars: "\uA739\uA73B",
25894           }, {
25895             base: 'ay',
25896             chars: "\uA73D",
25897           }, {
25898             base: 'b',
25899             chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
25900           }, {
25901             base: 'c',
25902             chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
25903           }, {
25904             base: 'd',
25905             chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
25906           }, {
25907             base: 'dh',
25908             chars: "\u00F0",
25909           }, {
25910             base: 'dz',
25911             chars: "\u01F3\u01C6",
25912           }, {
25913             base: 'e',
25914             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",
25915           }, {
25916             base: 'f',
25917             chars: "\u24D5\uFF46\u1E1F\u0192",
25918           }, {
25919             base: 'ff',
25920             chars: "\uFB00",
25921           }, {
25922             base: 'fi',
25923             chars: "\uFB01",
25924           }, {
25925             base: 'fl',
25926             chars: "\uFB02",
25927           }, {
25928             base: 'ffi',
25929             chars: "\uFB03",
25930           }, {
25931             base: 'ffl',
25932             chars: "\uFB04",
25933           }, {
25934             base: 'g',
25935             chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
25936           }, {
25937             base: 'h',
25938             chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
25939           }, {
25940             base: 'hv',
25941             chars: "\u0195",
25942           }, {
25943             base: 'i',
25944             chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
25945           }, {
25946             base: 'j',
25947             chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
25948           }, {
25949             base: 'k',
25950             chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
25951           }, {
25952             base: 'l',
25953             chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
25954           }, {
25955             base: 'lj',
25956             chars: "\u01C9",
25957           }, {
25958             base: 'm',
25959             chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
25960           }, {
25961             base: 'n',
25962             chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
25963           }, {
25964             base: 'nj',
25965             chars: "\u01CC",
25966           }, {
25967             base: 'o',
25968             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",
25969           }, {
25970             base: 'oe',
25971             chars: "\u0153",
25972           }, {
25973             base: 'oi',
25974             chars: "\u01A3",
25975           }, {
25976             base: 'oo',
25977             chars: "\uA74F",
25978           }, {
25979             base: 'ou',
25980             chars: "\u0223",
25981           }, {
25982             base: 'p',
25983             chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
25984           }, {
25985             base: 'q',
25986             chars: "\u24E0\uFF51\u024B\uA757\uA759",
25987           }, {
25988             base: 'r',
25989             chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
25990           }, {
25991             base: 's',
25992             chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
25993           }, {
25994             base: 'ss',
25995             chars: "\xDF",
25996           }, {
25997             base: 't',
25998             chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
25999           }, {
26000             base: 'th',
26001             chars: "\u00FE",
26002           }, {
26003             base: 'tz',
26004             chars: "\uA729",
26005           }, {
26006             base: 'u',
26007             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",
26008           }, {
26009             base: 'v',
26010             chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
26011           }, {
26012             base: 'vy',
26013             chars: "\uA761",
26014           }, {
26015             base: 'w',
26016             chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
26017           }, {
26018             base: 'x',
26019             chars: "\u24E7\uFF58\u1E8B\u1E8D",
26020           }, {
26021             base: 'y',
26022             chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
26023           }, {
26024             base: 'z',
26025             chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
26026           }
26027         ];
26028
26029         var diacriticsMap = {};
26030         for (var i$1 = 0; i$1 < replacementList.length; i$1 += 1) {
26031           var chars = replacementList[i$1].chars;
26032           for (var j = 0; j < chars.length; j += 1) {
26033             diacriticsMap[chars[j]] = replacementList[i$1].base;
26034           }
26035         }
26036
26037         function removeDiacritics(str) {
26038           return str.replace(/[^\u0000-\u007e]/g, function(c) {
26039             return diacriticsMap[c] || c;
26040           });
26041         }
26042
26043         var replacementList_1 = replacementList;
26044         var diacriticsMap_1 = diacriticsMap;
26045
26046         var diacritics = {
26047                 remove: remove$1,
26048                 replacementList: replacementList_1,
26049                 diacriticsMap: diacriticsMap_1
26050         };
26051
26052         var isArabic_1 = createCommonjsModule(function (module, exports) {
26053         Object.defineProperty(exports, "__esModule", { value: true });
26054         var arabicBlocks = [
26055             [0x0600, 0x06FF],
26056             [0x0750, 0x077F],
26057             [0x08A0, 0x08FF],
26058             [0xFB50, 0xFDFF],
26059             [0xFE70, 0xFEFF],
26060             [0x10E60, 0x10E7F],
26061             [0x1EC70, 0x1ECBF],
26062             [0x1EE00, 0x1EEFF] // Mathematical Alphabetic symbols https://www.unicode.org/charts/PDF/U1EE00.pdf
26063         ];
26064         function isArabic(char) {
26065             if (char.length > 1) {
26066                 // allow the newer chars?
26067                 throw new Error('isArabic works on only one-character strings');
26068             }
26069             var code = char.charCodeAt(0);
26070             for (var i = 0; i < arabicBlocks.length; i++) {
26071                 var block = arabicBlocks[i];
26072                 if (code >= block[0] && code <= block[1]) {
26073                     return true;
26074                 }
26075             }
26076             return false;
26077         }
26078         exports.isArabic = isArabic;
26079         function isMath(char) {
26080             if (char.length > 2) {
26081                 // allow the newer chars?
26082                 throw new Error('isMath works on only one-character strings');
26083             }
26084             var code = char.charCodeAt(0);
26085             return (code >= 0x660 && code <= 0x66C);
26086         }
26087         exports.isMath = isMath;
26088         });
26089
26090         unwrapExports(isArabic_1);
26091         var isArabic_2 = isArabic_1.isArabic;
26092         var isArabic_3 = isArabic_1.isMath;
26093
26094         var unicodeArabic = createCommonjsModule(function (module, exports) {
26095         Object.defineProperty(exports, "__esModule", { value: true });
26096         var arabicReference = {
26097             "alef": {
26098                 "normal": [
26099                     "\u0627"
26100                 ],
26101                 "madda_above": {
26102                     "normal": [
26103                         "\u0627\u0653",
26104                         "\u0622"
26105                     ],
26106                     "isolated": "\uFE81",
26107                     "final": "\uFE82"
26108                 },
26109                 "hamza_above": {
26110                     "normal": [
26111                         "\u0627\u0654",
26112                         "\u0623"
26113                     ],
26114                     "isolated": "\uFE83",
26115                     "final": "\uFE84"
26116                 },
26117                 "hamza_below": {
26118                     "normal": [
26119                         "\u0627\u0655",
26120                         "\u0625"
26121                     ],
26122                     "isolated": "\uFE87",
26123                     "final": "\uFE88"
26124                 },
26125                 "wasla": {
26126                     "normal": "\u0671",
26127                     "isolated": "\uFB50",
26128                     "final": "\uFB51"
26129                 },
26130                 "wavy_hamza_above": [
26131                     "\u0672"
26132                 ],
26133                 "wavy_hamza_below": [
26134                     "\u0627\u065F",
26135                     "\u0673"
26136                 ],
26137                 "high_hamza": [
26138                     "\u0675",
26139                     "\u0627\u0674"
26140                 ],
26141                 "indic_two_above": [
26142                     "\u0773"
26143                 ],
26144                 "indic_three_above": [
26145                     "\u0774"
26146                 ],
26147                 "fathatan": {
26148                     "normal": [
26149                         "\u0627\u064B"
26150                     ],
26151                     "final": "\uFD3C",
26152                     "isolated": "\uFD3D"
26153                 },
26154                 "isolated": "\uFE8D",
26155                 "final": "\uFE8E"
26156             },
26157             "beh": {
26158                 "normal": [
26159                     "\u0628"
26160                 ],
26161                 "dotless": [
26162                     "\u066E"
26163                 ],
26164                 "three_dots_horizontally_below": [
26165                     "\u0750"
26166                 ],
26167                 "dot_below_three_dots_above": [
26168                     "\u0751"
26169                 ],
26170                 "three_dots_pointing_upwards_below": [
26171                     "\u0752"
26172                 ],
26173                 "three_dots_pointing_upwards_below_two_dots_above": [
26174                     "\u0753"
26175                 ],
26176                 "two_dots_below_dot_above": [
26177                     "\u0754"
26178                 ],
26179                 "inverted_small_v_below": [
26180                     "\u0755"
26181                 ],
26182                 "small_v": [
26183                     "\u0756"
26184                 ],
26185                 "small_v_below": [
26186                     "\u08A0"
26187                 ],
26188                 "hamza_above": [
26189                     "\u08A1"
26190                 ],
26191                 "small_meem_above": [
26192                     "\u08B6"
26193                 ],
26194                 "isolated": "\uFE8F",
26195                 "final": "\uFE90",
26196                 "initial": "\uFE91",
26197                 "medial": "\uFE92"
26198             },
26199             "teh marbuta": {
26200                 "normal": [
26201                     "\u0629"
26202                 ],
26203                 "isolated": "\uFE93",
26204                 "final": "\uFE94"
26205             },
26206             "teh": {
26207                 "normal": [
26208                     "\u062A"
26209                 ],
26210                 "ring": [
26211                     "\u067C"
26212                 ],
26213                 "three_dots_above_downwards": [
26214                     "\u067D"
26215                 ],
26216                 "small_teh_above": [
26217                     "\u08B8"
26218                 ],
26219                 "isolated": "\uFE95",
26220                 "final": "\uFE96",
26221                 "initial": "\uFE97",
26222                 "medial": "\uFE98"
26223             },
26224             "theh": {
26225                 "normal": [
26226                     "\u062B"
26227                 ],
26228                 "isolated": "\uFE99",
26229                 "final": "\uFE9A",
26230                 "initial": "\uFE9B",
26231                 "medial": "\uFE9C"
26232             },
26233             "jeem": {
26234                 "normal": [
26235                     "\u062C"
26236                 ],
26237                 "two_dots_above": [
26238                     "\u08A2"
26239                 ],
26240                 "isolated": "\uFE9D",
26241                 "final": "\uFE9E",
26242                 "initial": "\uFE9F",
26243                 "medial": "\uFEA0"
26244             },
26245             "hah": {
26246                 "normal": [
26247                     "\u062D"
26248                 ],
26249                 "hamza_above": [
26250                     "\u0681"
26251                 ],
26252                 "two_dots_vertical_above": [
26253                     "\u0682"
26254                 ],
26255                 "three_dots_above": [
26256                     "\u0685"
26257                 ],
26258                 "two_dots_above": [
26259                     "\u0757"
26260                 ],
26261                 "three_dots_pointing_upwards_below": [
26262                     "\u0758"
26263                 ],
26264                 "small_tah_below": [
26265                     "\u076E"
26266                 ],
26267                 "small_tah_two_dots": [
26268                     "\u076F"
26269                 ],
26270                 "small_tah_above": [
26271                     "\u0772"
26272                 ],
26273                 "indic_four_below": [
26274                     "\u077C"
26275                 ],
26276                 "isolated": "\uFEA1",
26277                 "final": "\uFEA2",
26278                 "initial": "\uFEA3",
26279                 "medial": "\uFEA4"
26280             },
26281             "khah": {
26282                 "normal": [
26283                     "\u062E"
26284                 ],
26285                 "isolated": "\uFEA5",
26286                 "final": "\uFEA6",
26287                 "initial": "\uFEA7",
26288                 "medial": "\uFEA8"
26289             },
26290             "dal": {
26291                 "normal": [
26292                     "\u062F"
26293                 ],
26294                 "ring": [
26295                     "\u0689"
26296                 ],
26297                 "dot_below": [
26298                     "\u068A"
26299                 ],
26300                 "dot_below_small_tah": [
26301                     "\u068B"
26302                 ],
26303                 "three_dots_above_downwards": [
26304                     "\u068F"
26305                 ],
26306                 "four_dots_above": [
26307                     "\u0690"
26308                 ],
26309                 "inverted_v": [
26310                     "\u06EE"
26311                 ],
26312                 "two_dots_vertically_below_small_tah": [
26313                     "\u0759"
26314                 ],
26315                 "inverted_small_v_below": [
26316                     "\u075A"
26317                 ],
26318                 "three_dots_below": [
26319                     "\u08AE"
26320                 ],
26321                 "isolated": "\uFEA9",
26322                 "final": "\uFEAA"
26323             },
26324             "thal": {
26325                 "normal": [
26326                     "\u0630"
26327                 ],
26328                 "isolated": "\uFEAB",
26329                 "final": "\uFEAC"
26330             },
26331             "reh": {
26332                 "normal": [
26333                     "\u0631"
26334                 ],
26335                 "small_v": [
26336                     "\u0692"
26337                 ],
26338                 "ring": [
26339                     "\u0693"
26340                 ],
26341                 "dot_below": [
26342                     "\u0694"
26343                 ],
26344                 "small_v_below": [
26345                     "\u0695"
26346                 ],
26347                 "dot_below_dot_above": [
26348                     "\u0696"
26349                 ],
26350                 "two_dots_above": [
26351                     "\u0697"
26352                 ],
26353                 "four_dots_above": [
26354                     "\u0699"
26355                 ],
26356                 "inverted_v": [
26357                     "\u06EF"
26358                 ],
26359                 "stroke": [
26360                     "\u075B"
26361                 ],
26362                 "two_dots_vertically_above": [
26363                     "\u076B"
26364                 ],
26365                 "hamza_above": [
26366                     "\u076C"
26367                 ],
26368                 "small_tah_two_dots": [
26369                     "\u0771"
26370                 ],
26371                 "loop": [
26372                     "\u08AA"
26373                 ],
26374                 "small_noon_above": [
26375                     "\u08B9"
26376                 ],
26377                 "isolated": "\uFEAD",
26378                 "final": "\uFEAE"
26379             },
26380             "zain": {
26381                 "normal": [
26382                     "\u0632"
26383                 ],
26384                 "inverted_v_above": [
26385                     "\u08B2"
26386                 ],
26387                 "isolated": "\uFEAF",
26388                 "final": "\uFEB0"
26389             },
26390             "seen": {
26391                 "normal": [
26392                     "\u0633"
26393                 ],
26394                 "dot_below_dot_above": [
26395                     "\u069A"
26396                 ],
26397                 "three_dots_below": [
26398                     "\u069B"
26399                 ],
26400                 "three_dots_below_three_dots_above": [
26401                     "\u069C"
26402                 ],
26403                 "four_dots_above": [
26404                     "\u075C"
26405                 ],
26406                 "two_dots_vertically_above": [
26407                     "\u076D"
26408                 ],
26409                 "small_tah_two_dots": [
26410                     "\u0770"
26411                 ],
26412                 "indic_four_above": [
26413                     "\u077D"
26414                 ],
26415                 "inverted_v": [
26416                     "\u077E"
26417                 ],
26418                 "isolated": "\uFEB1",
26419                 "final": "\uFEB2",
26420                 "initial": "\uFEB3",
26421                 "medial": "\uFEB4"
26422             },
26423             "sheen": {
26424                 "normal": [
26425                     "\u0634"
26426                 ],
26427                 "dot_below": [
26428                     "\u06FA"
26429                 ],
26430                 "isolated": "\uFEB5",
26431                 "final": "\uFEB6",
26432                 "initial": "\uFEB7",
26433                 "medial": "\uFEB8"
26434             },
26435             "sad": {
26436                 "normal": [
26437                     "\u0635"
26438                 ],
26439                 "two_dots_below": [
26440                     "\u069D"
26441                 ],
26442                 "three_dots_above": [
26443                     "\u069E"
26444                 ],
26445                 "three_dots_below": [
26446                     "\u08AF"
26447                 ],
26448                 "isolated": "\uFEB9",
26449                 "final": "\uFEBA",
26450                 "initial": "\uFEBB",
26451                 "medial": "\uFEBC"
26452             },
26453             "dad": {
26454                 "normal": [
26455                     "\u0636"
26456                 ],
26457                 "dot_below": [
26458                     "\u06FB"
26459                 ],
26460                 "isolated": "\uFEBD",
26461                 "final": "\uFEBE",
26462                 "initial": "\uFEBF",
26463                 "medial": "\uFEC0"
26464             },
26465             "tah": {
26466                 "normal": [
26467                     "\u0637"
26468                 ],
26469                 "three_dots_above": [
26470                     "\u069F"
26471                 ],
26472                 "two_dots_above": [
26473                     "\u08A3"
26474                 ],
26475                 "isolated": "\uFEC1",
26476                 "final": "\uFEC2",
26477                 "initial": "\uFEC3",
26478                 "medial": "\uFEC4"
26479             },
26480             "zah": {
26481                 "normal": [
26482                     "\u0638"
26483                 ],
26484                 "isolated": "\uFEC5",
26485                 "final": "\uFEC6",
26486                 "initial": "\uFEC7",
26487                 "medial": "\uFEC8"
26488             },
26489             "ain": {
26490                 "normal": [
26491                     "\u0639"
26492                 ],
26493                 "three_dots_above": [
26494                     "\u06A0"
26495                 ],
26496                 "two_dots_above": [
26497                     "\u075D"
26498                 ],
26499                 "three_dots_pointing_downwards_above": [
26500                     "\u075E"
26501                 ],
26502                 "two_dots_vertically_above": [
26503                     "\u075F"
26504                 ],
26505                 "three_dots_below": [
26506                     "\u08B3"
26507                 ],
26508                 "isolated": "\uFEC9",
26509                 "final": "\uFECA",
26510                 "initial": "\uFECB",
26511                 "medial": "\uFECC"
26512             },
26513             "ghain": {
26514                 "normal": [
26515                     "\u063A"
26516                 ],
26517                 "dot_below": [
26518                     "\u06FC"
26519                 ],
26520                 "isolated": "\uFECD",
26521                 "final": "\uFECE",
26522                 "initial": "\uFECF",
26523                 "medial": "\uFED0"
26524             },
26525             "feh": {
26526                 "normal": [
26527                     "\u0641"
26528                 ],
26529                 "dotless": [
26530                     "\u06A1"
26531                 ],
26532                 "dot_moved_below": [
26533                     "\u06A2"
26534                 ],
26535                 "dot_below": [
26536                     "\u06A3"
26537                 ],
26538                 "three_dots_below": [
26539                     "\u06A5"
26540                 ],
26541                 "two_dots_below": [
26542                     "\u0760"
26543                 ],
26544                 "three_dots_pointing_upwards_below": [
26545                     "\u0761"
26546                 ],
26547                 "dot_below_three_dots_above": [
26548                     "\u08A4"
26549                 ],
26550                 "isolated": "\uFED1",
26551                 "final": "\uFED2",
26552                 "initial": "\uFED3",
26553                 "medial": "\uFED4"
26554             },
26555             "qaf": {
26556                 "normal": [
26557                     "\u0642"
26558                 ],
26559                 "dotless": [
26560                     "\u066F"
26561                 ],
26562                 "dot_above": [
26563                     "\u06A7"
26564                 ],
26565                 "three_dots_above": [
26566                     "\u06A8"
26567                 ],
26568                 "dot_below": [
26569                     "\u08A5"
26570                 ],
26571                 "isolated": "\uFED5",
26572                 "final": "\uFED6",
26573                 "initial": "\uFED7",
26574                 "medial": "\uFED8"
26575             },
26576             "kaf": {
26577                 "normal": [
26578                     "\u0643"
26579                 ],
26580                 "swash": [
26581                     "\u06AA"
26582                 ],
26583                 "ring": [
26584                     "\u06AB"
26585                 ],
26586                 "dot_above": [
26587                     "\u06AC"
26588                 ],
26589                 "three_dots_below": [
26590                     "\u06AE"
26591                 ],
26592                 "two_dots_above": [
26593                     "\u077F"
26594                 ],
26595                 "dot_below": [
26596                     "\u08B4"
26597                 ],
26598                 "isolated": "\uFED9",
26599                 "final": "\uFEDA",
26600                 "initial": "\uFEDB",
26601                 "medial": "\uFEDC"
26602             },
26603             "lam": {
26604                 "normal": [
26605                     "\u0644"
26606                 ],
26607                 "small_v": [
26608                     "\u06B5"
26609                 ],
26610                 "dot_above": [
26611                     "\u06B6"
26612                 ],
26613                 "three_dots_above": [
26614                     "\u06B7"
26615                 ],
26616                 "three_dots_below": [
26617                     "\u06B8"
26618                 ],
26619                 "bar": [
26620                     "\u076A"
26621                 ],
26622                 "double_bar": [
26623                     "\u08A6"
26624                 ],
26625                 "isolated": "\uFEDD",
26626                 "final": "\uFEDE",
26627                 "initial": "\uFEDF",
26628                 "medial": "\uFEE0"
26629             },
26630             "meem": {
26631                 "normal": [
26632                     "\u0645"
26633                 ],
26634                 "dot_above": [
26635                     "\u0765"
26636                 ],
26637                 "dot_below": [
26638                     "\u0766"
26639                 ],
26640                 "three_dots_above": [
26641                     "\u08A7"
26642                 ],
26643                 "isolated": "\uFEE1",
26644                 "final": "\uFEE2",
26645                 "initial": "\uFEE3",
26646                 "medial": "\uFEE4"
26647             },
26648             "noon": {
26649                 "normal": [
26650                     "\u0646"
26651                 ],
26652                 "dot_below": [
26653                     "\u06B9"
26654                 ],
26655                 "ring": [
26656                     "\u06BC"
26657                 ],
26658                 "three_dots_above": [
26659                     "\u06BD"
26660                 ],
26661                 "two_dots_below": [
26662                     "\u0767"
26663                 ],
26664                 "small_tah": [
26665                     "\u0768"
26666                 ],
26667                 "small_v": [
26668                     "\u0769"
26669                 ],
26670                 "isolated": "\uFEE5",
26671                 "final": "\uFEE6",
26672                 "initial": "\uFEE7",
26673                 "medial": "\uFEE8"
26674             },
26675             "heh": {
26676                 "normal": [
26677                     "\u0647"
26678                 ],
26679                 "isolated": "\uFEE9",
26680                 "final": "\uFEEA",
26681                 "initial": "\uFEEB",
26682                 "medial": "\uFEEC"
26683             },
26684             "waw": {
26685                 "normal": [
26686                     "\u0648"
26687                 ],
26688                 "hamza_above": {
26689                     "normal": [
26690                         "\u0624",
26691                         "\u0648\u0654"
26692                     ],
26693                     "isolated": "\uFE85",
26694                     "final": "\uFE86"
26695                 },
26696                 "high_hamza": [
26697                     "\u0676",
26698                     "\u0648\u0674"
26699                 ],
26700                 "ring": [
26701                     "\u06C4"
26702                 ],
26703                 "two_dots_above": [
26704                     "\u06CA"
26705                 ],
26706                 "dot_above": [
26707                     "\u06CF"
26708                 ],
26709                 "indic_two_above": [
26710                     "\u0778"
26711                 ],
26712                 "indic_three_above": [
26713                     "\u0779"
26714                 ],
26715                 "dot_within": [
26716                     "\u08AB"
26717                 ],
26718                 "isolated": "\uFEED",
26719                 "final": "\uFEEE"
26720             },
26721             "alef_maksura": {
26722                 "normal": [
26723                     "\u0649"
26724                 ],
26725                 "hamza_above": [
26726                     "\u0626",
26727                     "\u064A\u0654"
26728                 ],
26729                 "initial": "\uFBE8",
26730                 "medial": "\uFBE9",
26731                 "isolated": "\uFEEF",
26732                 "final": "\uFEF0"
26733             },
26734             "yeh": {
26735                 "normal": [
26736                     "\u064A"
26737                 ],
26738                 "hamza_above": {
26739                     "normal": [
26740                         "\u0626",
26741                         "\u0649\u0654"
26742                     ],
26743                     "isolated": "\uFE89",
26744                     "final": "\uFE8A",
26745                     "initial": "\uFE8B",
26746                     "medial": "\uFE8C"
26747                 },
26748                 "two_dots_below_hamza_above": [
26749                     "\u08A8"
26750                 ],
26751                 "high_hamza": [
26752                     "\u0678",
26753                     "\u064A\u0674"
26754                 ],
26755                 "tail": [
26756                     "\u06CD"
26757                 ],
26758                 "small_v": [
26759                     "\u06CE"
26760                 ],
26761                 "three_dots_below": [
26762                     "\u06D1"
26763                 ],
26764                 "two_dots_below_dot_above": [
26765                     "\u08A9"
26766                 ],
26767                 "two_dots_below_small_noon_above": [
26768                     "\u08BA"
26769                 ],
26770                 "isolated": "\uFEF1",
26771                 "final": "\uFEF2",
26772                 "initial": "\uFEF3",
26773                 "medial": "\uFEF4"
26774             },
26775             "tteh": {
26776                 "normal": [
26777                     "\u0679"
26778                 ],
26779                 "isolated": "\uFB66",
26780                 "final": "\uFB67",
26781                 "initial": "\uFB68",
26782                 "medial": "\uFB69"
26783             },
26784             "tteheh": {
26785                 "normal": [
26786                     "\u067A"
26787                 ],
26788                 "isolated": "\uFB5E",
26789                 "final": "\uFB5F",
26790                 "initial": "\uFB60",
26791                 "medial": "\uFB61"
26792             },
26793             "beeh": {
26794                 "normal": [
26795                     "\u067B"
26796                 ],
26797                 "isolated": "\uFB52",
26798                 "final": "\uFB53",
26799                 "initial": "\uFB54",
26800                 "medial": "\uFB55"
26801             },
26802             "peh": {
26803                 "normal": [
26804                     "\u067E"
26805                 ],
26806                 "small_meem_above": [
26807                     "\u08B7"
26808                 ],
26809                 "isolated": "\uFB56",
26810                 "final": "\uFB57",
26811                 "initial": "\uFB58",
26812                 "medial": "\uFB59"
26813             },
26814             "teheh": {
26815                 "normal": [
26816                     "\u067F"
26817                 ],
26818                 "isolated": "\uFB62",
26819                 "final": "\uFB63",
26820                 "initial": "\uFB64",
26821                 "medial": "\uFB65"
26822             },
26823             "beheh": {
26824                 "normal": [
26825                     "\u0680"
26826                 ],
26827                 "isolated": "\uFB5A",
26828                 "final": "\uFB5B",
26829                 "initial": "\uFB5C",
26830                 "medial": "\uFB5D"
26831             },
26832             "nyeh": {
26833                 "normal": [
26834                     "\u0683"
26835                 ],
26836                 "isolated": "\uFB76",
26837                 "final": "\uFB77",
26838                 "initial": "\uFB78",
26839                 "medial": "\uFB79"
26840             },
26841             "dyeh": {
26842                 "normal": [
26843                     "\u0684"
26844                 ],
26845                 "isolated": "\uFB72",
26846                 "final": "\uFB73",
26847                 "initial": "\uFB74",
26848                 "medial": "\uFB75"
26849             },
26850             "tcheh": {
26851                 "normal": [
26852                     "\u0686"
26853                 ],
26854                 "dot_above": [
26855                     "\u06BF"
26856                 ],
26857                 "isolated": "\uFB7A",
26858                 "final": "\uFB7B",
26859                 "initial": "\uFB7C",
26860                 "medial": "\uFB7D"
26861             },
26862             "tcheheh": {
26863                 "normal": [
26864                     "\u0687"
26865                 ],
26866                 "isolated": "\uFB7E",
26867                 "final": "\uFB7F",
26868                 "initial": "\uFB80",
26869                 "medial": "\uFB81"
26870             },
26871             "ddal": {
26872                 "normal": [
26873                     "\u0688"
26874                 ],
26875                 "isolated": "\uFB88",
26876                 "final": "\uFB89"
26877             },
26878             "dahal": {
26879                 "normal": [
26880                     "\u068C"
26881                 ],
26882                 "isolated": "\uFB84",
26883                 "final": "\uFB85"
26884             },
26885             "ddahal": {
26886                 "normal": [
26887                     "\u068D"
26888                 ],
26889                 "isolated": "\uFB82",
26890                 "final": "\uFB83"
26891             },
26892             "dul": {
26893                 "normal": [
26894                     "\u068F",
26895                     "\u068E"
26896                 ],
26897                 "isolated": "\uFB86",
26898                 "final": "\uFB87"
26899             },
26900             "rreh": {
26901                 "normal": [
26902                     "\u0691"
26903                 ],
26904                 "isolated": "\uFB8C",
26905                 "final": "\uFB8D"
26906             },
26907             "jeh": {
26908                 "normal": [
26909                     "\u0698"
26910                 ],
26911                 "isolated": "\uFB8A",
26912                 "final": "\uFB8B"
26913             },
26914             "veh": {
26915                 "normal": [
26916                     "\u06A4"
26917                 ],
26918                 "isolated": "\uFB6A",
26919                 "final": "\uFB6B",
26920                 "initial": "\uFB6C",
26921                 "medial": "\uFB6D"
26922             },
26923             "peheh": {
26924                 "normal": [
26925                     "\u06A6"
26926                 ],
26927                 "isolated": "\uFB6E",
26928                 "final": "\uFB6F",
26929                 "initial": "\uFB70",
26930                 "medial": "\uFB71"
26931             },
26932             "keheh": {
26933                 "normal": [
26934                     "\u06A9"
26935                 ],
26936                 "dot_above": [
26937                     "\u0762"
26938                 ],
26939                 "three_dots_above": [
26940                     "\u0763"
26941                 ],
26942                 "three_dots_pointing_upwards_below": [
26943                     "\u0764"
26944                 ],
26945                 "isolated": "\uFB8E",
26946                 "final": "\uFB8F",
26947                 "initial": "\uFB90",
26948                 "medial": "\uFB91"
26949             },
26950             "ng": {
26951                 "normal": [
26952                     "\u06AD"
26953                 ],
26954                 "isolated": "\uFBD3",
26955                 "final": "\uFBD4",
26956                 "initial": "\uFBD5",
26957                 "medial": "\uFBD6"
26958             },
26959             "gaf": {
26960                 "normal": [
26961                     "\u06AF"
26962                 ],
26963                 "ring": [
26964                     "\u06B0"
26965                 ],
26966                 "two_dots_below": [
26967                     "\u06B2"
26968                 ],
26969                 "three_dots_above": [
26970                     "\u06B4"
26971                 ],
26972                 "inverted_stroke": [
26973                     "\u08B0"
26974                 ],
26975                 "isolated": "\uFB92",
26976                 "final": "\uFB93",
26977                 "initial": "\uFB94",
26978                 "medial": "\uFB95"
26979             },
26980             "ngoeh": {
26981                 "normal": [
26982                     "\u06B1"
26983                 ],
26984                 "isolated": "\uFB9A",
26985                 "final": "\uFB9B",
26986                 "initial": "\uFB9C",
26987                 "medial": "\uFB9D"
26988             },
26989             "gueh": {
26990                 "normal": [
26991                     "\u06B3"
26992                 ],
26993                 "isolated": "\uFB96",
26994                 "final": "\uFB97",
26995                 "initial": "\uFB98",
26996                 "medial": "\uFB99"
26997             },
26998             "noon ghunna": {
26999                 "normal": [
27000                     "\u06BA"
27001                 ],
27002                 "isolated": "\uFB9E",
27003                 "final": "\uFB9F"
27004             },
27005             "rnoon": {
27006                 "normal": [
27007                     "\u06BB"
27008                 ],
27009                 "isolated": "\uFBA0",
27010                 "final": "\uFBA1",
27011                 "initial": "\uFBA2",
27012                 "medial": "\uFBA3"
27013             },
27014             "heh doachashmee": {
27015                 "normal": [
27016                     "\u06BE"
27017                 ],
27018                 "isolated": "\uFBAA",
27019                 "final": "\uFBAB",
27020                 "initial": "\uFBAC",
27021                 "medial": "\uFBAD"
27022             },
27023             "heh goal": {
27024                 "normal": [
27025                     "\u06C1"
27026                 ],
27027                 "hamza_above": [
27028                     "\u06C1\u0654",
27029                     "\u06C2"
27030                 ],
27031                 "isolated": "\uFBA6",
27032                 "final": "\uFBA7",
27033                 "initial": "\uFBA8",
27034                 "medial": "\uFBA9"
27035             },
27036             "teh marbuta goal": {
27037                 "normal": [
27038                     "\u06C3"
27039                 ]
27040             },
27041             "kirghiz oe": {
27042                 "normal": [
27043                     "\u06C5"
27044                 ],
27045                 "isolated": "\uFBE0",
27046                 "final": "\uFBE1"
27047             },
27048             "oe": {
27049                 "normal": [
27050                     "\u06C6"
27051                 ],
27052                 "isolated": "\uFBD9",
27053                 "final": "\uFBDA"
27054             },
27055             "u": {
27056                 "normal": [
27057                     "\u06C7"
27058                 ],
27059                 "hamza_above": {
27060                     "normal": [
27061                         "\u0677",
27062                         "\u06C7\u0674"
27063                     ],
27064                     "isolated": "\uFBDD"
27065                 },
27066                 "isolated": "\uFBD7",
27067                 "final": "\uFBD8"
27068             },
27069             "yu": {
27070                 "normal": [
27071                     "\u06C8"
27072                 ],
27073                 "isolated": "\uFBDB",
27074                 "final": "\uFBDC"
27075             },
27076             "kirghiz yu": {
27077                 "normal": [
27078                     "\u06C9"
27079                 ],
27080                 "isolated": "\uFBE2",
27081                 "final": "\uFBE3"
27082             },
27083             "ve": {
27084                 "normal": [
27085                     "\u06CB"
27086                 ],
27087                 "isolated": "\uFBDE",
27088                 "final": "\uFBDF"
27089             },
27090             "farsi yeh": {
27091                 "normal": [
27092                     "\u06CC"
27093                 ],
27094                 "indic_two_above": [
27095                     "\u0775"
27096                 ],
27097                 "indic_three_above": [
27098                     "\u0776"
27099                 ],
27100                 "indic_four_above": [
27101                     "\u0777"
27102                 ],
27103                 "isolated": "\uFBFC",
27104                 "final": "\uFBFD",
27105                 "initial": "\uFBFE",
27106                 "medial": "\uFBFF"
27107             },
27108             "e": {
27109                 "normal": [
27110                     "\u06D0"
27111                 ],
27112                 "isolated": "\uFBE4",
27113                 "final": "\uFBE5",
27114                 "initial": "\uFBE6",
27115                 "medial": "\uFBE7"
27116             },
27117             "yeh barree": {
27118                 "normal": [
27119                     "\u06D2"
27120                 ],
27121                 "hamza_above": {
27122                     "normal": [
27123                         "\u06D2\u0654",
27124                         "\u06D3"
27125                     ],
27126                     "isolated": "\uFBB0",
27127                     "final": "\uFBB1"
27128                 },
27129                 "indic_two_above": [
27130                     "\u077A"
27131                 ],
27132                 "indic_three_above": [
27133                     "\u077B"
27134                 ],
27135                 "isolated": "\uFBAE",
27136                 "final": "\uFBAF"
27137             },
27138             "ae": {
27139                 "normal": [
27140                     "\u06D5"
27141                 ],
27142                 "isolated": "\u06D5",
27143                 "final": "\uFEEA",
27144                 "yeh_above": {
27145                     "normal": [
27146                         "\u06C0",
27147                         "\u06D5\u0654"
27148                     ],
27149                     "isolated": "\uFBA4",
27150                     "final": "\uFBA5"
27151                 }
27152             },
27153             "rohingya yeh": {
27154                 "normal": [
27155                     "\u08AC"
27156                 ]
27157             },
27158             "low alef": {
27159                 "normal": [
27160                     "\u08AD"
27161                 ]
27162             },
27163             "straight waw": {
27164                 "normal": [
27165                     "\u08B1"
27166                 ]
27167             },
27168             "african feh": {
27169                 "normal": [
27170                     "\u08BB"
27171                 ]
27172             },
27173             "african qaf": {
27174                 "normal": [
27175                     "\u08BC"
27176                 ]
27177             },
27178             "african noon": {
27179                 "normal": [
27180                     "\u08BD"
27181                 ]
27182             }
27183         };
27184         exports.default = arabicReference;
27185         });
27186
27187         unwrapExports(unicodeArabic);
27188
27189         var unicodeLigatures = createCommonjsModule(function (module, exports) {
27190         Object.defineProperty(exports, "__esModule", { value: true });
27191         var ligatureReference = {
27192             "\u0626\u0627": {
27193                 "isolated": "\uFBEA",
27194                 "final": "\uFBEB"
27195             },
27196             "\u0626\u06D5": {
27197                 "isolated": "\uFBEC",
27198                 "final": "\uFBED"
27199             },
27200             "\u0626\u0648": {
27201                 "isolated": "\uFBEE",
27202                 "final": "\uFBEF"
27203             },
27204             "\u0626\u06C7": {
27205                 "isolated": "\uFBF0",
27206                 "final": "\uFBF1"
27207             },
27208             "\u0626\u06C6": {
27209                 "isolated": "\uFBF2",
27210                 "final": "\uFBF3"
27211             },
27212             "\u0626\u06C8": {
27213                 "isolated": "\uFBF4",
27214                 "final": "\uFBF5"
27215             },
27216             "\u0626\u06D0": {
27217                 "isolated": "\uFBF6",
27218                 "final": "\uFBF7",
27219                 "initial": "\uFBF8"
27220             },
27221             "\u0626\u0649": {
27222                 "uighur_kirghiz": {
27223                     "isolated": "\uFBF9",
27224                     "final": "\uFBFA",
27225                     "initial": "\uFBFB"
27226                 },
27227                 "isolated": "\uFC03",
27228                 "final": "\uFC68"
27229             },
27230             "\u0626\u062C": {
27231                 "isolated": "\uFC00",
27232                 "initial": "\uFC97"
27233             },
27234             "\u0626\u062D": {
27235                 "isolated": "\uFC01",
27236                 "initial": "\uFC98"
27237             },
27238             "\u0626\u0645": {
27239                 "isolated": "\uFC02",
27240                 "final": "\uFC66",
27241                 "initial": "\uFC9A",
27242                 "medial": "\uFCDF"
27243             },
27244             "\u0626\u064A": {
27245                 "isolated": "\uFC04",
27246                 "final": "\uFC69"
27247             },
27248             "\u0628\u062C": {
27249                 "isolated": "\uFC05",
27250                 "initial": "\uFC9C"
27251             },
27252             "\u0628\u062D": {
27253                 "isolated": "\uFC06",
27254                 "initial": "\uFC9D"
27255             },
27256             "\u0628\u062E": {
27257                 "isolated": "\uFC07",
27258                 "initial": "\uFC9E"
27259             },
27260             "\u0628\u0645": {
27261                 "isolated": "\uFC08",
27262                 "final": "\uFC6C",
27263                 "initial": "\uFC9F",
27264                 "medial": "\uFCE1"
27265             },
27266             "\u0628\u0649": {
27267                 "isolated": "\uFC09",
27268                 "final": "\uFC6E"
27269             },
27270             "\u0628\u064A": {
27271                 "isolated": "\uFC0A",
27272                 "final": "\uFC6F"
27273             },
27274             "\u062A\u062C": {
27275                 "isolated": "\uFC0B",
27276                 "initial": "\uFCA1"
27277             },
27278             "\u062A\u062D": {
27279                 "isolated": "\uFC0C",
27280                 "initial": "\uFCA2"
27281             },
27282             "\u062A\u062E": {
27283                 "isolated": "\uFC0D",
27284                 "initial": "\uFCA3"
27285             },
27286             "\u062A\u0645": {
27287                 "isolated": "\uFC0E",
27288                 "final": "\uFC72",
27289                 "initial": "\uFCA4",
27290                 "medial": "\uFCE3"
27291             },
27292             "\u062A\u0649": {
27293                 "isolated": "\uFC0F",
27294                 "final": "\uFC74"
27295             },
27296             "\u062A\u064A": {
27297                 "isolated": "\uFC10",
27298                 "final": "\uFC75"
27299             },
27300             "\u062B\u062C": {
27301                 "isolated": "\uFC11"
27302             },
27303             "\u062B\u0645": {
27304                 "isolated": "\uFC12",
27305                 "final": "\uFC78",
27306                 "initial": "\uFCA6",
27307                 "medial": "\uFCE5"
27308             },
27309             "\u062B\u0649": {
27310                 "isolated": "\uFC13",
27311                 "final": "\uFC7A"
27312             },
27313             "\u062B\u0648": {
27314                 "isolated": "\uFC14"
27315             },
27316             "\u062C\u062D": {
27317                 "isolated": "\uFC15",
27318                 "initial": "\uFCA7"
27319             },
27320             "\u062C\u0645": {
27321                 "isolated": "\uFC16",
27322                 "initial": "\uFCA8"
27323             },
27324             "\u062D\u062C": {
27325                 "isolated": "\uFC17",
27326                 "initial": "\uFCA9"
27327             },
27328             "\u062D\u0645": {
27329                 "isolated": "\uFC18",
27330                 "initial": "\uFCAA"
27331             },
27332             "\u062E\u062C": {
27333                 "isolated": "\uFC19",
27334                 "initial": "\uFCAB"
27335             },
27336             "\u062E\u062D": {
27337                 "isolated": "\uFC1A"
27338             },
27339             "\u062E\u0645": {
27340                 "isolated": "\uFC1B",
27341                 "initial": "\uFCAC"
27342             },
27343             "\u0633\u062C": {
27344                 "isolated": "\uFC1C",
27345                 "initial": "\uFCAD",
27346                 "medial": "\uFD34"
27347             },
27348             "\u0633\u062D": {
27349                 "isolated": "\uFC1D",
27350                 "initial": "\uFCAE",
27351                 "medial": "\uFD35"
27352             },
27353             "\u0633\u062E": {
27354                 "isolated": "\uFC1E",
27355                 "initial": "\uFCAF",
27356                 "medial": "\uFD36"
27357             },
27358             "\u0633\u0645": {
27359                 "isolated": "\uFC1F",
27360                 "initial": "\uFCB0",
27361                 "medial": "\uFCE7"
27362             },
27363             "\u0635\u062D": {
27364                 "isolated": "\uFC20",
27365                 "initial": "\uFCB1"
27366             },
27367             "\u0635\u0645": {
27368                 "isolated": "\uFC21",
27369                 "initial": "\uFCB3"
27370             },
27371             "\u0636\u062C": {
27372                 "isolated": "\uFC22",
27373                 "initial": "\uFCB4"
27374             },
27375             "\u0636\u062D": {
27376                 "isolated": "\uFC23",
27377                 "initial": "\uFCB5"
27378             },
27379             "\u0636\u062E": {
27380                 "isolated": "\uFC24",
27381                 "initial": "\uFCB6"
27382             },
27383             "\u0636\u0645": {
27384                 "isolated": "\uFC25",
27385                 "initial": "\uFCB7"
27386             },
27387             "\u0637\u062D": {
27388                 "isolated": "\uFC26",
27389                 "initial": "\uFCB8"
27390             },
27391             "\u0637\u0645": {
27392                 "isolated": "\uFC27",
27393                 "initial": "\uFD33",
27394                 "medial": "\uFD3A"
27395             },
27396             "\u0638\u0645": {
27397                 "isolated": "\uFC28",
27398                 "initial": "\uFCB9",
27399                 "medial": "\uFD3B"
27400             },
27401             "\u0639\u062C": {
27402                 "isolated": "\uFC29",
27403                 "initial": "\uFCBA"
27404             },
27405             "\u0639\u0645": {
27406                 "isolated": "\uFC2A",
27407                 "initial": "\uFCBB"
27408             },
27409             "\u063A\u062C": {
27410                 "isolated": "\uFC2B",
27411                 "initial": "\uFCBC"
27412             },
27413             "\u063A\u0645": {
27414                 "isolated": "\uFC2C",
27415                 "initial": "\uFCBD"
27416             },
27417             "\u0641\u062C": {
27418                 "isolated": "\uFC2D",
27419                 "initial": "\uFCBE"
27420             },
27421             "\u0641\u062D": {
27422                 "isolated": "\uFC2E",
27423                 "initial": "\uFCBF"
27424             },
27425             "\u0641\u062E": {
27426                 "isolated": "\uFC2F",
27427                 "initial": "\uFCC0"
27428             },
27429             "\u0641\u0645": {
27430                 "isolated": "\uFC30",
27431                 "initial": "\uFCC1"
27432             },
27433             "\u0641\u0649": {
27434                 "isolated": "\uFC31",
27435                 "final": "\uFC7C"
27436             },
27437             "\u0641\u064A": {
27438                 "isolated": "\uFC32",
27439                 "final": "\uFC7D"
27440             },
27441             "\u0642\u062D": {
27442                 "isolated": "\uFC33",
27443                 "initial": "\uFCC2"
27444             },
27445             "\u0642\u0645": {
27446                 "isolated": "\uFC34",
27447                 "initial": "\uFCC3"
27448             },
27449             "\u0642\u0649": {
27450                 "isolated": "\uFC35",
27451                 "final": "\uFC7E"
27452             },
27453             "\u0642\u064A": {
27454                 "isolated": "\uFC36",
27455                 "final": "\uFC7F"
27456             },
27457             "\u0643\u0627": {
27458                 "isolated": "\uFC37",
27459                 "final": "\uFC80"
27460             },
27461             "\u0643\u062C": {
27462                 "isolated": "\uFC38",
27463                 "initial": "\uFCC4"
27464             },
27465             "\u0643\u062D": {
27466                 "isolated": "\uFC39",
27467                 "initial": "\uFCC5"
27468             },
27469             "\u0643\u062E": {
27470                 "isolated": "\uFC3A",
27471                 "initial": "\uFCC6"
27472             },
27473             "\u0643\u0644": {
27474                 "isolated": "\uFC3B",
27475                 "final": "\uFC81",
27476                 "initial": "\uFCC7",
27477                 "medial": "\uFCEB"
27478             },
27479             "\u0643\u0645": {
27480                 "isolated": "\uFC3C",
27481                 "final": "\uFC82",
27482                 "initial": "\uFCC8",
27483                 "medial": "\uFCEC"
27484             },
27485             "\u0643\u0649": {
27486                 "isolated": "\uFC3D",
27487                 "final": "\uFC83"
27488             },
27489             "\u0643\u064A": {
27490                 "isolated": "\uFC3E",
27491                 "final": "\uFC84"
27492             },
27493             "\u0644\u062C": {
27494                 "isolated": "\uFC3F",
27495                 "initial": "\uFCC9"
27496             },
27497             "\u0644\u062D": {
27498                 "isolated": "\uFC40",
27499                 "initial": "\uFCCA"
27500             },
27501             "\u0644\u062E": {
27502                 "isolated": "\uFC41",
27503                 "initial": "\uFCCB"
27504             },
27505             "\u0644\u0645": {
27506                 "isolated": "\uFC42",
27507                 "final": "\uFC85",
27508                 "initial": "\uFCCC",
27509                 "medial": "\uFCED"
27510             },
27511             "\u0644\u0649": {
27512                 "isolated": "\uFC43",
27513                 "final": "\uFC86"
27514             },
27515             "\u0644\u064A": {
27516                 "isolated": "\uFC44",
27517                 "final": "\uFC87"
27518             },
27519             "\u0645\u062C": {
27520                 "isolated": "\uFC45",
27521                 "initial": "\uFCCE"
27522             },
27523             "\u0645\u062D": {
27524                 "isolated": "\uFC46",
27525                 "initial": "\uFCCF"
27526             },
27527             "\u0645\u062E": {
27528                 "isolated": "\uFC47",
27529                 "initial": "\uFCD0"
27530             },
27531             "\u0645\u0645": {
27532                 "isolated": "\uFC48",
27533                 "final": "\uFC89",
27534                 "initial": "\uFCD1"
27535             },
27536             "\u0645\u0649": {
27537                 "isolated": "\uFC49"
27538             },
27539             "\u0645\u064A": {
27540                 "isolated": "\uFC4A"
27541             },
27542             "\u0646\u062C": {
27543                 "isolated": "\uFC4B",
27544                 "initial": "\uFCD2"
27545             },
27546             "\u0646\u062D": {
27547                 "isolated": "\uFC4C",
27548                 "initial": "\uFCD3"
27549             },
27550             "\u0646\u062E": {
27551                 "isolated": "\uFC4D",
27552                 "initial": "\uFCD4"
27553             },
27554             "\u0646\u0645": {
27555                 "isolated": "\uFC4E",
27556                 "final": "\uFC8C",
27557                 "initial": "\uFCD5",
27558                 "medial": "\uFCEE"
27559             },
27560             "\u0646\u0649": {
27561                 "isolated": "\uFC4F",
27562                 "final": "\uFC8E"
27563             },
27564             "\u0646\u064A": {
27565                 "isolated": "\uFC50",
27566                 "final": "\uFC8F"
27567             },
27568             "\u0647\u062C": {
27569                 "isolated": "\uFC51",
27570                 "initial": "\uFCD7"
27571             },
27572             "\u0647\u0645": {
27573                 "isolated": "\uFC52",
27574                 "initial": "\uFCD8"
27575             },
27576             "\u0647\u0649": {
27577                 "isolated": "\uFC53"
27578             },
27579             "\u0647\u064A": {
27580                 "isolated": "\uFC54"
27581             },
27582             "\u064A\u062C": {
27583                 "isolated": "\uFC55",
27584                 "initial": "\uFCDA"
27585             },
27586             "\u064A\u062D": {
27587                 "isolated": "\uFC56",
27588                 "initial": "\uFCDB"
27589             },
27590             "\u064A\u062E": {
27591                 "isolated": "\uFC57",
27592                 "initial": "\uFCDC"
27593             },
27594             "\u064A\u0645": {
27595                 "isolated": "\uFC58",
27596                 "final": "\uFC93",
27597                 "initial": "\uFCDD",
27598                 "medial": "\uFCF0"
27599             },
27600             "\u064A\u0649": {
27601                 "isolated": "\uFC59",
27602                 "final": "\uFC95"
27603             },
27604             "\u064A\u064A": {
27605                 "isolated": "\uFC5A",
27606                 "final": "\uFC96"
27607             },
27608             "\u0630\u0670": {
27609                 "isolated": "\uFC5B"
27610             },
27611             "\u0631\u0670": {
27612                 "isolated": "\uFC5C"
27613             },
27614             "\u0649\u0670": {
27615                 "isolated": "\uFC5D",
27616                 "final": "\uFC90"
27617             },
27618             "\u064C\u0651": {
27619                 "isolated": "\uFC5E"
27620             },
27621             "\u064D\u0651": {
27622                 "isolated": "\uFC5F"
27623             },
27624             "\u064E\u0651": {
27625                 "isolated": "\uFC60"
27626             },
27627             "\u064F\u0651": {
27628                 "isolated": "\uFC61"
27629             },
27630             "\u0650\u0651": {
27631                 "isolated": "\uFC62"
27632             },
27633             "\u0651\u0670": {
27634                 "isolated": "\uFC63"
27635             },
27636             "\u0626\u0631": {
27637                 "final": "\uFC64"
27638             },
27639             "\u0626\u0632": {
27640                 "final": "\uFC65"
27641             },
27642             "\u0626\u0646": {
27643                 "final": "\uFC67"
27644             },
27645             "\u0628\u0631": {
27646                 "final": "\uFC6A"
27647             },
27648             "\u0628\u0632": {
27649                 "final": "\uFC6B"
27650             },
27651             "\u0628\u0646": {
27652                 "final": "\uFC6D"
27653             },
27654             "\u062A\u0631": {
27655                 "final": "\uFC70"
27656             },
27657             "\u062A\u0632": {
27658                 "final": "\uFC71"
27659             },
27660             "\u062A\u0646": {
27661                 "final": "\uFC73"
27662             },
27663             "\u062B\u0631": {
27664                 "final": "\uFC76"
27665             },
27666             "\u062B\u0632": {
27667                 "final": "\uFC77"
27668             },
27669             "\u062B\u0646": {
27670                 "final": "\uFC79"
27671             },
27672             "\u062B\u064A": {
27673                 "final": "\uFC7B"
27674             },
27675             "\u0645\u0627": {
27676                 "final": "\uFC88"
27677             },
27678             "\u0646\u0631": {
27679                 "final": "\uFC8A"
27680             },
27681             "\u0646\u0632": {
27682                 "final": "\uFC8B"
27683             },
27684             "\u0646\u0646": {
27685                 "final": "\uFC8D"
27686             },
27687             "\u064A\u0631": {
27688                 "final": "\uFC91"
27689             },
27690             "\u064A\u0632": {
27691                 "final": "\uFC92"
27692             },
27693             "\u064A\u0646": {
27694                 "final": "\uFC94"
27695             },
27696             "\u0626\u062E": {
27697                 "initial": "\uFC99"
27698             },
27699             "\u0626\u0647": {
27700                 "initial": "\uFC9B",
27701                 "medial": "\uFCE0"
27702             },
27703             "\u0628\u0647": {
27704                 "initial": "\uFCA0",
27705                 "medial": "\uFCE2"
27706             },
27707             "\u062A\u0647": {
27708                 "initial": "\uFCA5",
27709                 "medial": "\uFCE4"
27710             },
27711             "\u0635\u062E": {
27712                 "initial": "\uFCB2"
27713             },
27714             "\u0644\u0647": {
27715                 "initial": "\uFCCD"
27716             },
27717             "\u0646\u0647": {
27718                 "initial": "\uFCD6",
27719                 "medial": "\uFCEF"
27720             },
27721             "\u0647\u0670": {
27722                 "initial": "\uFCD9"
27723             },
27724             "\u064A\u0647": {
27725                 "initial": "\uFCDE",
27726                 "medial": "\uFCF1"
27727             },
27728             "\u062B\u0647": {
27729                 "medial": "\uFCE6"
27730             },
27731             "\u0633\u0647": {
27732                 "medial": "\uFCE8",
27733                 "initial": "\uFD31"
27734             },
27735             "\u0634\u0645": {
27736                 "medial": "\uFCE9",
27737                 "isolated": "\uFD0C",
27738                 "final": "\uFD28",
27739                 "initial": "\uFD30"
27740             },
27741             "\u0634\u0647": {
27742                 "medial": "\uFCEA",
27743                 "initial": "\uFD32"
27744             },
27745             "\u0640\u064E\u0651": {
27746                 "medial": "\uFCF2"
27747             },
27748             "\u0640\u064F\u0651": {
27749                 "medial": "\uFCF3"
27750             },
27751             "\u0640\u0650\u0651": {
27752                 "medial": "\uFCF4"
27753             },
27754             "\u0637\u0649": {
27755                 "isolated": "\uFCF5",
27756                 "final": "\uFD11"
27757             },
27758             "\u0637\u064A": {
27759                 "isolated": "\uFCF6",
27760                 "final": "\uFD12"
27761             },
27762             "\u0639\u0649": {
27763                 "isolated": "\uFCF7",
27764                 "final": "\uFD13"
27765             },
27766             "\u0639\u064A": {
27767                 "isolated": "\uFCF8",
27768                 "final": "\uFD14"
27769             },
27770             "\u063A\u0649": {
27771                 "isolated": "\uFCF9",
27772                 "final": "\uFD15"
27773             },
27774             "\u063A\u064A": {
27775                 "isolated": "\uFCFA",
27776                 "final": "\uFD16"
27777             },
27778             "\u0633\u0649": {
27779                 "isolated": "\uFCFB"
27780             },
27781             "\u0633\u064A": {
27782                 "isolated": "\uFCFC",
27783                 "final": "\uFD18"
27784             },
27785             "\u0634\u0649": {
27786                 "isolated": "\uFCFD",
27787                 "final": "\uFD19"
27788             },
27789             "\u0634\u064A": {
27790                 "isolated": "\uFCFE",
27791                 "final": "\uFD1A"
27792             },
27793             "\u062D\u0649": {
27794                 "isolated": "\uFCFF",
27795                 "final": "\uFD1B"
27796             },
27797             "\u062D\u064A": {
27798                 "isolated": "\uFD00",
27799                 "final": "\uFD1C"
27800             },
27801             "\u062C\u0649": {
27802                 "isolated": "\uFD01",
27803                 "final": "\uFD1D"
27804             },
27805             "\u062C\u064A": {
27806                 "isolated": "\uFD02",
27807                 "final": "\uFD1E"
27808             },
27809             "\u062E\u0649": {
27810                 "isolated": "\uFD03",
27811                 "final": "\uFD1F"
27812             },
27813             "\u062E\u064A": {
27814                 "isolated": "\uFD04",
27815                 "final": "\uFD20"
27816             },
27817             "\u0635\u0649": {
27818                 "isolated": "\uFD05",
27819                 "final": "\uFD21"
27820             },
27821             "\u0635\u064A": {
27822                 "isolated": "\uFD06",
27823                 "final": "\uFD22"
27824             },
27825             "\u0636\u0649": {
27826                 "isolated": "\uFD07",
27827                 "final": "\uFD23"
27828             },
27829             "\u0636\u064A": {
27830                 "isolated": "\uFD08",
27831                 "final": "\uFD24"
27832             },
27833             "\u0634\u062C": {
27834                 "isolated": "\uFD09",
27835                 "final": "\uFD25",
27836                 "initial": "\uFD2D",
27837                 "medial": "\uFD37"
27838             },
27839             "\u0634\u062D": {
27840                 "isolated": "\uFD0A",
27841                 "final": "\uFD26",
27842                 "initial": "\uFD2E",
27843                 "medial": "\uFD38"
27844             },
27845             "\u0634\u062E": {
27846                 "isolated": "\uFD0B",
27847                 "final": "\uFD27",
27848                 "initial": "\uFD2F",
27849                 "medial": "\uFD39"
27850             },
27851             "\u0634\u0631": {
27852                 "isolated": "\uFD0D",
27853                 "final": "\uFD29"
27854             },
27855             "\u0633\u0631": {
27856                 "isolated": "\uFD0E",
27857                 "final": "\uFD2A"
27858             },
27859             "\u0635\u0631": {
27860                 "isolated": "\uFD0F",
27861                 "final": "\uFD2B"
27862             },
27863             "\u0636\u0631": {
27864                 "isolated": "\uFD10",
27865                 "final": "\uFD2C"
27866             },
27867             "\u0633\u0639": {
27868                 "final": "\uFD17"
27869             },
27870             "\u062A\u062C\u0645": {
27871                 "initial": "\uFD50"
27872             },
27873             "\u062A\u062D\u062C": {
27874                 "final": "\uFD51",
27875                 "initial": "\uFD52"
27876             },
27877             "\u062A\u062D\u0645": {
27878                 "initial": "\uFD53"
27879             },
27880             "\u062A\u062E\u0645": {
27881                 "initial": "\uFD54"
27882             },
27883             "\u062A\u0645\u062C": {
27884                 "initial": "\uFD55"
27885             },
27886             "\u062A\u0645\u062D": {
27887                 "initial": "\uFD56"
27888             },
27889             "\u062A\u0645\u062E": {
27890                 "initial": "\uFD57"
27891             },
27892             "\u062C\u0645\u062D": {
27893                 "final": "\uFD58",
27894                 "initial": "\uFD59"
27895             },
27896             "\u062D\u0645\u064A": {
27897                 "final": "\uFD5A"
27898             },
27899             "\u062D\u0645\u0649": {
27900                 "final": "\uFD5B"
27901             },
27902             "\u0633\u062D\u062C": {
27903                 "initial": "\uFD5C"
27904             },
27905             "\u0633\u062C\u062D": {
27906                 "initial": "\uFD5D"
27907             },
27908             "\u0633\u062C\u0649": {
27909                 "final": "\uFD5E"
27910             },
27911             "\u0633\u0645\u062D": {
27912                 "final": "\uFD5F",
27913                 "initial": "\uFD60"
27914             },
27915             "\u0633\u0645\u062C": {
27916                 "initial": "\uFD61"
27917             },
27918             "\u0633\u0645\u0645": {
27919                 "final": "\uFD62",
27920                 "initial": "\uFD63"
27921             },
27922             "\u0635\u062D\u062D": {
27923                 "final": "\uFD64",
27924                 "initial": "\uFD65"
27925             },
27926             "\u0635\u0645\u0645": {
27927                 "final": "\uFD66",
27928                 "initial": "\uFDC5"
27929             },
27930             "\u0634\u062D\u0645": {
27931                 "final": "\uFD67",
27932                 "initial": "\uFD68"
27933             },
27934             "\u0634\u062C\u064A": {
27935                 "final": "\uFD69"
27936             },
27937             "\u0634\u0645\u062E": {
27938                 "final": "\uFD6A",
27939                 "initial": "\uFD6B"
27940             },
27941             "\u0634\u0645\u0645": {
27942                 "final": "\uFD6C",
27943                 "initial": "\uFD6D"
27944             },
27945             "\u0636\u062D\u0649": {
27946                 "final": "\uFD6E"
27947             },
27948             "\u0636\u062E\u0645": {
27949                 "final": "\uFD6F",
27950                 "initial": "\uFD70"
27951             },
27952             "\u0636\u0645\u062D": {
27953                 "final": "\uFD71"
27954             },
27955             "\u0637\u0645\u062D": {
27956                 "initial": "\uFD72"
27957             },
27958             "\u0637\u0645\u0645": {
27959                 "initial": "\uFD73"
27960             },
27961             "\u0637\u0645\u064A": {
27962                 "final": "\uFD74"
27963             },
27964             "\u0639\u062C\u0645": {
27965                 "final": "\uFD75",
27966                 "initial": "\uFDC4"
27967             },
27968             "\u0639\u0645\u0645": {
27969                 "final": "\uFD76",
27970                 "initial": "\uFD77"
27971             },
27972             "\u0639\u0645\u0649": {
27973                 "final": "\uFD78"
27974             },
27975             "\u063A\u0645\u0645": {
27976                 "final": "\uFD79"
27977             },
27978             "\u063A\u0645\u064A": {
27979                 "final": "\uFD7A"
27980             },
27981             "\u063A\u0645\u0649": {
27982                 "final": "\uFD7B"
27983             },
27984             "\u0641\u062E\u0645": {
27985                 "final": "\uFD7C",
27986                 "initial": "\uFD7D"
27987             },
27988             "\u0642\u0645\u062D": {
27989                 "final": "\uFD7E",
27990                 "initial": "\uFDB4"
27991             },
27992             "\u0642\u0645\u0645": {
27993                 "final": "\uFD7F"
27994             },
27995             "\u0644\u062D\u0645": {
27996                 "final": "\uFD80",
27997                 "initial": "\uFDB5"
27998             },
27999             "\u0644\u062D\u064A": {
28000                 "final": "\uFD81"
28001             },
28002             "\u0644\u062D\u0649": {
28003                 "final": "\uFD82"
28004             },
28005             "\u0644\u062C\u062C": {
28006                 "initial": "\uFD83",
28007                 "final": "\uFD84"
28008             },
28009             "\u0644\u062E\u0645": {
28010                 "final": "\uFD85",
28011                 "initial": "\uFD86"
28012             },
28013             "\u0644\u0645\u062D": {
28014                 "final": "\uFD87",
28015                 "initial": "\uFD88"
28016             },
28017             "\u0645\u062D\u062C": {
28018                 "initial": "\uFD89"
28019             },
28020             "\u0645\u062D\u0645": {
28021                 "initial": "\uFD8A"
28022             },
28023             "\u0645\u062D\u064A": {
28024                 "final": "\uFD8B"
28025             },
28026             "\u0645\u062C\u062D": {
28027                 "initial": "\uFD8C"
28028             },
28029             "\u0645\u062C\u0645": {
28030                 "initial": "\uFD8D"
28031             },
28032             "\u0645\u062E\u062C": {
28033                 "initial": "\uFD8E"
28034             },
28035             "\u0645\u062E\u0645": {
28036                 "initial": "\uFD8F"
28037             },
28038             "\u0645\u062C\u062E": {
28039                 "initial": "\uFD92"
28040             },
28041             "\u0647\u0645\u062C": {
28042                 "initial": "\uFD93"
28043             },
28044             "\u0647\u0645\u0645": {
28045                 "initial": "\uFD94"
28046             },
28047             "\u0646\u062D\u0645": {
28048                 "initial": "\uFD95"
28049             },
28050             "\u0646\u062D\u0649": {
28051                 "final": "\uFD96"
28052             },
28053             "\u0646\u062C\u0645": {
28054                 "final": "\uFD97",
28055                 "initial": "\uFD98"
28056             },
28057             "\u0646\u062C\u0649": {
28058                 "final": "\uFD99"
28059             },
28060             "\u0646\u0645\u064A": {
28061                 "final": "\uFD9A"
28062             },
28063             "\u0646\u0645\u0649": {
28064                 "final": "\uFD9B"
28065             },
28066             "\u064A\u0645\u0645": {
28067                 "final": "\uFD9C",
28068                 "initial": "\uFD9D"
28069             },
28070             "\u0628\u062E\u064A": {
28071                 "final": "\uFD9E"
28072             },
28073             "\u062A\u062C\u064A": {
28074                 "final": "\uFD9F"
28075             },
28076             "\u062A\u062C\u0649": {
28077                 "final": "\uFDA0"
28078             },
28079             "\u062A\u062E\u064A": {
28080                 "final": "\uFDA1"
28081             },
28082             "\u062A\u062E\u0649": {
28083                 "final": "\uFDA2"
28084             },
28085             "\u062A\u0645\u064A": {
28086                 "final": "\uFDA3"
28087             },
28088             "\u062A\u0645\u0649": {
28089                 "final": "\uFDA4"
28090             },
28091             "\u062C\u0645\u064A": {
28092                 "final": "\uFDA5"
28093             },
28094             "\u062C\u062D\u0649": {
28095                 "final": "\uFDA6"
28096             },
28097             "\u062C\u0645\u0649": {
28098                 "final": "\uFDA7"
28099             },
28100             "\u0633\u062E\u0649": {
28101                 "final": "\uFDA8"
28102             },
28103             "\u0635\u062D\u064A": {
28104                 "final": "\uFDA9"
28105             },
28106             "\u0634\u062D\u064A": {
28107                 "final": "\uFDAA"
28108             },
28109             "\u0636\u062D\u064A": {
28110                 "final": "\uFDAB"
28111             },
28112             "\u0644\u062C\u064A": {
28113                 "final": "\uFDAC"
28114             },
28115             "\u0644\u0645\u064A": {
28116                 "final": "\uFDAD"
28117             },
28118             "\u064A\u062D\u064A": {
28119                 "final": "\uFDAE"
28120             },
28121             "\u064A\u062C\u064A": {
28122                 "final": "\uFDAF"
28123             },
28124             "\u064A\u0645\u064A": {
28125                 "final": "\uFDB0"
28126             },
28127             "\u0645\u0645\u064A": {
28128                 "final": "\uFDB1"
28129             },
28130             "\u0642\u0645\u064A": {
28131                 "final": "\uFDB2"
28132             },
28133             "\u0646\u062D\u064A": {
28134                 "final": "\uFDB3"
28135             },
28136             "\u0639\u0645\u064A": {
28137                 "final": "\uFDB6"
28138             },
28139             "\u0643\u0645\u064A": {
28140                 "final": "\uFDB7"
28141             },
28142             "\u0646\u062C\u062D": {
28143                 "initial": "\uFDB8",
28144                 "final": "\uFDBD"
28145             },
28146             "\u0645\u062E\u064A": {
28147                 "final": "\uFDB9"
28148             },
28149             "\u0644\u062C\u0645": {
28150                 "initial": "\uFDBA",
28151                 "final": "\uFDBC"
28152             },
28153             "\u0643\u0645\u0645": {
28154                 "final": "\uFDBB",
28155                 "initial": "\uFDC3"
28156             },
28157             "\u062C\u062D\u064A": {
28158                 "final": "\uFDBE"
28159             },
28160             "\u062D\u062C\u064A": {
28161                 "final": "\uFDBF"
28162             },
28163             "\u0645\u062C\u064A": {
28164                 "final": "\uFDC0"
28165             },
28166             "\u0641\u0645\u064A": {
28167                 "final": "\uFDC1"
28168             },
28169             "\u0628\u062D\u064A": {
28170                 "final": "\uFDC2"
28171             },
28172             "\u0633\u062E\u064A": {
28173                 "final": "\uFDC6"
28174             },
28175             "\u0646\u062C\u064A": {
28176                 "final": "\uFDC7"
28177             },
28178             "\u0644\u0622": {
28179                 "isolated": "\uFEF5",
28180                 "final": "\uFEF6"
28181             },
28182             "\u0644\u0623": {
28183                 "isolated": "\uFEF7",
28184                 "final": "\uFEF8"
28185             },
28186             "\u0644\u0625": {
28187                 "isolated": "\uFEF9",
28188                 "final": "\uFEFA"
28189             },
28190             "\u0644\u0627": {
28191                 "isolated": "\uFEFB",
28192                 "final": "\uFEFC"
28193             },
28194             "words": {
28195                 "\u0635\u0644\u06D2": "\uFDF0",
28196                 "\u0642\u0644\u06D2": "\uFDF1",
28197                 "\u0627\u0644\u0644\u0647": "\uFDF2",
28198                 "\u0627\u0643\u0628\u0631": "\uFDF3",
28199                 "\u0645\u062D\u0645\u062F": "\uFDF4",
28200                 "\u0635\u0644\u0639\u0645": "\uFDF5",
28201                 "\u0631\u0633\u0648\u0644": "\uFDF6",
28202                 "\u0639\u0644\u064A\u0647": "\uFDF7",
28203                 "\u0648\u0633\u0644\u0645": "\uFDF8",
28204                 "\u0635\u0644\u0649": "\uFDF9",
28205                 "\u0635\u0644\u0649\u0627\u0644\u0644\u0647\u0639\u0644\u064A\u0647\u0648\u0633\u0644\u0645": "\uFDFA",
28206                 "\u062C\u0644\u062C\u0644\u0627\u0644\u0647": "\uFDFB",
28207                 "\u0631\u06CC\u0627\u0644": "\uFDFC"
28208             }
28209         };
28210         exports.default = ligatureReference;
28211         });
28212
28213         unwrapExports(unicodeLigatures);
28214
28215         var reference = createCommonjsModule(function (module, exports) {
28216         Object.defineProperty(exports, "__esModule", { value: true });
28217
28218
28219         var letterList = Object.keys(unicodeArabic.default);
28220         exports.letterList = letterList;
28221         var ligatureList = Object.keys(unicodeLigatures.default);
28222         exports.ligatureList = ligatureList;
28223         var ligatureWordList = Object.keys(unicodeLigatures.default.words);
28224         exports.ligatureWordList = ligatureWordList;
28225         var lams = '\u0644\u06B5\u06B6\u06B7\u06B8';
28226         exports.lams = lams;
28227         var alefs = '\u0627\u0622\u0623\u0625\u0671\u0672\u0673\u0675\u0773\u0774';
28228         exports.alefs = alefs;
28229         // for (var l = 1; l < lams.length; l++) {
28230         //   console.log('-');
28231         //   for (var a = 0; a < alefs.length; a++) {
28232         //     console.log(a + ': ' + lams[l] + alefs[a]);
28233         //   }
28234         // }
28235         var tashkeel = '\u0605\u0640\u0670\u0674\u06DF\u06E7\u06E8';
28236         exports.tashkeel = tashkeel;
28237         function addToTashkeel(start, finish) {
28238             for (var i = start; i <= finish; i++) {
28239                 exports.tashkeel = tashkeel += String.fromCharCode(i);
28240             }
28241         }
28242         addToTashkeel(0x0610, 0x061A);
28243         addToTashkeel(0x064B, 0x065F);
28244         addToTashkeel(0x06D6, 0x06DC);
28245         addToTashkeel(0x06E0, 0x06E4);
28246         addToTashkeel(0x06EA, 0x06ED);
28247         addToTashkeel(0x08D3, 0x08E1);
28248         addToTashkeel(0x08E3, 0x08FF);
28249         addToTashkeel(0xFE70, 0xFE7F);
28250         var lineBreakers = '\u0627\u0629\u0648\u06C0\u06CF\u06FD\u06FE\u076B\u076C\u0771\u0773\u0774\u0778\u0779\u08E2\u08B1\u08B2\u08B9';
28251         exports.lineBreakers = lineBreakers;
28252         function addToLineBreakers(start, finish) {
28253             for (var i = start; i <= finish; i++) {
28254                 exports.lineBreakers = lineBreakers += String.fromCharCode(i);
28255             }
28256         }
28257         addToLineBreakers(0x0600, 0x061F); // it's OK to include tashkeel in this range as it is ignored
28258         addToLineBreakers(0x0621, 0x0625);
28259         addToLineBreakers(0x062F, 0x0632);
28260         addToLineBreakers(0x0660, 0x066D); // numerals, math
28261         addToLineBreakers(0x0671, 0x0677);
28262         addToLineBreakers(0x0688, 0x0699);
28263         addToLineBreakers(0x06C3, 0x06CB);
28264         addToLineBreakers(0x06D2, 0x06F9);
28265         addToLineBreakers(0x0759, 0x075B);
28266         addToLineBreakers(0x08AA, 0x08AE);
28267         addToLineBreakers(0xFB50, 0xFDFD); // presentation forms look like they could connect, but never do
28268         // Presentation Forms A includes diacritics but they are meant to stand alone
28269         addToLineBreakers(0xFE80, 0xFEFC); // presentation forms look like they could connect, but never do
28270         // numerals, math
28271         addToLineBreakers(0x10E60, 0x10E7F);
28272         addToLineBreakers(0x1EC70, 0x1ECBF);
28273         addToLineBreakers(0x1EE00, 0x1EEFF);
28274         });
28275
28276         unwrapExports(reference);
28277         var reference_1 = reference.letterList;
28278         var reference_2 = reference.ligatureList;
28279         var reference_3 = reference.ligatureWordList;
28280         var reference_4 = reference.lams;
28281         var reference_5 = reference.alefs;
28282         var reference_6 = reference.tashkeel;
28283         var reference_7 = reference.lineBreakers;
28284
28285         var GlyphSplitter_1 = createCommonjsModule(function (module, exports) {
28286         Object.defineProperty(exports, "__esModule", { value: true });
28287
28288
28289         function GlyphSplitter(word) {
28290             var letters = [];
28291             var lastLetter = '';
28292             word.split('').forEach(function (letter) {
28293                 if (isArabic_1.isArabic(letter)) {
28294                     if (reference.tashkeel.indexOf(letter) > -1) {
28295                         letters[letters.length - 1] += letter;
28296                     }
28297                     else if (lastLetter.length && ((reference.lams.indexOf(lastLetter) === 0 && reference.alefs.indexOf(letter) > -1) || (reference.lams.indexOf(lastLetter) > 0 && reference.alefs.indexOf(letter) === 0))) {
28298                         // valid LA forms
28299                         letters[letters.length - 1] += letter;
28300                     }
28301                     else {
28302                         letters.push(letter);
28303                     }
28304                 }
28305                 else {
28306                     letters.push(letter);
28307                 }
28308                 if (reference.tashkeel.indexOf(letter) === -1) {
28309                     lastLetter = letter;
28310                 }
28311             });
28312             return letters;
28313         }
28314         exports.GlyphSplitter = GlyphSplitter;
28315         });
28316
28317         unwrapExports(GlyphSplitter_1);
28318         var GlyphSplitter_2 = GlyphSplitter_1.GlyphSplitter;
28319
28320         var BaselineSplitter_1 = createCommonjsModule(function (module, exports) {
28321         Object.defineProperty(exports, "__esModule", { value: true });
28322
28323
28324         function BaselineSplitter(word) {
28325             var letters = [];
28326             var lastLetter = '';
28327             word.split('').forEach(function (letter) {
28328                 if (isArabic_1.isArabic(letter) && isArabic_1.isArabic(lastLetter)) {
28329                     if (lastLetter.length && reference.tashkeel.indexOf(letter) > -1) {
28330                         letters[letters.length - 1] += letter;
28331                     }
28332                     else if (reference.lineBreakers.indexOf(lastLetter) > -1) {
28333                         letters.push(letter);
28334                     }
28335                     else {
28336                         letters[letters.length - 1] += letter;
28337                     }
28338                 }
28339                 else {
28340                     letters.push(letter);
28341                 }
28342                 if (reference.tashkeel.indexOf(letter) === -1) {
28343                     // don't allow tashkeel to hide line break
28344                     lastLetter = letter;
28345                 }
28346             });
28347             return letters;
28348         }
28349         exports.BaselineSplitter = BaselineSplitter;
28350         });
28351
28352         unwrapExports(BaselineSplitter_1);
28353         var BaselineSplitter_2 = BaselineSplitter_1.BaselineSplitter;
28354
28355         var Normalization = createCommonjsModule(function (module, exports) {
28356         Object.defineProperty(exports, "__esModule", { value: true });
28357
28358
28359
28360
28361         function Normal(word, breakPresentationForm) {
28362             // default is to turn initial/isolated/medial/final presentation form to generic
28363             if (typeof breakPresentationForm === 'undefined') {
28364                 breakPresentationForm = true;
28365             }
28366             var returnable = '';
28367             word.split('').forEach(function (letter) {
28368                 if (!isArabic_1.isArabic(letter)) {
28369                     returnable += letter;
28370                     return;
28371                 }
28372                 for (var w = 0; w < reference.letterList.length; w++) {
28373                     // ok so we are checking this potential lettertron
28374                     var letterForms = unicodeArabic.default[reference.letterList[w]];
28375                     var versions = Object.keys(letterForms);
28376                     for (var v = 0; v < versions.length; v++) {
28377                         var localVersion = letterForms[versions[v]];
28378                         if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28379                             // look at this embedded object
28380                             var embeddedForms = Object.keys(localVersion);
28381                             for (var ef = 0; ef < embeddedForms.length; ef++) {
28382                                 var form = localVersion[embeddedForms[ef]];
28383                                 if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28384                                     // match
28385                                     // console.log('embedded match');
28386                                     if (form === letter) {
28387                                         // match exact
28388                                         if (breakPresentationForm && localVersion['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(embeddedForms[ef]) > -1) {
28389                                             // replace presentation form
28390                                             // console.log('keeping normal form of the letter');
28391                                             if (typeof localVersion['normal'] === 'object') {
28392                                                 returnable += localVersion['normal'][0];
28393                                             }
28394                                             else {
28395                                                 returnable += localVersion['normal'];
28396                                             }
28397                                             return;
28398                                         }
28399                                         // console.log('keeping this letter');
28400                                         returnable += letter;
28401                                         return;
28402                                     }
28403                                     else if (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1) {
28404                                         // match
28405                                         returnable += form[0];
28406                                         // console.log('added the first letter from the same array');
28407                                         return;
28408                                     }
28409                                 }
28410                             }
28411                         }
28412                         else if (localVersion === letter) {
28413                             // match exact
28414                             if (breakPresentationForm && letterForms['normal'] && ['isolated', 'initial', 'medial', 'final'].indexOf(versions[v]) > -1) {
28415                                 // replace presentation form
28416                                 // console.log('keeping normal form of the letter');
28417                                 if (typeof letterForms['normal'] === 'object') {
28418                                     returnable += letterForms['normal'][0];
28419                                 }
28420                                 else {
28421                                     returnable += letterForms['normal'];
28422                                 }
28423                                 return;
28424                             }
28425                             // console.log('keeping this letter');
28426                             returnable += letter;
28427                             return;
28428                         }
28429                         else if (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1) {
28430                             // match
28431                             returnable += localVersion[0];
28432                             // console.log('added the first letter from the same array');
28433                             return;
28434                         }
28435                     }
28436                 }
28437                 // try ligatures
28438                 for (var v2 = 0; v2 < reference.ligatureList.length; v2++) {
28439                     var normalForm = reference.ligatureList[v2];
28440                     if (normalForm !== 'words') {
28441                         var ligForms = Object.keys(unicodeLigatures.default[normalForm]);
28442                         for (var f = 0; f < ligForms.length; f++) {
28443                             if (unicodeLigatures.default[normalForm][ligForms[f]] === letter) {
28444                                 returnable += normalForm;
28445                                 return;
28446                             }
28447                         }
28448                     }
28449                 }
28450                 // try words ligatures
28451                 for (var v3 = 0; v3 < reference.ligatureWordList.length; v3++) {
28452                     var normalForm = reference.ligatureWordList[v3];
28453                     if (unicodeLigatures.default.words[normalForm] === letter) {
28454                         returnable += normalForm;
28455                         return;
28456                     }
28457                 }
28458                 returnable += letter;
28459                 // console.log('kept the letter')
28460             });
28461             return returnable;
28462         }
28463         exports.Normal = Normal;
28464         });
28465
28466         unwrapExports(Normalization);
28467         var Normalization_1 = Normalization.Normal;
28468
28469         var CharShaper_1 = createCommonjsModule(function (module, exports) {
28470         Object.defineProperty(exports, "__esModule", { value: true });
28471
28472
28473
28474         function CharShaper(letter, form) {
28475             if (!isArabic_1.isArabic(letter)) {
28476                 // fail not Arabic
28477                 throw new Error('Not Arabic');
28478             }
28479             if (letter === "\u0621") {
28480                 // hamza alone
28481                 return "\u0621";
28482             }
28483             for (var w = 0; w < reference.letterList.length; w++) {
28484                 // ok so we are checking this potential lettertron
28485                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28486                 var versions = Object.keys(letterForms);
28487                 for (var v = 0; v < versions.length; v++) {
28488                     var localVersion = letterForms[versions[v]];
28489                     if ((localVersion === letter) ||
28490                         (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28491                         if (versions.indexOf(form) > -1) {
28492                             return letterForms[form];
28493                         }
28494                     }
28495                     else if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28496                         // check embedded
28497                         var embeddedVersions = Object.keys(localVersion);
28498                         for (var ev = 0; ev < embeddedVersions.length; ev++) {
28499                             if ((localVersion[embeddedVersions[ev]] === letter) ||
28500                                 (typeof localVersion[embeddedVersions[ev]] === 'object' && localVersion[embeddedVersions[ev]].indexOf && localVersion[embeddedVersions[ev]].indexOf(letter) > -1)) {
28501                                 if (embeddedVersions.indexOf(form) > -1) {
28502                                     return localVersion[form];
28503                                 }
28504                             }
28505                         }
28506                     }
28507                 }
28508             }
28509         }
28510         exports.CharShaper = CharShaper;
28511         });
28512
28513         unwrapExports(CharShaper_1);
28514         var CharShaper_2 = CharShaper_1.CharShaper;
28515
28516         var WordShaper_1 = createCommonjsModule(function (module, exports) {
28517         Object.defineProperty(exports, "__esModule", { value: true });
28518
28519
28520
28521
28522         function WordShaper(word) {
28523             var state = 'initial';
28524             var output = '';
28525             for (var w = 0; w < word.length; w++) {
28526                 var nextLetter = ' ';
28527                 for (var nxw = w + 1; nxw < word.length; nxw++) {
28528                     if (!isArabic_1.isArabic(word[nxw])) {
28529                         break;
28530                     }
28531                     if (reference.tashkeel.indexOf(word[nxw]) === -1) {
28532                         nextLetter = word[nxw];
28533                         break;
28534                     }
28535                 }
28536                 if (!isArabic_1.isArabic(word[w]) || isArabic_1.isMath(word[w])) {
28537                     // space or other non-Arabic
28538                     output += word[w];
28539                     state = 'initial';
28540                 }
28541                 else if (reference.tashkeel.indexOf(word[w]) > -1) {
28542                     // tashkeel - add without changing state
28543                     output += word[w];
28544                 }
28545                 else if ((nextLetter === ' ') // last Arabic letter in this word
28546                     || (reference.lineBreakers.indexOf(word[w]) > -1)) { // the current letter is known to break lines
28547                     output += CharShaper_1.CharShaper(word[w], state === 'initial' ? 'isolated' : 'final');
28548                     state = 'initial';
28549                 }
28550                 else if (reference.lams.indexOf(word[w]) > -1 && reference.alefs.indexOf(nextLetter) > -1) {
28551                     // LA letters - advance an additional letter after this
28552                     output += unicodeLigatures.default[word[w] + nextLetter][(state === 'initial' ? 'isolated' : 'final')];
28553                     while (word[w] !== nextLetter) {
28554                         w++;
28555                     }
28556                     state = 'initial';
28557                 }
28558                 else {
28559                     output += CharShaper_1.CharShaper(word[w], state);
28560                     state = 'medial';
28561                 }
28562             }
28563             return output;
28564         }
28565         exports.WordShaper = WordShaper;
28566         });
28567
28568         unwrapExports(WordShaper_1);
28569         var WordShaper_2 = WordShaper_1.WordShaper;
28570
28571         var ParentLetter_1 = createCommonjsModule(function (module, exports) {
28572         Object.defineProperty(exports, "__esModule", { value: true });
28573
28574
28575
28576         function ParentLetter(letter) {
28577             if (!isArabic_1.isArabic(letter)) {
28578                 throw new Error('Not an Arabic letter');
28579             }
28580             for (var w = 0; w < reference.letterList.length; w++) {
28581                 // ok so we are checking this potential lettertron
28582                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28583                 var versions = Object.keys(letterForms);
28584                 for (var v = 0; v < versions.length; v++) {
28585                     var localVersion = letterForms[versions[v]];
28586                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28587                         // look at this embedded object
28588                         var embeddedForms = Object.keys(localVersion);
28589                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28590                             var form = localVersion[embeddedForms[ef]];
28591                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28592                                 // match
28593                                 return localVersion;
28594                             }
28595                         }
28596                     }
28597                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28598                         // match
28599                         return letterForms;
28600                     }
28601                 }
28602                 return null;
28603             }
28604         }
28605         exports.ParentLetter = ParentLetter;
28606         function GrandparentLetter(letter) {
28607             if (!isArabic_1.isArabic(letter)) {
28608                 throw new Error('Not an Arabic letter');
28609             }
28610             for (var w = 0; w < reference.letterList.length; w++) {
28611                 // ok so we are checking this potential lettertron
28612                 var letterForms = unicodeArabic.default[reference.letterList[w]];
28613                 var versions = Object.keys(letterForms);
28614                 for (var v = 0; v < versions.length; v++) {
28615                     var localVersion = letterForms[versions[v]];
28616                     if (typeof localVersion === 'object' && typeof localVersion.indexOf === 'undefined') {
28617                         // look at this embedded object
28618                         var embeddedForms = Object.keys(localVersion);
28619                         for (var ef = 0; ef < embeddedForms.length; ef++) {
28620                             var form = localVersion[embeddedForms[ef]];
28621                             if (form === letter || (typeof form === 'object' && form.indexOf && form.indexOf(letter) > -1)) {
28622                                 // match
28623                                 return letterForms;
28624                             }
28625                         }
28626                     }
28627                     else if (localVersion === letter || (typeof localVersion === 'object' && localVersion.indexOf && localVersion.indexOf(letter) > -1)) {
28628                         // match
28629                         return letterForms;
28630                     }
28631                 }
28632                 return null;
28633             }
28634         }
28635         exports.GrandparentLetter = GrandparentLetter;
28636         });
28637
28638         unwrapExports(ParentLetter_1);
28639         var ParentLetter_2 = ParentLetter_1.ParentLetter;
28640         var ParentLetter_3 = ParentLetter_1.GrandparentLetter;
28641
28642         var lib$1 = createCommonjsModule(function (module, exports) {
28643         Object.defineProperty(exports, "__esModule", { value: true });
28644
28645         exports.isArabic = isArabic_1.isArabic;
28646
28647         exports.GlyphSplitter = GlyphSplitter_1.GlyphSplitter;
28648
28649         exports.BaselineSplitter = BaselineSplitter_1.BaselineSplitter;
28650
28651         exports.Normal = Normalization.Normal;
28652
28653         exports.CharShaper = CharShaper_1.CharShaper;
28654
28655         exports.WordShaper = WordShaper_1.WordShaper;
28656
28657         exports.ParentLetter = ParentLetter_1.ParentLetter;
28658         exports.GrandparentLetter = ParentLetter_1.GrandparentLetter;
28659         });
28660
28661         unwrapExports(lib$1);
28662         var lib_1 = lib$1.isArabic;
28663         var lib_2 = lib$1.GlyphSplitter;
28664         var lib_3 = lib$1.BaselineSplitter;
28665         var lib_4 = lib$1.Normal;
28666         var lib_5 = lib$1.CharShaper;
28667         var lib_6 = lib$1.WordShaper;
28668         var lib_7 = lib$1.ParentLetter;
28669         var lib_8 = lib$1.GrandparentLetter;
28670
28671         // see https://github.com/openstreetmap/iD/pull/3707
28672
28673         var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
28674
28675         function fixRTLTextForSvg(inputText) {
28676             var ret = '', rtlBuffer = [];
28677             var arabicRegex = /[\u0600-\u06FF]/g;
28678             var arabicMath = /[\u0660-\u066C]+/g;
28679             var thaanaVowel = /[\u07A6-\u07B0]/;
28680             var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
28681
28682             if (!arabicRegex.test(inputText)) {
28683                 // Hebrew or Thaana RTL script
28684                 for (var n = 0; n < inputText.length; n++) {
28685                     var c = inputText[n];
28686                     if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
28687                         rtlBuffer[rtlBuffer.length - 1] += c;
28688                     } else if (rtlRegex.test(c)) {
28689                         rtlBuffer.push(c);
28690                     } else if (c === ' ' && rtlBuffer.length) {
28691                         // whitespace within RTL text
28692                         rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
28693                     } else {
28694                         // non-RTL character
28695                         ret += rtlBuffer.reverse().join('') + c;
28696                         rtlBuffer = [];
28697                     }
28698                 }
28699                 ret += rtlBuffer.reverse().join('');
28700                 return ret;
28701             } else {
28702                 var label = lib_6(inputText).split('').reverse().join('');
28703                 // prevent Arabic numbers from being reversed
28704                 var numericSwaps = label.match(arabicMath) || [];
28705                 for (var i = 0; i < numericSwaps.length; i++) {
28706                     if (numericSwaps[i].length > 1) {
28707                         label = label.replace(numericSwaps[i], numericSwaps[i].split('').reverse().join(''));
28708                     }
28709                 }
28710                 return label;
28711             }
28712         }
28713
28714         var translations = Object.create(null);
28715
28716         var currentLocale = 'en';
28717         var textDirection = 'ltr';
28718
28719         function setLocale(val) {
28720             if (translations[val] !== undefined) {
28721                 currentLocale = val;
28722             } else if (translations[val.split('-')[0]]) {
28723                 currentLocale = val.split('-')[0];
28724             }
28725         }
28726
28727         function addTranslation(id, value) {
28728             translations[id] = value;
28729         }
28730
28731         /**
28732          * Given a string identifier, try to find that string in the current
28733          * language, and return it.  This function will be called recursively
28734          * with locale `en` if a string can not be found in the requested language.
28735          *
28736          * @param {string}   s   string identifier
28737          * @param {object?}  o   object of token replacements and default string
28738          * @param {string?}  loc locale to use
28739          * @returns {string?} locale string
28740          */
28741         function t(s, o, loc) {
28742             loc = loc || currentLocale;
28743
28744             var path = s
28745                 .split('.')
28746                 .map(function (s) { return s.replace(/<TX_DOT>/g, '.'); })
28747                 .reverse();
28748
28749             var rep = translations[loc];
28750
28751             while (rep !== undefined && path.length) {
28752                 rep = rep[path.pop()];
28753             }
28754
28755             if (rep !== undefined) {
28756                 if (o) {
28757                     for (var k in o) {
28758                         var variable = '{' + k + '}';
28759                         var re = new RegExp(variable, 'g'); // check globally for variables
28760                         rep = rep.replace(re, o[k]);
28761                     }
28762                 }
28763                 return rep;
28764             }
28765
28766             if (loc !== 'en') {
28767                 return t(s, o, 'en');
28768             }
28769
28770             if (o && 'default' in o) {
28771                 return o.default;
28772             }
28773
28774             var missing = 'Missing ' + loc + ' translation: ' + s;
28775             if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
28776
28777             return missing;
28778         }
28779
28780         /**
28781          * Given string 'ltr' or 'rtl', save that setting
28782          *
28783          * @param {string} dir ltr or rtl
28784          */
28785
28786         function setTextDirection(dir) {
28787             textDirection = dir;
28788         }
28789
28790         var detected;
28791
28792         function utilDetect(force) {
28793             if (detected && !force) return detected;
28794             detected = {};
28795
28796             var ua = navigator.userAgent,
28797                 m = null,
28798                 q = utilStringQs(window.location.hash.substring(1));
28799
28800             m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
28801             if (m !== null) {
28802                 detected.browser = m[1];
28803                 detected.version = m[2];
28804             }
28805             if (!detected.browser) {
28806                 m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
28807                 if (m !== null) {
28808                     detected.browser = 'msie';
28809                     detected.version = m[1];
28810                 }
28811             }
28812             if (!detected.browser) {
28813                 m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
28814                 if (m !== null) {
28815                     detected.browser = 'Opera';
28816                     detected.version = m[2];
28817                 }
28818             }
28819             if (!detected.browser) {
28820                 m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
28821                 if (m !== null) {
28822                     detected.browser = m[1];
28823                     detected.version = m[2];
28824                     m = ua.match(/version\/([\.\d]+)/i);
28825                     if (m !== null) detected.version = m[1];
28826                 }
28827             }
28828             if (!detected.browser) {
28829                 detected.browser = navigator.appName;
28830                 detected.version = navigator.appVersion;
28831             }
28832
28833             // keep major.minor version only..
28834             detected.version = detected.version.split(/\W/).slice(0,2).join('.');
28835
28836             if (detected.browser.toLowerCase() === 'msie') {
28837                 detected.ie = true;
28838                 detected.browser = 'Internet Explorer';
28839                 detected.support = parseFloat(detected.version) >= 11;
28840             } else {
28841                 detected.ie = false;
28842                 detected.support = true;
28843             }
28844
28845             // Added due to incomplete svg style support. See #715
28846             detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
28847
28848             // Set locale based on url param (format 'en-US') or browser lang (default)
28849             if (q.hasOwnProperty('locale')) {
28850                 detected.locale = q.locale;
28851                 detected.language = q.locale.split('-')[0];
28852             } else {
28853                 detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
28854                 detected.language = detected.locale.split('-')[0];
28855
28856                 // Search `navigator.languages` for a better locale. Prefer the first language,
28857                 // unless the second language is a culture-specific version of the first one, see #3842
28858                 if (navigator.languages && navigator.languages.length > 0) {
28859                     var code0 = navigator.languages[0],
28860                         parts0 = code0.split('-');
28861
28862                     detected.locale = code0;
28863                     detected.language = parts0[0];
28864
28865                     if (navigator.languages.length > 1 && parts0.length === 1) {
28866                         var code1 = navigator.languages[1],
28867                             parts1 = code1.split('-');
28868
28869                         if (parts1[0] === parts0[0]) {
28870                             detected.locale = code1;
28871                         }
28872                     }
28873                 }
28874             }
28875
28876             // Loaded locale is stored in currentLocale
28877             // return that instead (except in the situation where 'en' might override 'en-US')
28878             var loadedLocale = currentLocale || 'en';
28879             if (loadedLocale !== 'en') {
28880                 detected.locale = loadedLocale;
28881                 detected.language = detected.locale.split('-')[0];
28882             }
28883
28884             // detect text direction
28885             var lang = dataLocales[detected.locale];
28886             if ((lang && lang.rtl) || (q.rtl === 'true')) {
28887                 detected.textDirection = 'rtl';
28888             } else {
28889                 detected.textDirection = 'ltr';
28890             }
28891             setTextDirection(detected.textDirection);
28892
28893             // detect host
28894             var loc = window.top.location;
28895             var origin = loc.origin;
28896             if (!origin) {  // for unpatched IE11
28897                 origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
28898             }
28899
28900             detected.host = origin + loc.pathname;
28901
28902             detected.filedrop = (window.FileReader && 'ondrop' in window);
28903
28904             detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28905
28906             detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
28907
28908             function nav(x) {
28909                 return navigator.userAgent.indexOf(x) !== -1;
28910             }
28911
28912             if (nav('Win')) {
28913                 detected.os = 'win';
28914                 detected.platform = 'Windows';
28915             }
28916             else if (nav('Mac')) {
28917                 detected.os = 'mac';
28918                 detected.platform = 'Macintosh';
28919             }
28920             else if (nav('X11') || nav('Linux')) {
28921                 detected.os = 'linux';
28922                 detected.platform = 'Linux';
28923             }
28924             else {
28925                 detected.os = 'win';
28926                 detected.platform = 'Unknown';
28927             }
28928
28929             return detected;
28930         }
28931
28932         function utilTagText(entity) {
28933             var obj = (entity && entity.tags) || {};
28934             return Object.keys(obj)
28935                 .map(function(k) { return k + '=' + obj[k]; })
28936                 .join(', ');
28937         }
28938
28939
28940         function utilTagDiff(oldTags, newTags) {
28941             var tagDiff = [];
28942             var keys = utilArrayUnion(Object.keys(oldTags), Object.keys(newTags)).sort();
28943             keys.forEach(function(k) {
28944                 var oldVal = oldTags[k];
28945                 var newVal = newTags[k];
28946
28947                 if (oldVal && (!newVal || newVal !== oldVal)) {
28948                     tagDiff.push({
28949                         type: '-',
28950                         key: k,
28951                         oldVal: oldVal,
28952                         newVal: newVal,
28953                         display: '- ' + k + '=' + oldVal
28954                     });
28955                 }
28956                 if (newVal && (!oldVal || newVal !== oldVal)) {
28957                     tagDiff.push({
28958                         type: '+',
28959                         key: k,
28960                         oldVal: oldVal,
28961                         newVal: newVal,
28962                         display: '+ ' + k + '=' + newVal
28963                     });
28964                 }
28965             });
28966             return tagDiff;
28967         }
28968
28969
28970         function utilEntitySelector(ids) {
28971             return ids.length ? '.' + ids.join(',.') : 'nothing';
28972         }
28973
28974
28975         // returns an selector to select entity ids for:
28976         //  - entityIDs passed in
28977         //  - shallow descendant entityIDs for any of those entities that are relations
28978         function utilEntityOrMemberSelector(ids, graph) {
28979             var seen = new Set(ids);
28980             ids.forEach(collectShallowDescendants);
28981             return utilEntitySelector(Array.from(seen));
28982
28983             function collectShallowDescendants(id) {
28984                 var entity = graph.hasEntity(id);
28985                 if (!entity || entity.type !== 'relation') return;
28986
28987                 entity.members
28988                     .map(function(member) { return member.id; })
28989                     .forEach(function(id) { seen.add(id); });
28990             }
28991         }
28992
28993
28994         // returns an selector to select entity ids for:
28995         //  - entityIDs passed in
28996         //  - deep descendant entityIDs for any of those entities that are relations
28997         function utilEntityOrDeepMemberSelector(ids, graph) {
28998             var seen = new Set();
28999             ids.forEach(collectDeepDescendants);
29000             return utilEntitySelector(Array.from(seen));
29001
29002             function collectDeepDescendants(id) {
29003                 if (seen.has(id)) return;
29004                 seen.add(id);
29005
29006                 var entity = graph.hasEntity(id);
29007                 if (!entity || entity.type !== 'relation') return;
29008
29009                 entity.members
29010                     .map(function(member) { return member.id; })
29011                     .forEach(collectDeepDescendants);   // recurse
29012             }
29013         }
29014
29015
29016         // Adds or removes highlight styling for the specified entities
29017         function utilHighlightEntities(ids, highlighted, context) {
29018             context.surface()
29019                 .selectAll(utilEntityOrDeepMemberSelector(ids, context.graph()))
29020                 .classed('highlighted', highlighted);
29021         }
29022
29023
29024         // returns an Array that is the union of:
29025         //  - nodes for any nodeIDs passed in
29026         //  - child nodes of any wayIDs passed in
29027         //  - descendant member and child nodes of relationIDs passed in
29028         function utilGetAllNodes(ids, graph) {
29029             var seen = new Set();
29030             var nodes = new Set();
29031
29032             ids.forEach(collectNodes);
29033             return Array.from(nodes);
29034
29035             function collectNodes(id) {
29036                 if (seen.has(id)) return;
29037                 seen.add(id);
29038
29039                 var entity = graph.hasEntity(id);
29040                 if (!entity) return;
29041
29042                 if (entity.type === 'node') {
29043                     nodes.add(entity);
29044                 } else if (entity.type === 'way') {
29045                     entity.nodes.forEach(collectNodes);
29046                 } else {
29047                     entity.members
29048                         .map(function(member) { return member.id; })
29049                         .forEach(collectNodes);   // recurse
29050                 }
29051             }
29052         }
29053
29054
29055         function utilDisplayName(entity) {
29056             var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0];
29057             var name = entity.tags[localizedNameKey] || entity.tags.name || '';
29058             var network = entity.tags.cycle_network || entity.tags.network;
29059
29060             if (!name && entity.tags.ref) {
29061                 name = entity.tags.ref;
29062                 if (network) {
29063                     name = network + ' ' + name;
29064                 }
29065             }
29066
29067             return name;
29068         }
29069
29070
29071         function utilDisplayNameForPath(entity) {
29072             var name = utilDisplayName(entity);
29073             var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
29074
29075             if (!isFirefox && name && rtlRegex.test(name)) {
29076                 name = fixRTLTextForSvg(name);
29077             }
29078
29079             return name;
29080         }
29081
29082
29083         function utilDisplayType(id) {
29084             return {
29085                 n: t('inspector.node'),
29086                 w: t('inspector.way'),
29087                 r: t('inspector.relation')
29088             }[id.charAt(0)];
29089         }
29090
29091
29092         function utilDisplayLabel(entity, context) {
29093             var displayName = utilDisplayName(entity);
29094             if (displayName) {
29095                 // use the display name if there is one
29096                 return displayName;
29097             }
29098             var preset = utilPreset(entity, context);
29099             if (preset && preset.name()) {
29100                 // use the preset name if there is a match
29101                 return preset.name();
29102             }
29103             // fallback to the display type (node/way/relation)
29104             return utilDisplayType(entity.id);
29105         }
29106
29107
29108         function utilPreset(entity, context) {
29109             return context.presets().match(entity, context.graph());
29110         }
29111
29112
29113         function utilEntityRoot(entityType) {
29114             return {
29115                 node: 'n',
29116                 way: 'w',
29117                 relation: 'r'
29118             }[entityType];
29119         }
29120
29121
29122         function utilStringQs(str) {
29123             return str.split('&').reduce(function(obj, pair){
29124                 var parts = pair.split('=');
29125                 if (parts.length === 2) {
29126                     obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
29127                 }
29128                 return obj;
29129             }, {});
29130         }
29131
29132
29133         function utilQsString(obj, noencode) {
29134             // encode everything except special characters used in certain hash parameters:
29135             // "/" in map states, ":", ",", {" and "}" in background
29136             function softEncode(s) {
29137                 return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
29138             }
29139
29140             return Object.keys(obj).sort().map(function(key) {
29141                 return encodeURIComponent(key) + '=' + (
29142                     noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
29143             }).join('&');
29144         }
29145
29146
29147         function utilPrefixDOMProperty(property) {
29148             var prefixes = ['webkit', 'ms', 'moz', 'o'];
29149             var i = -1;
29150             var n = prefixes.length;
29151             var s = document.body;
29152
29153             if (property in s)
29154                 return property;
29155
29156             property = property.substr(0, 1).toUpperCase() + property.substr(1);
29157
29158             while (++i < n) {
29159                 if (prefixes[i] + property in s) {
29160                     return prefixes[i] + property;
29161                 }
29162             }
29163
29164             return false;
29165         }
29166
29167
29168         function utilPrefixCSSProperty(property) {
29169             var prefixes = ['webkit', 'ms', 'Moz', 'O'];
29170             var i = -1;
29171             var n = prefixes.length;
29172             var s = document.body.style;
29173
29174             if (property.toLowerCase() in s) {
29175                 return property.toLowerCase();
29176             }
29177
29178             while (++i < n) {
29179                 if (prefixes[i] + property in s) {
29180                     return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
29181                 }
29182             }
29183
29184             return false;
29185         }
29186
29187
29188         var transformProperty;
29189         function utilSetTransform(el, x, y, scale) {
29190             var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform');
29191             var translate = utilDetect().opera ? 'translate('   + x + 'px,' + y + 'px)'
29192                 : 'translate3d(' + x + 'px,' + y + 'px,0)';
29193             return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
29194         }
29195
29196
29197         // Calculates Levenshtein distance between two strings
29198         // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
29199         // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
29200         function utilEditDistance(a, b) {
29201             a = remove$1(a.toLowerCase());
29202             b = remove$1(b.toLowerCase());
29203             if (a.length === 0) return b.length;
29204             if (b.length === 0) return a.length;
29205             var matrix = [];
29206             for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
29207             for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
29208             for (i = 1; i <= b.length; i++) {
29209                 for (j = 1; j <= a.length; j++) {
29210                     if (b.charAt(i-1) === a.charAt(j-1)) {
29211                         matrix[i][j] = matrix[i-1][j-1];
29212                     } else {
29213                         matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
29214                             Math.min(matrix[i][j-1] + 1, // insertion
29215                             matrix[i-1][j] + 1)); // deletion
29216                     }
29217                 }
29218             }
29219             return matrix[b.length][a.length];
29220         }
29221
29222
29223         // a d3.mouse-alike which
29224         // 1. Only works on HTML elements, not SVG
29225         // 2. Does not cause style recalculation
29226         function utilFastMouse(container) {
29227             var rect = container.getBoundingClientRect();
29228             var rectLeft = rect.left;
29229             var rectTop = rect.top;
29230             var clientLeft = +container.clientLeft;
29231             var clientTop = +container.clientTop;
29232
29233             if (textDirection === 'rtl') {
29234                 rectLeft = 0;
29235             }
29236             return function(e) {
29237                 return [
29238                     e.clientX - rectLeft - clientLeft,
29239                     e.clientY - rectTop - clientTop];
29240             };
29241         }
29242
29243
29244         function utilAsyncMap(inputs, func, callback) {
29245             var remaining = inputs.length;
29246             var results = [];
29247             var errors = [];
29248
29249             inputs.forEach(function(d, i) {
29250                 func(d, function done(err, data) {
29251                     errors[i] = err;
29252                     results[i] = data;
29253                     remaining--;
29254                     if (!remaining) callback(errors, results);
29255                 });
29256             });
29257         }
29258
29259
29260         // wraps an index to an interval [0..length-1]
29261         function utilWrap(index, length) {
29262             if (index < 0) {
29263                 index += Math.ceil(-index/length)*length;
29264             }
29265             return index % length;
29266         }
29267
29268
29269         /**
29270          * a replacement for functor
29271          *
29272          * @param {*} value any value
29273          * @returns {Function} a function that returns that value or the value if it's a function
29274          */
29275         function utilFunctor(value) {
29276             if (typeof value === 'function') return value;
29277             return function() {
29278                 return value;
29279             };
29280         }
29281
29282
29283         function utilNoAuto(selection) {
29284             var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
29285
29286             return selection
29287                 // assign 'new-password' even for non-password fields to prevent browsers (Chrome) ignoring 'off'
29288                 .attr('autocomplete', 'new-password')
29289                 .attr('autocorrect', 'off')
29290                 .attr('autocapitalize', 'off')
29291                 .attr('spellcheck', isText ? 'true' : 'false');
29292         }
29293
29294
29295         // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
29296         // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
29297         function utilHashcode(str) {
29298             var hash = 0;
29299             if (str.length === 0) {
29300                 return hash;
29301             }
29302             for (var i = 0; i < str.length; i++) {
29303                 var char = str.charCodeAt(i);
29304                 hash = ((hash << 5) - hash) + char;
29305                 hash = hash & hash; // Convert to 32bit integer
29306             }
29307             return hash;
29308         }
29309
29310         function utilCleanTags(tags) {
29311             var out = {};
29312             for (var k in tags) {
29313                 if (!k) continue;
29314                 var v = tags[k];
29315                 if (v !== undefined) {
29316                     out[k] = cleanValue(k, v);
29317                 }
29318             }
29319
29320             return out;
29321
29322
29323             function cleanValue(k, v) {
29324                 function keepSpaces(k) {
29325                     return /_hours|_times|:conditional$/.test(k);
29326                 }
29327
29328                 function skip(k) {
29329                     return /^(description|note|fixme)$/.test(k);
29330                 }
29331
29332                 if (skip(k)) return v;
29333
29334                 var cleaned = v
29335                     .split(';')
29336                     .map(function(s) { return s.trim(); })
29337                     .join(keepSpaces(k) ? '; ' : ';');
29338
29339                 // The code below is not intended to validate websites and emails.
29340                 // It is only intended to prevent obvious copy-paste errors. (#2323)
29341                 // clean website- and email-like tags
29342                 if (k.indexOf('website') !== -1 ||
29343                     k.indexOf('email') !== -1 ||
29344                     cleaned.indexOf('http') === 0) {
29345                     cleaned = cleaned
29346                         .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
29347
29348                 }
29349
29350                 return cleaned;
29351             }
29352         }
29353
29354         // Like selection.property('value', ...), but avoids no-op value sets,
29355         // which can result in layout/repaint thrashing in some situations.
29356         function utilGetSetValue(selection, value) {
29357             function d3_selection_value(value) {
29358                 function valueNull() {
29359                     delete this.value;
29360                 }
29361
29362                 function valueConstant() {
29363                     if (this.value !== value) {
29364                         this.value = value;
29365                     }
29366                 }
29367
29368                 function valueFunction() {
29369                     var x = value.apply(this, arguments);
29370                     if (x == null) {
29371                         delete this.value;
29372                     } else if (this.value !== x) {
29373                         this.value = x;
29374                     }
29375                 }
29376
29377                 return value == null
29378                     ? valueNull : (typeof value === 'function'
29379                     ? valueFunction : valueConstant);
29380             }
29381
29382             if (arguments.length === 1) {
29383                 return selection.property('value');
29384             }
29385
29386             return selection.each(d3_selection_value(value));
29387         }
29388
29389         function utilKeybinding(namespace) {
29390             var _keybindings = {};
29391
29392
29393             function testBindings(isCapturing) {
29394                 var didMatch = false;
29395                 var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
29396                 var i, binding;
29397
29398                 // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
29399                 // so we don't strictly match on the shift key, but we prioritize
29400                 // shifted keybindings first, and fallback to unshifted only if no match.
29401                 // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
29402
29403                 // priority match shifted keybindings first
29404                 for (i = 0; i < bindings.length; i++) {
29405                     binding = bindings[i];
29406                     if (!binding.event.modifiers.shiftKey) continue;  // no shift
29407                     if (!!binding.capture !== isCapturing) continue;
29408                     if (matches(binding, true)) {
29409                         binding.callback();
29410                         didMatch = true;
29411                     }
29412                 }
29413
29414                 // then unshifted keybindings
29415                 if (didMatch) return;
29416                 for (i = 0; i < bindings.length; i++) {
29417                     binding = bindings[i];
29418                     if (binding.event.modifiers.shiftKey) continue;   // shift
29419                     if (!!binding.capture !== isCapturing) continue;
29420                     if (matches(binding, false)) {
29421                         binding.callback();
29422                     }
29423                 }
29424
29425
29426                 function matches(binding, testShift) {
29427                     var event$1 = event;
29428                     var isMatch = false;
29429                     var tryKeyCode = true;
29430
29431                     // Prefer a match on `KeyboardEvent.key`
29432                     if (event$1.key !== undefined) {
29433                         tryKeyCode = (event$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
29434                         isMatch = true;
29435
29436                         if (binding.event.key === undefined) {
29437                             isMatch = false;
29438                         } else if (Array.isArray(binding.event.key)) {
29439                             if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$1.key.toLowerCase()) === -1)
29440                                 isMatch = false;
29441                         } else {
29442                             if (event$1.key.toLowerCase() !== binding.event.key.toLowerCase())
29443                                 isMatch = false;
29444                         }
29445                     }
29446
29447                     // Fallback match on `KeyboardEvent.keyCode`, can happen if:
29448                     // - browser doesn't support `KeyboardEvent.key`
29449                     // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
29450                     if (!isMatch && tryKeyCode) {
29451                         isMatch = (event$1.keyCode === binding.event.keyCode);
29452                     }
29453
29454                     if (!isMatch) return false;
29455
29456                     // test modifier keys
29457                     if (!(event$1.ctrlKey && event$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
29458                         if (event$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
29459                         if (event$1.altKey !== binding.event.modifiers.altKey) return false;
29460                     }
29461                     if (event$1.metaKey !== binding.event.modifiers.metaKey) return false;
29462                     if (testShift && event$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
29463
29464                     return true;
29465                 }
29466             }
29467
29468
29469             function capture() {
29470                 testBindings(true);
29471             }
29472
29473
29474             function bubble() {
29475                 var tagName = d3_select(event.target).node().tagName;
29476                 if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
29477                     return;
29478                 }
29479                 testBindings(false);
29480             }
29481
29482
29483             function keybinding(selection) {
29484                 selection = selection || d3_select(document);
29485                 selection.on('keydown.capture.' + namespace, capture, true);
29486                 selection.on('keydown.bubble.' + namespace, bubble, false);
29487                 return keybinding;
29488             }
29489
29490             // was: keybinding.off()
29491             keybinding.unbind = function(selection) {
29492                 _keybindings = [];
29493                 selection = selection || d3_select(document);
29494                 selection.on('keydown.capture.' + namespace, null);
29495                 selection.on('keydown.bubble.' + namespace, null);
29496                 return keybinding;
29497             };
29498
29499
29500             keybinding.clear = function() {
29501                 _keybindings = {};
29502                 return keybinding;
29503             };
29504
29505
29506             // Remove one or more keycode bindings.
29507             keybinding.off = function(codes, capture) {
29508                 var arr = utilArrayUniq([].concat(codes));
29509
29510                 for (var i = 0; i < arr.length; i++) {
29511                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29512                     delete _keybindings[id];
29513                 }
29514                 return keybinding;
29515             };
29516
29517
29518             // Add one or more keycode bindings.
29519             keybinding.on = function(codes, callback, capture) {
29520                 if (typeof callback !== 'function') {
29521                     return keybinding.off(codes, capture);
29522                 }
29523
29524                 var arr = utilArrayUniq([].concat(codes));
29525
29526                 for (var i = 0; i < arr.length; i++) {
29527                     var id = arr[i] + (capture ? '-capture' : '-bubble');
29528                     var binding = {
29529                         id: id,
29530                         capture: capture,
29531                         callback: callback,
29532                         event: {
29533                             key: undefined,  // preferred
29534                             keyCode: 0,      // fallback
29535                             modifiers: {
29536                                 shiftKey: false,
29537                                 ctrlKey: false,
29538                                 altKey: false,
29539                                 metaKey: false
29540                             }
29541                         }
29542                     };
29543
29544                     if (_keybindings[id]) {
29545                         console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
29546                     }
29547
29548                     _keybindings[id] = binding;
29549
29550                     var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
29551                     for (var j = 0; j < matches.length; j++) {
29552                         // Normalise matching errors
29553                         if (matches[j] === '++') matches[j] = '+';
29554
29555                         if (matches[j] in utilKeybinding.modifierCodes) {
29556                             var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
29557                             binding.event.modifiers[prop] = true;
29558                         } else {
29559                             binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
29560                             if (matches[j] in utilKeybinding.keyCodes) {
29561                                 binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
29562                             }
29563                         }
29564                     }
29565                 }
29566
29567                 return keybinding;
29568             };
29569
29570
29571             return keybinding;
29572         }
29573
29574
29575         /*
29576          * See https://github.com/keithamus/jwerty
29577          */
29578
29579         utilKeybinding.modifierCodes = {
29580             // Shift key, ⇧
29581             '⇧': 16, shift: 16,
29582             // CTRL key, on Mac: ⌃
29583             '⌃': 17, ctrl: 17,
29584             // ALT key, on Mac: ⌥ (Alt)
29585             '⌥': 18, alt: 18, option: 18,
29586             // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
29587             '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
29588         };
29589
29590         utilKeybinding.modifierProperties = {
29591             16: 'shiftKey',
29592             17: 'ctrlKey',
29593             18: 'altKey',
29594             91: 'metaKey'
29595         };
29596
29597         utilKeybinding.keys = {
29598             // Backspace key, on Mac: ⌫ (Backspace)
29599             '⌫': 'Backspace', backspace: 'Backspace',
29600             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29601             '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
29602             // Return key, ↩
29603             '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
29604             // Pause/Break key
29605             'pause': 'Pause', 'pause-break': 'Pause',
29606             // Caps Lock key, ⇪
29607             '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
29608             // Escape key, on Mac: ⎋, on Windows: Esc
29609             '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
29610             // Space key
29611             space: [' ', 'Spacebar'],
29612             // Page-Up key, or pgup, on Mac: ↖
29613             '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
29614             // Page-Down key, or pgdown, on Mac: ↘
29615             '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
29616             // END key, on Mac: ⇟
29617             '⇟': 'End', end: 'End',
29618             // HOME key, on Mac: ⇞
29619             '⇞': 'Home', home: 'Home',
29620             // Insert key, or ins
29621             ins: 'Insert', insert: 'Insert',
29622             // Delete key, on Mac: ⌦ (Delete)
29623             '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
29624             // Left Arrow Key, or ←
29625             '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
29626             // Up Arrow Key, or ↑
29627             '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
29628             // Right Arrow Key, or →
29629             '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
29630             // Up Arrow Key, or ↓
29631             '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
29632             // odities, stuff for backward compatibility (browsers and code):
29633             // Num-Multiply, or *
29634             '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
29635             // Num-Plus or +
29636             '+': ['+', 'Add'], 'plus': ['+', 'Add'],
29637             // Num-Subtract, or -
29638             '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
29639             // Semicolon
29640             semicolon: ';',
29641             // = or equals
29642             equals: '=',
29643             // Comma, or ,
29644             comma: ',',
29645             // Period, or ., or full-stop
29646             period: '.', 'full-stop': '.',
29647             // Slash, or /, or forward-slash
29648             slash: '/', 'forward-slash': '/',
29649             // Tick, or `, or back-quote
29650             tick: '`', 'back-quote': '`',
29651             // Open bracket, or [
29652             'open-bracket': '[',
29653             // Back slash, or \
29654             'back-slash': '\\',
29655             // Close backet, or ]
29656             'close-bracket': ']',
29657             // Apostrophe, or Quote, or '
29658             quote: '\'', apostrophe: '\'',
29659             // NUMPAD 0-9
29660             'num-0': '0',
29661             'num-1': '1',
29662             'num-2': '2',
29663             'num-3': '3',
29664             'num-4': '4',
29665             'num-5': '5',
29666             'num-6': '6',
29667             'num-7': '7',
29668             'num-8': '8',
29669             'num-9': '9',
29670             // F1-F25
29671             f1: 'F1',
29672             f2: 'F2',
29673             f3: 'F3',
29674             f4: 'F4',
29675             f5: 'F5',
29676             f6: 'F6',
29677             f7: 'F7',
29678             f8: 'F8',
29679             f9: 'F9',
29680             f10: 'F10',
29681             f11: 'F11',
29682             f12: 'F12',
29683             f13: 'F13',
29684             f14: 'F14',
29685             f15: 'F15',
29686             f16: 'F16',
29687             f17: 'F17',
29688             f18: 'F18',
29689             f19: 'F19',
29690             f20: 'F20',
29691             f21: 'F21',
29692             f22: 'F22',
29693             f23: 'F23',
29694             f24: 'F24',
29695             f25: 'F25'
29696         };
29697
29698         utilKeybinding.keyCodes = {
29699             // Backspace key, on Mac: ⌫ (Backspace)
29700             '⌫': 8, backspace: 8,
29701             // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
29702             '⇥': 9, '⇆': 9, tab: 9,
29703             // Return key, ↩
29704             '↩': 13, 'return': 13, enter: 13, '⌅': 13,
29705             // Pause/Break key
29706             'pause': 19, 'pause-break': 19,
29707             // Caps Lock key, ⇪
29708             '⇪': 20, caps: 20, 'caps-lock': 20,
29709             // Escape key, on Mac: ⎋, on Windows: Esc
29710             '⎋': 27, escape: 27, esc: 27,
29711             // Space key
29712             space: 32,
29713             // Page-Up key, or pgup, on Mac: ↖
29714             '↖': 33, pgup: 33, 'page-up': 33,
29715             // Page-Down key, or pgdown, on Mac: ↘
29716             '↘': 34, pgdown: 34, 'page-down': 34,
29717             // END key, on Mac: ⇟
29718             '⇟': 35, end: 35,
29719             // HOME key, on Mac: ⇞
29720             '⇞': 36, home: 36,
29721             // Insert key, or ins
29722             ins: 45, insert: 45,
29723             // Delete key, on Mac: ⌦ (Delete)
29724             '⌦': 46, del: 46, 'delete': 46,
29725             // Left Arrow Key, or ←
29726             '←': 37, left: 37, 'arrow-left': 37,
29727             // Up Arrow Key, or ↑
29728             '↑': 38, up: 38, 'arrow-up': 38,
29729             // Right Arrow Key, or →
29730             '→': 39, right: 39, 'arrow-right': 39,
29731             // Up Arrow Key, or ↓
29732             '↓': 40, down: 40, 'arrow-down': 40,
29733             // odities, printing characters that come out wrong:
29734             // Firefox Equals
29735             'ffequals': 61,
29736             // Num-Multiply, or *
29737             '*': 106, star: 106, asterisk: 106, multiply: 106,
29738             // Num-Plus or +
29739             '+': 107, 'plus': 107,
29740             // Num-Subtract, or -
29741             '-': 109, subtract: 109,
29742             // Firefox Plus
29743             'ffplus': 171,
29744             // Firefox Minus
29745             'ffminus': 173,
29746             // Semicolon
29747             ';': 186, semicolon: 186,
29748             // = or equals
29749             '=': 187, 'equals': 187,
29750             // Comma, or ,
29751             ',': 188, comma: 188,
29752             // Dash / Underscore key
29753             'dash': 189,
29754             // Period, or ., or full-stop
29755             '.': 190, period: 190, 'full-stop': 190,
29756             // Slash, or /, or forward-slash
29757             '/': 191, slash: 191, 'forward-slash': 191,
29758             // Tick, or `, or back-quote
29759             '`': 192, tick: 192, 'back-quote': 192,
29760             // Open bracket, or [
29761             '[': 219, 'open-bracket': 219,
29762             // Back slash, or \
29763             '\\': 220, 'back-slash': 220,
29764             // Close backet, or ]
29765             ']': 221, 'close-bracket': 221,
29766             // Apostrophe, or Quote, or '
29767             '\'': 222, quote: 222, apostrophe: 222
29768         };
29769
29770         // NUMPAD 0-9
29771         var i$2 = 95, n = 0;
29772         while (++i$2 < 106) {
29773             utilKeybinding.keyCodes['num-' + n] = i$2;
29774             ++n;
29775         }
29776
29777         // 0-9
29778         i$2 = 47; n = 0;
29779         while (++i$2 < 58) {
29780             utilKeybinding.keyCodes[n] = i$2;
29781             ++n;
29782         }
29783
29784         // F1-F25
29785         i$2 = 111; n = 1;
29786         while (++i$2 < 136) {
29787             utilKeybinding.keyCodes['f' + n] = i$2;
29788             ++n;
29789         }
29790
29791         // a-z
29792         i$2 = 64;
29793         while (++i$2 < 91) {
29794             utilKeybinding.keyCodes[String.fromCharCode(i$2).toLowerCase()] = i$2;
29795         }
29796
29797         function utilObjectOmit(obj, omitKeys) {
29798             return Object.keys(obj).reduce(function(result, key) {
29799                 if (omitKeys.indexOf(key) === -1) {
29800                     result[key] = obj[key];  // keep
29801                 }
29802                 return result;
29803             }, {});
29804         }
29805
29806         // Copies a variable number of methods from source to target.
29807         function utilRebind(target, source) {
29808             var i = 1, n = arguments.length, method;
29809             while (++i < n) {
29810                 target[method = arguments[i]] = d3_rebind(target, source, source[method]);
29811             }
29812             return target;
29813         }
29814
29815         // Method is assumed to be a standard D3 getter-setter:
29816         // If passed with no arguments, gets the value.
29817         // If passed with arguments, sets the value and returns the target.
29818         function d3_rebind(target, source, method) {
29819             return function() {
29820                 var value = method.apply(source, arguments);
29821                 return value === source ? target : value;
29822             };
29823         }
29824
29825         // A per-domain session mutex backed by a cookie and dead man's
29826         // switch. If the session crashes, the mutex will auto-release
29827         // after 5 seconds.
29828
29829         // This accepts a string and returns an object that complies with utilSessionMutexType
29830         function utilSessionMutex(name) {
29831             var mutex = {};
29832             var intervalID;
29833
29834             function renew() {
29835                 var expires = new Date();
29836                 expires.setSeconds(expires.getSeconds() + 5);
29837                 document.cookie = name + '=1; expires=' + expires.toUTCString();
29838             }
29839
29840             mutex.lock = function () {
29841                 if (intervalID) return true;
29842                 var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
29843                 if (cookie) return false;
29844                 renew();
29845                 intervalID = window.setInterval(renew, 4000);
29846                 return true;
29847             };
29848
29849             mutex.unlock = function () {
29850                 if (!intervalID) return;
29851                 document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
29852                 clearInterval(intervalID);
29853                 intervalID = null;
29854             };
29855
29856             mutex.locked = function () {
29857                 return !!intervalID;
29858             };
29859
29860             return mutex;
29861         }
29862
29863         function utilTiler() {
29864             var _size = [256, 256];
29865             var _scale = 256;
29866             var _tileSize = 256;
29867             var _zoomExtent = [0, 20];
29868             var _translate = [_size[0] / 2, _size[1] / 2];
29869             var _margin = 0;
29870             var _skipNullIsland = false;
29871
29872
29873             function clamp(num, min, max) {
29874                 return Math.max(min, Math.min(num, max));
29875             }
29876
29877
29878             function nearNullIsland(tile) {
29879                 var x = tile[0];
29880                 var y = tile[1];
29881                 var z = tile[2];
29882                 if (z >= 7) {
29883                     var center = Math.pow(2, z - 1);
29884                     var width = Math.pow(2, z - 6);
29885                     var min = center - (width / 2);
29886                     var max = center + (width / 2) - 1;
29887                     return x >= min && x <= max && y >= min && y <= max;
29888                 }
29889                 return false;
29890             }
29891
29892
29893             function tiler() {
29894                 var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
29895                 var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
29896                 var tileMin = 0;
29897                 var tileMax = Math.pow(2, z0) - 1;
29898                 var log2ts = Math.log(_tileSize) * Math.LOG2E;
29899                 var k = Math.pow(2, z - z0 + log2ts);
29900                 var origin = [
29901                     (_translate[0] - _scale / 2) / k,
29902                     (_translate[1] - _scale / 2) / k
29903                 ];
29904
29905                 var cols = d3_range(
29906                     clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
29907                     clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
29908                 );
29909                 var rows = d3_range(
29910                     clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
29911                     clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
29912                 );
29913
29914                 var tiles = [];
29915                 for (var i = 0; i < rows.length; i++) {
29916                     var y = rows[i];
29917                     for (var j = 0; j < cols.length; j++) {
29918                         var x = cols[j];
29919
29920                         if (i >= _margin && i <= rows.length - _margin &&
29921                             j >= _margin && j <= cols.length - _margin) {
29922                             tiles.unshift([x, y, z0]);  // tiles in view at beginning
29923                         } else {
29924                             tiles.push([x, y, z0]);     // tiles in margin at the end
29925                         }
29926                     }
29927                 }
29928
29929                 tiles.translate = origin;
29930                 tiles.scale = k;
29931
29932                 return tiles;
29933             }
29934
29935
29936             /**
29937              * getTiles() returns an array of tiles that cover the map view
29938              */
29939             tiler.getTiles = function(projection) {
29940                 var origin = [
29941                     projection.scale() * Math.PI - projection.translate()[0],
29942                     projection.scale() * Math.PI - projection.translate()[1]
29943                 ];
29944
29945                 this
29946                     .size(projection.clipExtent()[1])
29947                     .scale(projection.scale() * 2 * Math.PI)
29948                     .translate(projection.translate());
29949
29950                 var tiles = tiler();
29951                 var ts = tiles.scale;
29952
29953                 return tiles
29954                     .map(function(tile) {
29955                         if (_skipNullIsland && nearNullIsland(tile)) {
29956                             return false;
29957                         }
29958                         var x = tile[0] * ts - origin[0];
29959                         var y = tile[1] * ts - origin[1];
29960                         return {
29961                             id: tile.toString(),
29962                             xyz: tile,
29963                             extent: geoExtent(
29964                                 projection.invert([x, y + ts]),
29965                                 projection.invert([x + ts, y])
29966                             )
29967                         };
29968                     }).filter(Boolean);
29969             };
29970
29971
29972             /**
29973              * getGeoJSON() returns a FeatureCollection for debugging tiles
29974              */
29975             tiler.getGeoJSON = function(projection) {
29976                 var features = tiler.getTiles(projection).map(function(tile) {
29977                     return {
29978                         type: 'Feature',
29979                         properties: {
29980                             id: tile.id,
29981                             name: tile.id
29982                         },
29983                         geometry: {
29984                             type: 'Polygon',
29985                             coordinates: [ tile.extent.polygon() ]
29986                         }
29987                     };
29988                 });
29989
29990                 return {
29991                     type: 'FeatureCollection',
29992                     features: features
29993                 };
29994             };
29995
29996
29997             tiler.tileSize = function(val) {
29998                 if (!arguments.length) return _tileSize;
29999                 _tileSize = val;
30000                 return tiler;
30001             };
30002
30003
30004             tiler.zoomExtent = function(val) {
30005                 if (!arguments.length) return _zoomExtent;
30006                 _zoomExtent = val;
30007                 return tiler;
30008             };
30009
30010
30011             tiler.size = function(val) {
30012                 if (!arguments.length) return _size;
30013                 _size = val;
30014                 return tiler;
30015             };
30016
30017
30018             tiler.scale = function(val) {
30019                 if (!arguments.length) return _scale;
30020                 _scale = val;
30021                 return tiler;
30022             };
30023
30024
30025             tiler.translate = function(val) {
30026                 if (!arguments.length) return _translate;
30027                 _translate = val;
30028                 return tiler;
30029             };
30030
30031
30032             // number to extend the rows/columns beyond those covering the viewport
30033             tiler.margin = function(val) {
30034                 if (!arguments.length) return _margin;
30035                 _margin = +val;
30036                 return tiler;
30037             };
30038
30039
30040             tiler.skipNullIsland = function(val) {
30041                 if (!arguments.length) return _skipNullIsland;
30042                 _skipNullIsland = val;
30043                 return tiler;
30044             };
30045
30046
30047             return tiler;
30048         }
30049
30050         function utilTriggerEvent(target, type) {
30051             target.each(function() {
30052                 var evt = document.createEvent('HTMLEvents');
30053                 evt.initEvent(type, true, true);
30054                 this.dispatchEvent(evt);
30055             });
30056         }
30057
30058         function osmEntity(attrs) {
30059             // For prototypal inheritance.
30060             if (this instanceof osmEntity) return;
30061
30062             // Create the appropriate subtype.
30063             if (attrs && attrs.type) {
30064                 return osmEntity[attrs.type].apply(this, arguments);
30065             } else if (attrs && attrs.id) {
30066                 return osmEntity[osmEntity.id.type(attrs.id)].apply(this, arguments);
30067             }
30068
30069             // Initialize a generic Entity (used only in tests).
30070             return (new osmEntity()).initialize(arguments);
30071         }
30072
30073
30074         osmEntity.id = function(type) {
30075             return osmEntity.id.fromOSM(type, osmEntity.id.next[type]--);
30076         };
30077
30078
30079         osmEntity.id.next = {
30080             changeset: -1, node: -1, way: -1, relation: -1
30081         };
30082
30083
30084         osmEntity.id.fromOSM = function(type, id) {
30085             return type[0] + id;
30086         };
30087
30088
30089         osmEntity.id.toOSM = function(id) {
30090             return id.slice(1);
30091         };
30092
30093
30094         osmEntity.id.type = function(id) {
30095             return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
30096         };
30097
30098
30099         // A function suitable for use as the second argument to d3.selection#data().
30100         osmEntity.key = function(entity) {
30101             return entity.id + 'v' + (entity.v || 0);
30102         };
30103
30104         var _deprecatedTagValuesByKey;
30105
30106         osmEntity.deprecatedTagValuesByKey = function() {
30107             if (!_deprecatedTagValuesByKey) {
30108                 _deprecatedTagValuesByKey = {};
30109                 dataDeprecated.forEach(function(d) {
30110                     var oldKeys = Object.keys(d.old);
30111                     if (oldKeys.length === 1) {
30112                         var oldKey = oldKeys[0];
30113                         var oldValue = d.old[oldKey];
30114                         if (oldValue !== '*') {
30115                             if (!_deprecatedTagValuesByKey[oldKey]) {
30116                                 _deprecatedTagValuesByKey[oldKey] = [oldValue];
30117                             } else {
30118                                 _deprecatedTagValuesByKey[oldKey].push(oldValue);
30119                             }
30120                         }
30121                     }
30122                 });
30123             }
30124             return _deprecatedTagValuesByKey;
30125         };
30126
30127
30128         osmEntity.prototype = {
30129
30130             tags: {},
30131
30132
30133             initialize: function(sources) {
30134                 for (var i = 0; i < sources.length; ++i) {
30135                     var source = sources[i];
30136                     for (var prop in source) {
30137                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
30138                             if (source[prop] === undefined) {
30139                                 delete this[prop];
30140                             } else {
30141                                 this[prop] = source[prop];
30142                             }
30143                         }
30144                     }
30145                 }
30146
30147                 if (!this.id && this.type) {
30148                     this.id = osmEntity.id(this.type);
30149                 }
30150                 if (!this.hasOwnProperty('visible')) {
30151                     this.visible = true;
30152                 }
30153
30154                 return this;
30155             },
30156
30157
30158             copy: function(resolver, copies) {
30159                 if (copies[this.id])
30160                     return copies[this.id];
30161
30162                 var copy = osmEntity(this, { id: undefined, user: undefined, version: undefined });
30163                 copies[this.id] = copy;
30164
30165                 return copy;
30166             },
30167
30168
30169             osmId: function() {
30170                 return osmEntity.id.toOSM(this.id);
30171             },
30172
30173
30174             isNew: function() {
30175                 return this.osmId() < 0;
30176             },
30177
30178
30179             update: function(attrs) {
30180                 return osmEntity(this, attrs, { v: 1 + (this.v || 0) });
30181             },
30182
30183
30184             mergeTags: function(tags) {
30185                 var merged = Object.assign({}, this.tags);   // shallow copy
30186                 var changed = false;
30187                 for (var k in tags) {
30188                     var t1 = merged[k];
30189                     var t2 = tags[k];
30190                     if (!t1) {
30191                         changed = true;
30192                         merged[k] = t2;
30193                     } else if (t1 !== t2) {
30194                         changed = true;
30195                         merged[k] = utilArrayUnion(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
30196                     }
30197                 }
30198                 return changed ? this.update({ tags: merged }) : this;
30199             },
30200
30201
30202             intersects: function(extent, resolver) {
30203                 return this.extent(resolver).intersects(extent);
30204             },
30205
30206
30207             hasNonGeometryTags: function() {
30208                 return Object.keys(this.tags).some(function(k) { return k !== 'area'; });
30209             },
30210
30211             hasParentRelations: function(resolver) {
30212                 return resolver.parentRelations(this).length > 0;
30213             },
30214
30215             hasInterestingTags: function() {
30216                 return Object.keys(this.tags).some(osmIsInterestingTag);
30217             },
30218
30219             hasWikidata: function() {
30220                 return !!this.tags.wikidata || !!this.tags['brand:wikidata'];
30221             },
30222
30223             isHighwayIntersection: function() {
30224                 return false;
30225             },
30226
30227             isDegenerate: function() {
30228                 return true;
30229             },
30230
30231             deprecatedTags: function() {
30232                 var tags = this.tags;
30233
30234                 // if there are no tags, none can be deprecated
30235                 if (Object.keys(tags).length === 0) return [];
30236
30237                 var deprecated = [];
30238                 dataDeprecated.forEach(function(d) {
30239                     var matchesDeprecatedTags = Object.keys(d.old).every(function(key) {
30240                         if (!tags[key]) return false;
30241                         if (d.old[key] === '*') return true;
30242
30243                         var vals = tags[key].split(';').filter(Boolean);
30244                         if (vals.length === 0) {
30245                             return false;
30246                         } else if (vals.length > 1) {
30247                             return vals.indexOf(d.old[key]) !== -1;
30248                         } else {
30249                             if (tags[key] === d.old[key]) {
30250                                 if (d.old[key] === d.replace[key]) {
30251                                     return !Object.keys(d.replace).every(function(key) {
30252                                         return tags[key] === d.replace[key];
30253                                     });
30254                                 } else {
30255                                     return true;
30256                                 }
30257                             }
30258                         }
30259                         return false;
30260                     });
30261                     if (matchesDeprecatedTags) {
30262                         deprecated.push(d);
30263                     }
30264                 });
30265
30266                 return deprecated;
30267             }
30268         };
30269
30270         function osmLanes(entity) {
30271             if (entity.type !== 'way') return null;
30272             if (!entity.tags.highway) return null;
30273
30274             var tags = entity.tags;
30275             var isOneWay = entity.isOneWay();
30276             var laneCount = getLaneCount(tags, isOneWay);
30277             var maxspeed = parseMaxspeed(tags);
30278
30279             var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
30280             var forward = laneDirections.forward;
30281             var backward = laneDirections.backward;
30282             var bothways = laneDirections.bothways;
30283
30284             // parse the piped string 'x|y|z' format
30285             var turnLanes = {};
30286             turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
30287             turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
30288             turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
30289
30290             var maxspeedLanes = {};
30291             maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
30292             maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
30293             maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
30294
30295             var psvLanes = {};
30296             psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
30297             psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
30298             psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
30299
30300             var busLanes = {};
30301             busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
30302             busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
30303             busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
30304
30305             var taxiLanes = {};
30306             taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
30307             taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
30308             taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
30309
30310             var hovLanes = {};
30311             hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
30312             hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
30313             hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
30314
30315             var hgvLanes = {};
30316             hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
30317             hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
30318             hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
30319
30320             var bicyclewayLanes = {};
30321             bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
30322             bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
30323             bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
30324
30325             var lanesObj = {
30326                 forward: [],
30327                 backward: [],
30328                 unspecified: []
30329             };
30330
30331             // map forward/backward/unspecified of each lane type to lanesObj
30332             mapToLanesObj(lanesObj, turnLanes, 'turnLane');
30333             mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
30334             mapToLanesObj(lanesObj, psvLanes, 'psv');
30335             mapToLanesObj(lanesObj, busLanes, 'bus');
30336             mapToLanesObj(lanesObj, taxiLanes, 'taxi');
30337             mapToLanesObj(lanesObj, hovLanes, 'hov');
30338             mapToLanesObj(lanesObj, hgvLanes, 'hgv');
30339             mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
30340
30341             return {
30342                 metadata: {
30343                     count: laneCount,
30344                     oneway: isOneWay,
30345                     forward: forward,
30346                     backward: backward,
30347                     bothways: bothways,
30348                     turnLanes: turnLanes,
30349                     maxspeed: maxspeed,
30350                     maxspeedLanes: maxspeedLanes,
30351                     psvLanes: psvLanes,
30352                     busLanes: busLanes,
30353                     taxiLanes: taxiLanes,
30354                     hovLanes: hovLanes,
30355                     hgvLanes: hgvLanes,
30356                     bicyclewayLanes: bicyclewayLanes
30357                 },
30358                 lanes: lanesObj
30359             };
30360         }
30361
30362
30363         function getLaneCount(tags, isOneWay) {
30364             var count;
30365             if (tags.lanes) {
30366                 count = parseInt(tags.lanes, 10);
30367                 if (count > 0) {
30368                     return count;
30369                 }
30370             }
30371
30372
30373             switch (tags.highway) {
30374                 case 'trunk':
30375                 case 'motorway':
30376                     count = isOneWay ? 2 : 4;
30377                     break;
30378                 default:
30379                     count = isOneWay ? 1 : 2;
30380                     break;
30381             }
30382
30383             return count;
30384         }
30385
30386
30387         function parseMaxspeed(tags) {
30388             var maxspeed = tags.maxspeed;
30389             if (!maxspeed) return;
30390
30391             var maxspeedRegex = /^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/;
30392             if (!maxspeedRegex.test(maxspeed)) return;
30393
30394             return parseInt(maxspeed, 10);
30395         }
30396
30397
30398         function parseLaneDirections(tags, isOneWay, laneCount) {
30399             var forward = parseInt(tags['lanes:forward'], 10);
30400             var backward = parseInt(tags['lanes:backward'], 10);
30401             var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
30402
30403             if (parseInt(tags.oneway, 10) === -1) {
30404                 forward = 0;
30405                 bothways = 0;
30406                 backward = laneCount;
30407             }
30408             else if (isOneWay) {
30409                 forward = laneCount;
30410                 bothways = 0;
30411                 backward = 0;
30412             }
30413             else if (isNaN(forward) && isNaN(backward)) {
30414                 backward = Math.floor((laneCount - bothways) / 2);
30415                 forward = laneCount - bothways - backward;
30416             }
30417             else if (isNaN(forward)) {
30418                 if (backward > laneCount - bothways) {
30419                     backward = laneCount - bothways;
30420                 }
30421                 forward = laneCount - bothways - backward;
30422             }
30423             else if (isNaN(backward)) {
30424                 if (forward > laneCount - bothways) {
30425                     forward = laneCount - bothways;
30426                 }
30427                 backward = laneCount - bothways - forward;
30428             }
30429             return {
30430                 forward: forward,
30431                 backward: backward,
30432                 bothways: bothways
30433             };
30434         }
30435
30436
30437         function parseTurnLanes(tag){
30438             if (!tag) return;
30439
30440             var validValues = [
30441                 'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
30442                 'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
30443             ];
30444
30445             return tag.split('|')
30446                 .map(function (s) {
30447                     if (s === '') s = 'none';
30448                     return s.split(';')
30449                         .map(function (d) {
30450                             return validValues.indexOf(d) === -1 ? 'unknown': d;
30451                         });
30452                 });
30453         }
30454
30455
30456         function parseMaxspeedLanes(tag, maxspeed) {
30457             if (!tag) return;
30458
30459             return tag.split('|')
30460                 .map(function (s) {
30461                     if (s === 'none') return s;
30462                     var m = parseInt(s, 10);
30463                     if (s === '' || m === maxspeed) return null;
30464                     return isNaN(m) ? 'unknown': m;
30465                 });
30466         }
30467
30468
30469         function parseMiscLanes(tag) {
30470             if (!tag) return;
30471
30472             var validValues = [
30473                 'yes', 'no', 'designated'
30474             ];
30475
30476             return tag.split('|')
30477                 .map(function (s) {
30478                     if (s === '') s = 'no';
30479                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30480                 });
30481         }
30482
30483
30484         function parseBicycleWay(tag) {
30485             if (!tag) return;
30486
30487             var validValues = [
30488                 'yes', 'no', 'designated', 'lane'
30489             ];
30490
30491             return tag.split('|')
30492                 .map(function (s) {
30493                     if (s === '') s = 'no';
30494                     return validValues.indexOf(s) === -1 ? 'unknown': s;
30495                 });
30496         }
30497
30498
30499         function mapToLanesObj(lanesObj, data, key) {
30500             if (data.forward) data.forward.forEach(function(l, i) {
30501                 if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
30502                 lanesObj.forward[i][key] = l;
30503             });
30504             if (data.backward) data.backward.forEach(function(l, i) {
30505                 if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
30506                 lanesObj.backward[i][key] = l;
30507             });
30508             if (data.unspecified) data.unspecified.forEach(function(l, i) {
30509                 if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
30510                 lanesObj.unspecified[i][key] = l;
30511             });
30512         }
30513
30514         function osmWay() {
30515             if (!(this instanceof osmWay)) {
30516                 return (new osmWay()).initialize(arguments);
30517             } else if (arguments.length) {
30518                 this.initialize(arguments);
30519             }
30520         }
30521
30522
30523         osmEntity.way = osmWay;
30524
30525         osmWay.prototype = Object.create(osmEntity.prototype);
30526
30527
30528         Object.assign(osmWay.prototype, {
30529             type: 'way',
30530             nodes: [],
30531
30532
30533             copy: function(resolver, copies) {
30534                 if (copies[this.id]) return copies[this.id];
30535
30536                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
30537
30538                 var nodes = this.nodes.map(function(id) {
30539                     return resolver.entity(id).copy(resolver, copies).id;
30540                 });
30541
30542                 copy = copy.update({ nodes: nodes });
30543                 copies[this.id] = copy;
30544
30545                 return copy;
30546             },
30547
30548
30549             extent: function(resolver) {
30550                 return resolver.transient(this, 'extent', function() {
30551                     var extent = geoExtent();
30552                     for (var i = 0; i < this.nodes.length; i++) {
30553                         var node = resolver.hasEntity(this.nodes[i]);
30554                         if (node) {
30555                             extent._extend(node.extent());
30556                         }
30557                     }
30558                     return extent;
30559                 });
30560             },
30561
30562
30563             first: function() {
30564                 return this.nodes[0];
30565             },
30566
30567
30568             last: function() {
30569                 return this.nodes[this.nodes.length - 1];
30570             },
30571
30572
30573             contains: function(node) {
30574                 return this.nodes.indexOf(node) >= 0;
30575             },
30576
30577
30578             affix: function(node) {
30579                 if (this.nodes[0] === node) return 'prefix';
30580                 if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
30581             },
30582
30583
30584             layer: function() {
30585                 // explicit layer tag, clamp between -10, 10..
30586                 if (isFinite(this.tags.layer)) {
30587                     return Math.max(-10, Math.min(+(this.tags.layer), 10));
30588                 }
30589
30590                 // implied layer tag..
30591                 if (this.tags.covered === 'yes') return -1;
30592                 if (this.tags.location === 'overground') return 1;
30593                 if (this.tags.location === 'underground') return -1;
30594                 if (this.tags.location === 'underwater') return -10;
30595
30596                 if (this.tags.power === 'line') return 10;
30597                 if (this.tags.power === 'minor_line') return 10;
30598                 if (this.tags.aerialway) return 10;
30599                 if (this.tags.bridge) return 1;
30600                 if (this.tags.cutting) return -1;
30601                 if (this.tags.tunnel) return -1;
30602                 if (this.tags.waterway) return -1;
30603                 if (this.tags.man_made === 'pipeline') return -10;
30604                 if (this.tags.boundary) return -10;
30605                 return 0;
30606             },
30607
30608
30609             isOneWay: function() {
30610                 // explicit oneway tag..
30611                 var values = {
30612                     'yes': true,
30613                     '1': true,
30614                     '-1': true,
30615                     'reversible': true,
30616                     'alternating': true,
30617                     'no': false,
30618                     '0': false
30619                 };
30620                 if (values[this.tags.oneway] !== undefined) {
30621                     return values[this.tags.oneway];
30622                 }
30623
30624                 // implied oneway tag..
30625                 for (var key in this.tags) {
30626                     if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
30627                         return true;
30628                 }
30629                 return false;
30630             },
30631
30632             // Some identifier for tag that implies that this way is "sided",
30633             // i.e. the right side is the 'inside' (e.g. the right side of a
30634             // natural=cliff is lower).
30635             sidednessIdentifier: function() {
30636                 for (var key in this.tags) {
30637                     var value = this.tags[key];
30638                     if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
30639                         if (osmRightSideIsInsideTags[key][value] === true) {
30640                             return key;
30641                         } else {
30642                             // if the map's value is something other than a
30643                             // literal true, we should use it so we can
30644                             // special case some keys (e.g. natural=coastline
30645                             // is handled differently to other naturals).
30646                             return osmRightSideIsInsideTags[key][value];
30647                         }
30648                     }
30649                 }
30650
30651                 return null;
30652             },
30653
30654             isSided: function() {
30655                 if (this.tags.two_sided === 'yes') {
30656                     return false;
30657                 }
30658
30659                 return this.sidednessIdentifier() !== null;
30660             },
30661
30662             lanes: function() {
30663                 return osmLanes(this);
30664             },
30665
30666
30667             isClosed: function() {
30668                 return this.nodes.length > 1 && this.first() === this.last();
30669             },
30670
30671
30672             isConvex: function(resolver) {
30673                 if (!this.isClosed() || this.isDegenerate()) return null;
30674
30675                 var nodes = utilArrayUniq(resolver.childNodes(this));
30676                 var coords = nodes.map(function(n) { return n.loc; });
30677                 var curr = 0;
30678                 var prev = 0;
30679
30680                 for (var i = 0; i < coords.length; i++) {
30681                     var o = coords[(i+1) % coords.length];
30682                     var a = coords[i];
30683                     var b = coords[(i+2) % coords.length];
30684                     var res = geoVecCross(a, b, o);
30685
30686                     curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
30687                     if (curr === 0) {
30688                         continue;
30689                     } else if (prev && curr !== prev) {
30690                         return false;
30691                     }
30692                     prev = curr;
30693                 }
30694                 return true;
30695             },
30696
30697             // returns an object with the tag that implies this is an area, if any
30698             tagSuggestingArea: function() {
30699                 if (this.tags.area === 'yes') return { area: 'yes' };
30700                 if (this.tags.area === 'no') return null;
30701
30702                 // `highway` and `railway` are typically linear features, but there
30703                 // are a few exceptions that should be treated as areas, even in the
30704                 // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
30705                 var lineKeys = {
30706                     highway: {
30707                         rest_area: true,
30708                         services: true
30709                     },
30710                     railway: {
30711                         roundhouse: true,
30712                         station: true,
30713                         traverser: true,
30714                         turntable: true,
30715                         wash: true
30716                     }
30717                 };
30718                 var returnTags = {};
30719                 for (var key in this.tags) {
30720                     if (key in osmAreaKeys && !(this.tags[key] in osmAreaKeys[key])) {
30721                         returnTags[key] = this.tags[key];
30722                         return returnTags;
30723                     }
30724                     if (key in lineKeys && this.tags[key] in lineKeys[key]) {
30725                         returnTags[key] = this.tags[key];
30726                         return returnTags;
30727                     }
30728                 }
30729                 return null;
30730             },
30731
30732             isArea: function() {
30733                 if (this.tags.area === 'yes')
30734                     return true;
30735                 if (!this.isClosed() || this.tags.area === 'no')
30736                     return false;
30737                 return this.tagSuggestingArea() !== null;
30738             },
30739
30740
30741             isDegenerate: function() {
30742                 return (new Set(this.nodes).size < (this.isArea() ? 3 : 2));
30743             },
30744
30745
30746             areAdjacent: function(n1, n2) {
30747                 for (var i = 0; i < this.nodes.length; i++) {
30748                     if (this.nodes[i] === n1) {
30749                         if (this.nodes[i - 1] === n2) return true;
30750                         if (this.nodes[i + 1] === n2) return true;
30751                     }
30752                 }
30753                 return false;
30754             },
30755
30756
30757             geometry: function(graph) {
30758                 return graph.transient(this, 'geometry', function() {
30759                     return this.isArea() ? 'area' : 'line';
30760                 });
30761             },
30762
30763
30764             // If this way is not closed, append the beginning node to the end of the nodelist to close it.
30765             close: function() {
30766                 if (this.isClosed() || !this.nodes.length) return this;
30767
30768                 var nodes = this.nodes.slice();
30769                 nodes = nodes.filter(noRepeatNodes);
30770                 nodes.push(nodes[0]);
30771                 return this.update({ nodes: nodes });
30772             },
30773
30774
30775             // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
30776             unclose: function() {
30777                 if (!this.isClosed()) return this;
30778
30779                 var nodes = this.nodes.slice();
30780                 var connector = this.first();
30781                 var i = nodes.length - 1;
30782
30783                 // remove trailing connectors..
30784                 while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30785                     nodes.splice(i, 1);
30786                     i = nodes.length - 1;
30787                 }
30788
30789                 nodes = nodes.filter(noRepeatNodes);
30790                 return this.update({ nodes: nodes });
30791             },
30792
30793
30794             // Adds a node (id) in front of the node which is currently at position index.
30795             // If index is undefined, the node will be added to the end of the way for linear ways,
30796             //   or just before the final connecting node for circular ways.
30797             // Consecutive duplicates are eliminated including existing ones.
30798             // Circularity is always preserved when adding a node.
30799             addNode: function(id, index) {
30800                 var nodes = this.nodes.slice();
30801                 var isClosed = this.isClosed();
30802                 var max = isClosed ? nodes.length - 1 : nodes.length;
30803
30804                 if (index === undefined) {
30805                     index = max;
30806                 }
30807
30808                 if (index < 0 || index > max) {
30809                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30810                 }
30811
30812                 // If this is a closed way, remove all connector nodes except the first one
30813                 // (there may be duplicates) and adjust index if necessary..
30814                 if (isClosed) {
30815                     var connector = this.first();
30816
30817                     // leading connectors..
30818                     var i = 1;
30819                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30820                         nodes.splice(i, 1);
30821                         if (index > i) index--;
30822                     }
30823
30824                     // trailing connectors..
30825                     i = nodes.length - 1;
30826                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30827                         nodes.splice(i, 1);
30828                         if (index > i) index--;
30829                         i = nodes.length - 1;
30830                     }
30831                 }
30832
30833                 nodes.splice(index, 0, id);
30834                 nodes = nodes.filter(noRepeatNodes);
30835
30836                 // If the way was closed before, append a connector node to keep it closed..
30837                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30838                     nodes.push(nodes[0]);
30839                 }
30840
30841                 return this.update({ nodes: nodes });
30842             },
30843
30844
30845             // Replaces the node which is currently at position index with the given node (id).
30846             // Consecutive duplicates are eliminated including existing ones.
30847             // Circularity is preserved when updating a node.
30848             updateNode: function(id, index) {
30849                 var nodes = this.nodes.slice();
30850                 var isClosed = this.isClosed();
30851                 var max = nodes.length - 1;
30852
30853                 if (index === undefined || index < 0 || index > max) {
30854                     throw new RangeError('index ' + index + ' out of range 0..' + max);
30855                 }
30856
30857                 // If this is a closed way, remove all connector nodes except the first one
30858                 // (there may be duplicates) and adjust index if necessary..
30859                 if (isClosed) {
30860                     var connector = this.first();
30861
30862                     // leading connectors..
30863                     var i = 1;
30864                     while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
30865                         nodes.splice(i, 1);
30866                         if (index > i) index--;
30867                     }
30868
30869                     // trailing connectors..
30870                     i = nodes.length - 1;
30871                     while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
30872                         nodes.splice(i, 1);
30873                         if (index === i) index = 0;  // update leading connector instead
30874                         i = nodes.length - 1;
30875                     }
30876                 }
30877
30878                 nodes.splice(index, 1, id);
30879                 nodes = nodes.filter(noRepeatNodes);
30880
30881                 // If the way was closed before, append a connector node to keep it closed..
30882                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30883                     nodes.push(nodes[0]);
30884                 }
30885
30886                 return this.update({nodes: nodes});
30887             },
30888
30889
30890             // Replaces each occurrence of node id needle with replacement.
30891             // Consecutive duplicates are eliminated including existing ones.
30892             // Circularity is preserved.
30893             replaceNode: function(needleID, replacementID) {
30894                 var nodes = this.nodes.slice();
30895                 var isClosed = this.isClosed();
30896
30897                 for (var i = 0; i < nodes.length; i++) {
30898                     if (nodes[i] === needleID) {
30899                         nodes[i] = replacementID;
30900                     }
30901                 }
30902
30903                 nodes = nodes.filter(noRepeatNodes);
30904
30905                 // If the way was closed before, append a connector node to keep it closed..
30906                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30907                     nodes.push(nodes[0]);
30908                 }
30909
30910                 return this.update({nodes: nodes});
30911             },
30912
30913
30914             // Removes each occurrence of node id.
30915             // Consecutive duplicates are eliminated including existing ones.
30916             // Circularity is preserved.
30917             removeNode: function(id) {
30918                 var nodes = this.nodes.slice();
30919                 var isClosed = this.isClosed();
30920
30921                 nodes = nodes
30922                     .filter(function(node) { return node !== id; })
30923                     .filter(noRepeatNodes);
30924
30925                 // If the way was closed before, append a connector node to keep it closed..
30926                 if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
30927                     nodes.push(nodes[0]);
30928                 }
30929
30930                 return this.update({nodes: nodes});
30931             },
30932
30933
30934             asJXON: function(changeset_id) {
30935                 var r = {
30936                     way: {
30937                         '@id': this.osmId(),
30938                         '@version': this.version || 0,
30939                         nd: this.nodes.map(function(id) {
30940                             return { keyAttributes: { ref: osmEntity.id.toOSM(id) } };
30941                         }, this),
30942                         tag: Object.keys(this.tags).map(function(k) {
30943                             return { keyAttributes: { k: k, v: this.tags[k] } };
30944                         }, this)
30945                     }
30946                 };
30947                 if (changeset_id) {
30948                     r.way['@changeset'] = changeset_id;
30949                 }
30950                 return r;
30951             },
30952
30953
30954             asGeoJSON: function(resolver) {
30955                 return resolver.transient(this, 'GeoJSON', function() {
30956                     var coordinates = resolver.childNodes(this)
30957                         .map(function(n) { return n.loc; });
30958
30959                     if (this.isArea() && this.isClosed()) {
30960                         return {
30961                             type: 'Polygon',
30962                             coordinates: [coordinates]
30963                         };
30964                     } else {
30965                         return {
30966                             type: 'LineString',
30967                             coordinates: coordinates
30968                         };
30969                     }
30970                 });
30971             },
30972
30973
30974             area: function(resolver) {
30975                 return resolver.transient(this, 'area', function() {
30976                     var nodes = resolver.childNodes(this);
30977
30978                     var json = {
30979                         type: 'Polygon',
30980                         coordinates: [ nodes.map(function(n) { return n.loc; }) ]
30981                     };
30982
30983                     if (!this.isClosed() && nodes.length) {
30984                         json.coordinates[0].push(nodes[0].loc);
30985                     }
30986
30987                     var area = d3_geoArea(json);
30988
30989                     // Heuristic for detecting counterclockwise winding order. Assumes
30990                     // that OpenStreetMap polygons are not hemisphere-spanning.
30991                     if (area > 2 * Math.PI) {
30992                         json.coordinates[0] = json.coordinates[0].reverse();
30993                         area = d3_geoArea(json);
30994                     }
30995
30996                     return isNaN(area) ? 0 : area;
30997                 });
30998             }
30999         });
31000
31001
31002         // Filter function to eliminate consecutive duplicates.
31003         function noRepeatNodes(node, i, arr) {
31004             return i === 0 || node !== arr[i - 1];
31005         }
31006
31007         // "Old" multipolyons, previously known as "simple" multipolygons, are as follows:
31008         //
31009         // 1. Relation tagged with `type=multipolygon` and no interesting tags.
31010         // 2. One and only one member with the `outer` role. Must be a way with interesting tags.
31011         // 3. No members without a role.
31012         //
31013         // Old multipolygons are no longer recommended but are still rendered as areas by iD.
31014
31015         function osmOldMultipolygonOuterMemberOfRelation(entity, graph) {
31016             if (entity.type !== 'relation' ||
31017                 !entity.isMultipolygon()
31018                 || Object.keys(entity.tags).filter(osmIsInterestingTag).length > 1) {
31019                 return false;
31020             }
31021
31022             var outerMember;
31023             for (var memberIndex in entity.members) {
31024                 var member = entity.members[memberIndex];
31025                 if (!member.role || member.role === 'outer') {
31026                     if (outerMember) return false;
31027                     if (member.type !== 'way') return false;
31028                     if (!graph.hasEntity(member.id)) return false;
31029
31030                     outerMember = graph.entity(member.id);
31031
31032                     if (Object.keys(outerMember.tags).filter(osmIsInterestingTag).length === 0) {
31033                         return false;
31034                     }
31035                 }
31036             }
31037
31038             return outerMember;
31039         }
31040
31041         // For fixing up rendering of multipolygons with tags on the outer member.
31042         // https://github.com/openstreetmap/iD/issues/613
31043         function osmIsOldMultipolygonOuterMember(entity, graph) {
31044             if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
31045                 return false;
31046
31047             var parents = graph.parentRelations(entity);
31048             if (parents.length !== 1)
31049                 return false;
31050
31051             var parent = parents[0];
31052             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31053                 return false;
31054
31055             var members = parent.members, member;
31056             for (var i = 0; i < members.length; i++) {
31057                 member = members[i];
31058                 if (member.id === entity.id && member.role && member.role !== 'outer')
31059                     return false; // Not outer member
31060                 if (member.id !== entity.id && (!member.role || member.role === 'outer'))
31061                     return false; // Not a simple multipolygon
31062             }
31063
31064             return parent;
31065         }
31066
31067
31068         function osmOldMultipolygonOuterMember(entity, graph) {
31069             if (entity.type !== 'way')
31070                 return false;
31071
31072             var parents = graph.parentRelations(entity);
31073             if (parents.length !== 1)
31074                 return false;
31075
31076             var parent = parents[0];
31077             if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
31078                 return false;
31079
31080             var members = parent.members, member, outerMember;
31081             for (var i = 0; i < members.length; i++) {
31082                 member = members[i];
31083                 if (!member.role || member.role === 'outer') {
31084                     if (outerMember)
31085                         return false; // Not a simple multipolygon
31086                     outerMember = member;
31087                 }
31088             }
31089
31090             if (!outerMember)
31091                 return false;
31092
31093             var outerEntity = graph.hasEntity(outerMember.id);
31094             if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
31095                 return false;
31096
31097             return outerEntity;
31098         }
31099
31100
31101         // Join `toJoin` array into sequences of connecting ways.
31102
31103         // Segments which share identical start/end nodes will, as much as possible,
31104         // be connected with each other.
31105         //
31106         // The return value is a nested array. Each constituent array contains elements
31107         // of `toJoin` which have been determined to connect.
31108         //
31109         // Each consitituent array also has a `nodes` property whose value is an
31110         // ordered array of member nodes, with appropriate order reversal and
31111         // start/end coordinate de-duplication.
31112         //
31113         // Members of `toJoin` must have, at minimum, `type` and `id` properties.
31114         // Thus either an array of `osmWay`s or a relation member array may be used.
31115         //
31116         // If an member is an `osmWay`, its tags and childnodes may be reversed via
31117         // `actionReverse` in the output.
31118         //
31119         // The returned sequences array also has an `actions` array property, containing
31120         // any reversal actions that should be applied to the graph, should the calling
31121         // code attempt to actually join the given ways.
31122         //
31123         // Incomplete members (those for which `graph.hasEntity(element.id)` returns
31124         // false) and non-way members are ignored.
31125         //
31126         function osmJoinWays(toJoin, graph) {
31127             function resolve(member) {
31128                 return graph.childNodes(graph.entity(member.id));
31129             }
31130
31131             function reverse(item) {
31132                 var action = actionReverse(item.id, { reverseOneway: true });
31133                 sequences.actions.push(action);
31134                 return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
31135             }
31136
31137             // make a copy containing only the items to join
31138             toJoin = toJoin.filter(function(member) {
31139                 return member.type === 'way' && graph.hasEntity(member.id);
31140             });
31141
31142             // Are the things we are joining relation members or `osmWays`?
31143             // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
31144             var i;
31145             var joinAsMembers = true;
31146             for (i = 0; i < toJoin.length; i++) {
31147                 if (toJoin[i] instanceof osmWay) {
31148                     joinAsMembers = false;
31149                     break;
31150                 }
31151             }
31152
31153             var sequences = [];
31154             sequences.actions = [];
31155
31156             while (toJoin.length) {
31157                 // start a new sequence
31158                 var item = toJoin.shift();
31159                 var currWays = [item];
31160                 var currNodes = resolve(item).slice();
31161                 var doneSequence = false;
31162
31163                 // add to it
31164                 while (toJoin.length && !doneSequence) {
31165                     var start = currNodes[0];
31166                     var end = currNodes[currNodes.length - 1];
31167                     var fn = null;
31168                     var nodes = null;
31169
31170                     // Find the next way/member to join.
31171                     for (i = 0; i < toJoin.length; i++) {
31172                         item = toJoin[i];
31173                         nodes = resolve(item);
31174
31175                         // (for member ordering only, not way ordering - see #4872)
31176                         // Strongly prefer to generate a forward path that preserves the order
31177                         // of the members array. For multipolygons and most relations, member
31178                         // order does not matter - but for routes, it does. (see #4589)
31179                         // If we started this sequence backwards (i.e. next member way attaches to
31180                         // the start node and not the end node), reverse the initial way before continuing.
31181                         if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
31182                             (nodes[nodes.length - 1] === start || nodes[0] === start)
31183                         ) {
31184                             currWays[0] = reverse(currWays[0]);
31185                             currNodes.reverse();
31186                             start = currNodes[0];
31187                             end = currNodes[currNodes.length - 1];
31188                         }
31189
31190                         if (nodes[0] === end) {
31191                             fn = currNodes.push;               // join to end
31192                             nodes = nodes.slice(1);
31193                             break;
31194                         } else if (nodes[nodes.length - 1] === end) {
31195                             fn = currNodes.push;               // join to end
31196                             nodes = nodes.slice(0, -1).reverse();
31197                             item = reverse(item);
31198                             break;
31199                         } else if (nodes[nodes.length - 1] === start) {
31200                             fn = currNodes.unshift;            // join to beginning
31201                             nodes = nodes.slice(0, -1);
31202                             break;
31203                         } else if (nodes[0] === start) {
31204                             fn = currNodes.unshift;            // join to beginning
31205                             nodes = nodes.slice(1).reverse();
31206                             item = reverse(item);
31207                             break;
31208                         } else {
31209                             fn = nodes = null;
31210                         }
31211                     }
31212
31213                     if (!nodes) {     // couldn't find a joinable way/member
31214                         doneSequence = true;
31215                         break;
31216                     }
31217
31218                     fn.apply(currWays, [item]);
31219                     fn.apply(currNodes, nodes);
31220
31221                     toJoin.splice(i, 1);
31222                 }
31223
31224                 currWays.nodes = currNodes;
31225                 sequences.push(currWays);
31226             }
31227
31228             return sequences;
31229         }
31230
31231         function actionAddMember(relationId, member, memberIndex, insertPair) {
31232
31233             return function action(graph) {
31234                 var relation = graph.entity(relationId);
31235
31236                 // There are some special rules for Public Transport v2 routes.
31237                 var isPTv2 = /stop|platform/.test(member.role);
31238
31239                 if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
31240                     // Try to perform sensible inserts based on how the ways join together
31241                     graph = addWayMember(relation, graph);
31242                 } else {
31243                     // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31244                     // Stops and Platforms for PTv2 should be ordered first.
31245                     // hack: We do not currently have the ability to place them in the exactly correct order.
31246                     if (isPTv2 && isNaN(memberIndex)) {
31247                         memberIndex = 0;
31248                     }
31249
31250                     graph = graph.replace(relation.addMember(member, memberIndex));
31251                 }
31252
31253                 return graph;
31254             };
31255
31256
31257             // Add a way member into the relation "wherever it makes sense".
31258             // In this situation we were not supplied a memberIndex.
31259             function addWayMember(relation, graph) {
31260                 var groups, tempWay, item, i, j, k;
31261
31262                 // remove PTv2 stops and platforms before doing anything.
31263                 var PTv2members = [];
31264                 var members = [];
31265                 for (i = 0; i < relation.members.length; i++) {
31266                     var m = relation.members[i];
31267                     if (/stop|platform/.test(m.role)) {
31268                         PTv2members.push(m);
31269                     } else {
31270                         members.push(m);
31271                     }
31272                 }
31273                 relation = relation.update({ members: members });
31274
31275
31276                 if (insertPair) {
31277                     // We're adding a member that must stay paired with an existing member.
31278                     // (This feature is used by `actionSplit`)
31279                     //
31280                     // This is tricky because the members may exist multiple times in the
31281                     // member list, and with different A-B/B-A ordering and different roles.
31282                     // (e.g. a bus route that loops out and back - #4589).
31283                     //
31284                     // Replace the existing member with a temporary way,
31285                     // so that `osmJoinWays` can treat the pair like a single way.
31286                     tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
31287                     graph = graph.replace(tempWay);
31288                     var tempMember = { id: tempWay.id, type: 'way', role: member.role };
31289                     var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
31290                     groups = utilArrayGroupBy(tempRelation.members, 'type');
31291                     groups.way = groups.way || [];
31292
31293                 } else {
31294                     // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
31295                     groups = utilArrayGroupBy(relation.members, 'type');
31296                     groups.way = groups.way || [];
31297                     groups.way.push(member);
31298                 }
31299
31300                 members = withIndex(groups.way);
31301                 var joined = osmJoinWays(members, graph);
31302
31303                 // `joined` might not contain all of the way members,
31304                 // But will contain only the completed (downloaded) members
31305                 for (i = 0; i < joined.length; i++) {
31306                     var segment = joined[i];
31307                     var nodes = segment.nodes.slice();
31308                     var startIndex = segment[0].index;
31309
31310                     // j = array index in `members` where this segment starts
31311                     for (j = 0; j < members.length; j++) {
31312                         if (members[j].index === startIndex) {
31313                             break;
31314                         }
31315                     }
31316
31317                     // k = each member in segment
31318                     for (k = 0; k < segment.length; k++) {
31319                         item = segment[k];
31320                         var way = graph.entity(item.id);
31321
31322                         // If this is a paired item, generate members in correct order and role
31323                         if (tempWay && item.id === tempWay.id) {
31324                             if (nodes[0].id === insertPair.nodes[0]) {
31325                                 item.pair = [
31326                                     { id: insertPair.originalID, type: 'way', role: item.role },
31327                                     { id: insertPair.insertedID, type: 'way', role: item.role }
31328                                 ];
31329                             } else {
31330                                 item.pair = [
31331                                     { id: insertPair.insertedID, type: 'way', role: item.role },
31332                                     { id: insertPair.originalID, type: 'way', role: item.role }
31333                                 ];
31334                             }
31335                         }
31336
31337                         // reorder `members` if necessary
31338                         if (k > 0) {
31339                             if (j+k >= members.length || item.index !== members[j+k].index) {
31340                                 moveMember(members, item.index, j+k);
31341                             }
31342                         }
31343
31344                         nodes.splice(0, way.nodes.length - 1);
31345                     }
31346                 }
31347
31348                 if (tempWay) {
31349                     graph = graph.remove(tempWay);
31350                 }
31351
31352                 // Final pass: skip dead items, split pairs, remove index properties
31353                 var wayMembers = [];
31354                 for (i = 0; i < members.length; i++) {
31355                     item = members[i];
31356                     if (item.index === -1) continue;
31357
31358                     if (item.pair) {
31359                         wayMembers.push(item.pair[0]);
31360                         wayMembers.push(item.pair[1]);
31361                     } else {
31362                         wayMembers.push(utilObjectOmit(item, ['index']));
31363                     }
31364                 }
31365
31366                 // Put stops and platforms first, then nodes, ways, relations
31367                 // This is recommended for Public Transport v2 routes:
31368                 // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
31369                 var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
31370
31371                 return graph.replace(relation.update({ members: newMembers }));
31372
31373
31374                 // `moveMember()` changes the `members` array in place by splicing
31375                 // the item with `.index = findIndex` to where it belongs,
31376                 // and marking the old position as "dead" with `.index = -1`
31377                 //
31378                 // j=5, k=0                jk
31379                 // segment                 5 4 7 6
31380                 // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
31381                 //
31382                 // j=5, k=1                j k
31383                 // segment                 5 4 7 6
31384                 // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
31385                 // members       0 1 2 3 x 5 4 6 7 8 9      moved
31386                 //
31387                 // j=5, k=2                j   k
31388                 // segment                 5 4 7 6
31389                 // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
31390                 // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
31391                 //
31392                 // j=5, k=3                j     k
31393                 // segment                 5 4 7 6
31394                 // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
31395                 //
31396                 function moveMember(arr, findIndex, toIndex) {
31397                     for (var i = 0; i < arr.length; i++) {
31398                         if (arr[i].index === findIndex) {
31399                             break;
31400                         }
31401                     }
31402
31403                     var item = Object.assign({}, arr[i]);   // shallow copy
31404                     arr[i].index = -1;   // mark as dead
31405                     item.index = toIndex;
31406                     arr.splice(toIndex, 0, item);
31407                 }
31408
31409
31410                 // This is the same as `Relation.indexedMembers`,
31411                 // Except we don't want to index all the members, only the ways
31412                 function withIndex(arr) {
31413                     var result = new Array(arr.length);
31414                     for (var i = 0; i < arr.length; i++) {
31415                         result[i] = Object.assign({}, arr[i]);   // shallow copy
31416                         result[i].index = i;
31417                     }
31418                     return result;
31419                 }
31420             }
31421
31422         }
31423
31424         function actionAddMidpoint(midpoint, node) {
31425             return function(graph) {
31426                 graph = graph.replace(node.move(midpoint.loc));
31427
31428                 var parents = utilArrayIntersection(
31429                     graph.parentWays(graph.entity(midpoint.edge[0])),
31430                     graph.parentWays(graph.entity(midpoint.edge[1]))
31431                 );
31432
31433                 parents.forEach(function(way) {
31434                     for (var i = 0; i < way.nodes.length - 1; i++) {
31435                         if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
31436                             graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
31437
31438                             // Add only one midpoint on doubled-back segments,
31439                             // turning them into self-intersections.
31440                             return;
31441                         }
31442                     }
31443                 });
31444
31445                 return graph;
31446             };
31447         }
31448
31449         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
31450         function actionAddVertex(wayId, nodeId, index) {
31451             return function(graph) {
31452                 return graph.replace(graph.entity(wayId).addNode(nodeId, index));
31453             };
31454         }
31455
31456         function actionChangeMember(relationId, member, memberIndex) {
31457             return function(graph) {
31458                 return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
31459             };
31460         }
31461
31462         function actionChangePreset(entityID, oldPreset, newPreset, skipFieldDefaults) {
31463             return function action(graph) {
31464                 var entity = graph.entity(entityID);
31465                 var geometry = entity.geometry(graph);
31466                 var tags = entity.tags;
31467
31468                 if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
31469                 if (newPreset) tags = newPreset.setTags(tags, geometry, skipFieldDefaults);
31470
31471                 return graph.replace(entity.update({tags: tags}));
31472             };
31473         }
31474
31475         function actionChangeTags(entityId, tags) {
31476             return function(graph) {
31477                 var entity = graph.entity(entityId);
31478                 return graph.replace(entity.update({tags: tags}));
31479             };
31480         }
31481
31482         function osmNode() {
31483             if (!(this instanceof osmNode)) {
31484                 return (new osmNode()).initialize(arguments);
31485             } else if (arguments.length) {
31486                 this.initialize(arguments);
31487             }
31488         }
31489
31490         osmEntity.node = osmNode;
31491
31492         osmNode.prototype = Object.create(osmEntity.prototype);
31493
31494         Object.assign(osmNode.prototype, {
31495             type: 'node',
31496             loc: [9999, 9999],
31497
31498             extent: function() {
31499                 return new geoExtent(this.loc);
31500             },
31501
31502
31503             geometry: function(graph) {
31504                 return graph.transient(this, 'geometry', function() {
31505                     return graph.isPoi(this) ? 'point' : 'vertex';
31506                 });
31507             },
31508
31509
31510             move: function(loc) {
31511                 return this.update({loc: loc});
31512             },
31513
31514
31515             isDegenerate: function() {
31516                 return !(
31517                     Array.isArray(this.loc) && this.loc.length === 2 &&
31518                     this.loc[0] >= -180 && this.loc[0] <= 180 &&
31519                     this.loc[1] >= -90 && this.loc[1] <= 90
31520                 );
31521             },
31522
31523
31524             // Inspect tags and geometry to determine which direction(s) this node/vertex points
31525             directions: function(resolver, projection) {
31526                 var val;
31527                 var i;
31528
31529                 // which tag to use?
31530                 if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
31531                     // all-way stop tag on a highway intersection
31532                     val = 'all';
31533                 } else {
31534                     // generic direction tag
31535                     val = (this.tags.direction || '').toLowerCase();
31536
31537                     // better suffix-style direction tag
31538                     var re = /:direction$/i;
31539                     var keys = Object.keys(this.tags);
31540                     for (i = 0; i < keys.length; i++) {
31541                         if (re.test(keys[i])) {
31542                             val = this.tags[keys[i]].toLowerCase();
31543                             break;
31544                         }
31545                     }
31546                 }
31547
31548                 if (val === '') return [];
31549
31550                 var cardinal = {
31551                     north: 0,               n: 0,
31552                     northnortheast: 22,     nne: 22,
31553                     northeast: 45,          ne: 45,
31554                     eastnortheast: 67,      ene: 67,
31555                     east: 90,               e: 90,
31556                     eastsoutheast: 112,     ese: 112,
31557                     southeast: 135,         se: 135,
31558                     southsoutheast: 157,    sse: 157,
31559                     south: 180,             s: 180,
31560                     southsouthwest: 202,    ssw: 202,
31561                     southwest: 225,         sw: 225,
31562                     westsouthwest: 247,     wsw: 247,
31563                     west: 270,              w: 270,
31564                     westnorthwest: 292,     wnw: 292,
31565                     northwest: 315,         nw: 315,
31566                     northnorthwest: 337,    nnw: 337
31567                 };
31568
31569
31570                 var values = val.split(';');
31571                 var results = [];
31572
31573                 values.forEach(function(v) {
31574                     // swap cardinal for numeric directions
31575                     if (cardinal[v] !== undefined) {
31576                         v = cardinal[v];
31577                     }
31578
31579                     // numeric direction - just add to results
31580                     if (v !== '' && !isNaN(+v)) {
31581                         results.push(+v);
31582                         return;
31583                     }
31584
31585                     // string direction - inspect parent ways
31586                     var lookBackward =
31587                         (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
31588                     var lookForward =
31589                         (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
31590
31591                     if (!lookForward && !lookBackward) return;
31592
31593                     var nodeIds = {};
31594                     resolver.parentWays(this).forEach(function(parent) {
31595                         var nodes = parent.nodes;
31596                         for (i = 0; i < nodes.length; i++) {
31597                             if (nodes[i] === this.id) {  // match current entity
31598                                 if (lookForward && i > 0) {
31599                                     nodeIds[nodes[i - 1]] = true;  // look back to prev node
31600                                 }
31601                                 if (lookBackward && i < nodes.length - 1) {
31602                                     nodeIds[nodes[i + 1]] = true;  // look ahead to next node
31603                                 }
31604                             }
31605                         }
31606                     }, this);
31607
31608                     Object.keys(nodeIds).forEach(function(nodeId) {
31609                         // +90 because geoAngle returns angle from X axis, not Y (north)
31610                         results.push(
31611                             (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
31612                         );
31613                     }, this);
31614
31615                 }, this);
31616
31617                 return utilArrayUniq(results);
31618             },
31619
31620
31621             isEndpoint: function(resolver) {
31622                 return resolver.transient(this, 'isEndpoint', function() {
31623                     var id = this.id;
31624                     return resolver.parentWays(this).filter(function(parent) {
31625                         return !parent.isClosed() && !!parent.affix(id);
31626                     }).length > 0;
31627                 });
31628             },
31629
31630
31631             isConnected: function(resolver) {
31632                 return resolver.transient(this, 'isConnected', function() {
31633                     var parents = resolver.parentWays(this);
31634
31635                     function isLine(entity) {
31636                         return entity.geometry(resolver) === 'line' &&
31637                             entity.hasInterestingTags();
31638                     }
31639
31640                     // vertex is connected to multiple parent lines
31641                     if (parents.length > 1 && parents.some(isLine)) {
31642                         return true;
31643
31644                     } else if (parents.length === 1) {
31645                         var way = parents[0];
31646                         var nodes = way.nodes.slice();
31647                         if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
31648
31649                         // return true if vertex appears multiple times (way is self intersecting)
31650                         return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
31651                     }
31652
31653                     return false;
31654                 });
31655             },
31656
31657
31658             isIntersection: function(resolver) {
31659                 return resolver.transient(this, 'isIntersection', function() {
31660                     return resolver.parentWays(this).filter(function(parent) {
31661                         return (parent.tags.highway ||
31662                             parent.tags.waterway ||
31663                             parent.tags.railway ||
31664                             parent.tags.aeroway) &&
31665                             parent.geometry(resolver) === 'line';
31666                     }).length > 1;
31667                 });
31668             },
31669
31670
31671             isHighwayIntersection: function(resolver) {
31672                 return resolver.transient(this, 'isHighwayIntersection', function() {
31673                     return resolver.parentWays(this).filter(function(parent) {
31674                         return parent.tags.highway && parent.geometry(resolver) === 'line';
31675                     }).length > 1;
31676                 });
31677             },
31678
31679
31680             isOnAddressLine: function(resolver) {
31681                 return resolver.transient(this, 'isOnAddressLine', function() {
31682                     return resolver.parentWays(this).filter(function(parent) {
31683                         return parent.tags.hasOwnProperty('addr:interpolation') &&
31684                             parent.geometry(resolver) === 'line';
31685                     }).length > 0;
31686                 });
31687             },
31688
31689
31690             asJXON: function(changeset_id) {
31691                 var r = {
31692                     node: {
31693                         '@id': this.osmId(),
31694                         '@lon': this.loc[0],
31695                         '@lat': this.loc[1],
31696                         '@version': (this.version || 0),
31697                         tag: Object.keys(this.tags).map(function(k) {
31698                             return { keyAttributes: { k: k, v: this.tags[k] } };
31699                         }, this)
31700                     }
31701                 };
31702                 if (changeset_id) r.node['@changeset'] = changeset_id;
31703                 return r;
31704             },
31705
31706
31707             asGeoJSON: function() {
31708                 return {
31709                     type: 'Point',
31710                     coordinates: this.loc
31711                 };
31712             }
31713         });
31714
31715         function actionCircularize(wayId, projection, maxAngle) {
31716             maxAngle = (maxAngle || 20) * Math.PI / 180;
31717
31718
31719             var action = function(graph, t) {
31720                 if (t === null || !isFinite(t)) t = 1;
31721                 t = Math.min(Math.max(+t, 0), 1);
31722
31723                 var way = graph.entity(wayId);
31724                 var origNodes = {};
31725
31726                 graph.childNodes(way).forEach(function(node) {
31727                     if (!origNodes[node.id]) origNodes[node.id] = node;
31728                 });
31729
31730                 if (!way.isConvex(graph)) {
31731                     graph = action.makeConvex(graph);
31732                 }
31733
31734                 var nodes = utilArrayUniq(graph.childNodes(way));
31735                 var keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; });
31736                 var points = nodes.map(function(n) { return projection(n.loc); });
31737                 var keyPoints = keyNodes.map(function(n) { return projection(n.loc); });
31738                 var centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points);
31739                 var radius = d3_median(points, function(p) { return geoVecLength(centroid, p); });
31740                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31741                 var ids, i, j, k;
31742
31743                 // we need atleast two key nodes for the algorithm to work
31744                 if (!keyNodes.length) {
31745                     keyNodes = [nodes[0]];
31746                     keyPoints = [points[0]];
31747                 }
31748
31749                 if (keyNodes.length === 1) {
31750                     var index = nodes.indexOf(keyNodes[0]);
31751                     var oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
31752
31753                     keyNodes.push(nodes[oppositeIndex]);
31754                     keyPoints.push(points[oppositeIndex]);
31755                 }
31756
31757                 // key points and nodes are those connected to the ways,
31758                 // they are projected onto the circle, inbetween nodes are moved
31759                 // to constant intervals between key nodes, extra inbetween nodes are
31760                 // added if necessary.
31761                 for (i = 0; i < keyPoints.length; i++) {
31762                     var nextKeyNodeIndex = (i + 1) % keyNodes.length;
31763                     var startNode = keyNodes[i];
31764                     var endNode = keyNodes[nextKeyNodeIndex];
31765                     var startNodeIndex = nodes.indexOf(startNode);
31766                     var endNodeIndex = nodes.indexOf(endNode);
31767                     var numberNewPoints = -1;
31768                     var indexRange = endNodeIndex - startNodeIndex;
31769                     var nearNodes = {};
31770                     var inBetweenNodes = [];
31771                     var startAngle, endAngle, totalAngle, eachAngle;
31772                     var angle, loc, node, origNode;
31773
31774                     if (indexRange < 0) {
31775                         indexRange += nodes.length;
31776                     }
31777
31778                     // position this key node
31779                     var distance = geoVecLength(centroid, keyPoints[i]) || 1e-4;
31780                     keyPoints[i] = [
31781                         centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
31782                         centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
31783                     ];
31784                     loc = projection.invert(keyPoints[i]);
31785                     node = keyNodes[i];
31786                     origNode = origNodes[node.id];
31787                     node = node.move(geoVecInterp(origNode.loc, loc, t));
31788                     graph = graph.replace(node);
31789
31790                     // figure out the between delta angle we want to match to
31791                     startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
31792                     endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
31793                     totalAngle = endAngle - startAngle;
31794
31795                     // detects looping around -pi/pi
31796                     if (totalAngle * sign > 0) {
31797                         totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
31798                     }
31799
31800                     do {
31801                         numberNewPoints++;
31802                         eachAngle = totalAngle / (indexRange + numberNewPoints);
31803                     } while (Math.abs(eachAngle) > maxAngle);
31804
31805
31806                     // move existing nodes
31807                     for (j = 1; j < indexRange; j++) {
31808                         angle = startAngle + j * eachAngle;
31809                         loc = projection.invert([
31810                             centroid[0] + Math.cos(angle) * radius,
31811                             centroid[1] + Math.sin(angle) * radius
31812                         ]);
31813
31814                         node = nodes[(j + startNodeIndex) % nodes.length];
31815                         origNode = origNodes[node.id];
31816                         nearNodes[node.id] = angle;
31817
31818                         node = node.move(geoVecInterp(origNode.loc, loc, t));
31819                         graph = graph.replace(node);
31820                     }
31821
31822                     // add new inbetween nodes if necessary
31823                     for (j = 0; j < numberNewPoints; j++) {
31824                         angle = startAngle + (indexRange + j) * eachAngle;
31825                         loc = projection.invert([
31826                             centroid[0] + Math.cos(angle) * radius,
31827                             centroid[1] + Math.sin(angle) * radius
31828                         ]);
31829
31830                         // choose a nearnode to use as the original
31831                         var min = Infinity;
31832                         for (var nodeId in nearNodes) {
31833                             var nearAngle = nearNodes[nodeId];
31834                             var dist = Math.abs(nearAngle - angle);
31835                             if (dist < min) {
31836                                 dist = min;
31837                                 origNode = origNodes[nodeId];
31838                             }
31839                         }
31840
31841                         node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
31842                         graph = graph.replace(node);
31843
31844                         nodes.splice(endNodeIndex + j, 0, node);
31845                         inBetweenNodes.push(node.id);
31846                     }
31847
31848                     // Check for other ways that share these keyNodes..
31849                     // If keyNodes are adjacent in both ways,
31850                     // we can add inBetween nodes to that shared way too..
31851                     if (indexRange === 1 && inBetweenNodes.length) {
31852                         var startIndex1 = way.nodes.lastIndexOf(startNode.id);
31853                         var endIndex1 = way.nodes.lastIndexOf(endNode.id);
31854                         var wayDirection1 = (endIndex1 - startIndex1);
31855                         if (wayDirection1 < -1) { wayDirection1 = 1; }
31856
31857                         var parentWays = graph.parentWays(keyNodes[i]);
31858                         for (j = 0; j < parentWays.length; j++) {
31859                             var sharedWay = parentWays[j];
31860                             if (sharedWay === way) continue;
31861
31862                             if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
31863                                 var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id);
31864                                 var endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id);
31865                                 var wayDirection2 = (endIndex2 - startIndex2);
31866                                 var insertAt = endIndex2;
31867                                 if (wayDirection2 < -1) { wayDirection2 = 1; }
31868
31869                                 if (wayDirection1 !== wayDirection2) {
31870                                     inBetweenNodes.reverse();
31871                                     insertAt = startIndex2;
31872                                 }
31873                                 for (k = 0; k < inBetweenNodes.length; k++) {
31874                                     sharedWay = sharedWay.addNode(inBetweenNodes[k], insertAt + k);
31875                                 }
31876                                 graph = graph.replace(sharedWay);
31877                             }
31878                         }
31879                     }
31880
31881                 }
31882
31883                 // update the way to have all the new nodes
31884                 ids = nodes.map(function(n) { return n.id; });
31885                 ids.push(ids[0]);
31886
31887                 way = way.update({nodes: ids});
31888                 graph = graph.replace(way);
31889
31890                 return graph;
31891             };
31892
31893
31894             action.makeConvex = function(graph) {
31895                 var way = graph.entity(wayId);
31896                 var nodes = utilArrayUniq(graph.childNodes(way));
31897                 var points = nodes.map(function(n) { return projection(n.loc); });
31898                 var sign = d3_polygonArea(points) > 0 ? 1 : -1;
31899                 var hull = d3_polygonHull(points);
31900                 var i, j;
31901
31902                 // D3 convex hulls go counterclockwise..
31903                 if (sign === -1) {
31904                     nodes.reverse();
31905                     points.reverse();
31906                 }
31907
31908                 for (i = 0; i < hull.length - 1; i++) {
31909                     var startIndex = points.indexOf(hull[i]);
31910                     var endIndex = points.indexOf(hull[i+1]);
31911                     var indexRange = (endIndex - startIndex);
31912
31913                     if (indexRange < 0) {
31914                         indexRange += nodes.length;
31915                     }
31916
31917                     // move interior nodes to the surface of the convex hull..
31918                     for (j = 1; j < indexRange; j++) {
31919                         var point = geoVecInterp(hull[i], hull[i+1], j / indexRange);
31920                         var node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
31921                         graph = graph.replace(node);
31922                     }
31923                 }
31924                 return graph;
31925             };
31926
31927
31928             action.disabled = function(graph) {
31929                 if (!graph.entity(wayId).isClosed()) {
31930                     return 'not_closed';
31931                 }
31932             };
31933
31934
31935             action.transitionable = true;
31936
31937
31938             return action;
31939         }
31940
31941         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
31942         function actionDeleteWay(wayID) {
31943
31944             function canDeleteNode(node, graph) {
31945                 // don't delete nodes still attached to ways or relations
31946                 if (graph.parentWays(node).length ||
31947                     graph.parentRelations(node).length) return false;
31948
31949                 var geometries = osmNodeGeometriesForTags(node.tags);
31950                 // don't delete if this node can be a standalone point
31951                 if (geometries.point) return false;
31952                 // delete if this node only be a vertex
31953                 if (geometries.vertex) return true;
31954
31955                 // iD doesn't know if this should be a point or vertex,
31956                 // so only delete if there are no interesting tags
31957                 return !node.hasInterestingTags();
31958             }
31959
31960
31961             var action = function(graph) {
31962                 var way = graph.entity(wayID);
31963
31964                 graph.parentRelations(way).forEach(function(parent) {
31965                     parent = parent.removeMembersWithID(wayID);
31966                     graph = graph.replace(parent);
31967
31968                     if (parent.isDegenerate()) {
31969                         graph = actionDeleteRelation(parent.id)(graph);
31970                     }
31971                 });
31972
31973                 (new Set(way.nodes)).forEach(function(nodeID) {
31974                     graph = graph.replace(way.removeNode(nodeID));
31975
31976                     var node = graph.entity(nodeID);
31977                     if (canDeleteNode(node, graph)) {
31978                         graph = graph.remove(node);
31979                     }
31980                 });
31981
31982                 return graph.remove(way);
31983             };
31984
31985
31986             return action;
31987         }
31988
31989         function actionDeleteMultiple(ids) {
31990             var actions = {
31991                 way: actionDeleteWay,
31992                 node: actionDeleteNode,
31993                 relation: actionDeleteRelation
31994             };
31995
31996
31997             var action = function(graph) {
31998                 ids.forEach(function(id) {
31999                     if (graph.hasEntity(id)) { // It may have been deleted aready.
32000                         graph = actions[graph.entity(id).type](id)(graph);
32001                     }
32002                 });
32003
32004                 return graph;
32005             };
32006
32007
32008             return action;
32009         }
32010
32011         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
32012         function actionDeleteRelation(relationID, allowUntaggedMembers) {
32013
32014             function canDeleteEntity(entity, graph) {
32015                 return !graph.parentWays(entity).length &&
32016                     !graph.parentRelations(entity).length &&
32017                     (!entity.hasInterestingTags() && !allowUntaggedMembers);
32018             }
32019
32020
32021             var action = function(graph) {
32022                 var relation = graph.entity(relationID);
32023
32024                 graph.parentRelations(relation)
32025                     .forEach(function(parent) {
32026                         parent = parent.removeMembersWithID(relationID);
32027                         graph = graph.replace(parent);
32028
32029                         if (parent.isDegenerate()) {
32030                             graph = actionDeleteRelation(parent.id)(graph);
32031                         }
32032                     });
32033
32034                 var memberIDs = utilArrayUniq(relation.members.map(function(m) { return m.id; }));
32035                 memberIDs.forEach(function(memberID) {
32036                     graph = graph.replace(relation.removeMembersWithID(memberID));
32037
32038                     var entity = graph.entity(memberID);
32039                     if (canDeleteEntity(entity, graph)) {
32040                         graph = actionDeleteMultiple([memberID])(graph);
32041                     }
32042                 });
32043
32044                 return graph.remove(relation);
32045             };
32046
32047
32048             return action;
32049         }
32050
32051         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
32052         function actionDeleteNode(nodeId) {
32053             var action = function(graph) {
32054                 var node = graph.entity(nodeId);
32055
32056                 graph.parentWays(node)
32057                     .forEach(function(parent) {
32058                         parent = parent.removeNode(nodeId);
32059                         graph = graph.replace(parent);
32060
32061                         if (parent.isDegenerate()) {
32062                             graph = actionDeleteWay(parent.id)(graph);
32063                         }
32064                     });
32065
32066                 graph.parentRelations(node)
32067                     .forEach(function(parent) {
32068                         parent = parent.removeMembersWithID(nodeId);
32069                         graph = graph.replace(parent);
32070
32071                         if (parent.isDegenerate()) {
32072                             graph = actionDeleteRelation(parent.id)(graph);
32073                         }
32074                     });
32075
32076                 return graph.remove(node);
32077             };
32078
32079
32080             return action;
32081         }
32082
32083         // Connect the ways at the given nodes.
32084         //
32085         // First choose a node to be the survivor, with preference given
32086         // to an existing (not new) node.
32087         //
32088         // Tags and relation memberships of of non-surviving nodes are merged
32089         // to the survivor.
32090         //
32091         // This is the inverse of `iD.actionDisconnect`.
32092         //
32093         // Reference:
32094         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
32095         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
32096         //
32097         function actionConnect(nodeIDs) {
32098             var action = function(graph) {
32099                 var survivor;
32100                 var node;
32101                 var parents;
32102                 var i, j;
32103
32104                 // Choose a survivor node, prefer an existing (not new) node - #4974
32105                 for (i = 0; i < nodeIDs.length; i++) {
32106                     survivor = graph.entity(nodeIDs[i]);
32107                     if (survivor.version) break;  // found one
32108                 }
32109
32110                 // Replace all non-surviving nodes with the survivor and merge tags.
32111                 for (i = 0; i < nodeIDs.length; i++) {
32112                     node = graph.entity(nodeIDs[i]);
32113                     if (node.id === survivor.id) continue;
32114
32115                     parents = graph.parentWays(node);
32116                     for (j = 0; j < parents.length; j++) {
32117                         if (!parents[j].areAdjacent(node.id, survivor.id)) {
32118                             graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
32119                         }
32120                     }
32121
32122                     parents = graph.parentRelations(node);
32123                     for (j = 0; j < parents.length; j++) {
32124                         graph = graph.replace(parents[j].replaceMember(node, survivor));
32125                     }
32126
32127                     survivor = survivor.mergeTags(node.tags);
32128                     graph = actionDeleteNode(node.id)(graph);
32129                 }
32130
32131                 graph = graph.replace(survivor);
32132
32133                 return graph;
32134             };
32135
32136
32137             action.disabled = function(graph) {
32138                 var seen = {};
32139                 var restrictionIDs = [];
32140                 var survivor;
32141                 var node, way;
32142                 var relations, relation, role;
32143                 var i, j, k;
32144
32145                 // Choose a survivor node, prefer an existing (not new) node - #4974
32146                 for (i = 0; i < nodeIDs.length; i++) {
32147                     survivor = graph.entity(nodeIDs[i]);
32148                     if (survivor.version) break;  // found one
32149                 }
32150
32151                 // 1. disable if the nodes being connected have conflicting relation roles
32152                 for (i = 0; i < nodeIDs.length; i++) {
32153                     node = graph.entity(nodeIDs[i]);
32154                     relations = graph.parentRelations(node);
32155
32156                     for (j = 0; j < relations.length; j++) {
32157                         relation = relations[j];
32158                         role = relation.memberById(node.id).role || '';
32159
32160                         // if this node is a via node in a restriction, remember for later
32161                         if (relation.hasFromViaTo()) {
32162                             restrictionIDs.push(relation.id);
32163                         }
32164
32165                         if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
32166                             return 'relation';
32167                         } else {
32168                             seen[relation.id] = role;
32169                         }
32170                     }
32171                 }
32172
32173                 // gather restrictions for parent ways
32174                 for (i = 0; i < nodeIDs.length; i++) {
32175                     node = graph.entity(nodeIDs[i]);
32176
32177                     var parents = graph.parentWays(node);
32178                     for (j = 0; j < parents.length; j++) {
32179                         var parent = parents[j];
32180                         relations = graph.parentRelations(parent);
32181
32182                         for (k = 0; k < relations.length; k++) {
32183                             relation = relations[k];
32184                             if (relation.hasFromViaTo()) {
32185                                 restrictionIDs.push(relation.id);
32186                             }
32187                         }
32188                     }
32189                 }
32190
32191
32192                 // test restrictions
32193                 restrictionIDs = utilArrayUniq(restrictionIDs);
32194                 for (i = 0; i < restrictionIDs.length; i++) {
32195                     relation = graph.entity(restrictionIDs[i]);
32196                     if (!relation.isComplete(graph)) continue;
32197
32198                     var memberWays = relation.members
32199                         .filter(function(m) { return m.type === 'way'; })
32200                         .map(function(m) { return graph.entity(m.id); });
32201
32202                     memberWays = utilArrayUniq(memberWays);
32203                     var f = relation.memberByRole('from');
32204                     var t = relation.memberByRole('to');
32205                     var isUturn = (f.id === t.id);
32206
32207                     // 2a. disable if connection would damage a restriction
32208                     // (a key node is a node at the junction of ways)
32209                     var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
32210                     for (j = 0; j < relation.members.length; j++) {
32211                         collectNodes(relation.members[j], nodes);
32212                     }
32213
32214                     nodes.keyfrom = utilArrayUniq(nodes.keyfrom.filter(hasDuplicates));
32215                     nodes.keyto = utilArrayUniq(nodes.keyto.filter(hasDuplicates));
32216
32217                     var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
32218                     nodes.from = nodes.from.filter(filter);
32219                     nodes.via = nodes.via.filter(filter);
32220                     nodes.to = nodes.to.filter(filter);
32221
32222                     var connectFrom = false;
32223                     var connectVia = false;
32224                     var connectTo = false;
32225                     var connectKeyFrom = false;
32226                     var connectKeyTo = false;
32227
32228                     for (j = 0; j < nodeIDs.length; j++) {
32229                         var n = nodeIDs[j];
32230                         if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
32231                         if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
32232                         if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
32233                         if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
32234                         if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
32235                     }
32236                     if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
32237                     if (connectFrom && connectVia) { return 'restriction'; }
32238                     if (connectTo   && connectVia) { return 'restriction'; }
32239
32240                     // connecting to a key node -
32241                     // if both nodes are on a member way (i.e. part of the turn restriction),
32242                     // the connecting node must be adjacent to the key node.
32243                     if (connectKeyFrom || connectKeyTo) {
32244                         if (nodeIDs.length !== 2) { return 'restriction'; }
32245
32246                         var n0 = null;
32247                         var n1 = null;
32248                         for (j = 0; j < memberWays.length; j++) {
32249                             way = memberWays[j];
32250                             if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
32251                             if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
32252                         }
32253
32254                         if (n0 && n1) {    // both nodes are part of the restriction
32255                             var ok = false;
32256                             for (j = 0; j < memberWays.length; j++) {
32257                                 way = memberWays[j];
32258                                 if (way.areAdjacent(n0, n1)) {
32259                                     ok = true;
32260                                     break;
32261                                 }
32262                             }
32263                             if (!ok) {
32264                                 return 'restriction';
32265                             }
32266                         }
32267                     }
32268
32269                     // 2b. disable if nodes being connected will destroy a member way in a restriction
32270                     // (to test, make a copy and try actually connecting the nodes)
32271                     for (j = 0; j < memberWays.length; j++) {
32272                         way = memberWays[j].update({});   // make copy
32273                         for (k = 0; k < nodeIDs.length; k++) {
32274                             if (nodeIDs[k] === survivor.id) continue;
32275
32276                             if (way.areAdjacent(nodeIDs[k], survivor.id)) {
32277                                 way = way.removeNode(nodeIDs[k]);
32278                             } else {
32279                                 way = way.replaceNode(nodeIDs[k], survivor.id);
32280                             }
32281                         }
32282                         if (way.isDegenerate()) {
32283                             return 'restriction';
32284                         }
32285                     }
32286                 }
32287
32288                 return false;
32289
32290
32291                 // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
32292                 function hasDuplicates(n, i, arr) {
32293                     return arr.indexOf(n) !== arr.lastIndexOf(n);
32294                 }
32295
32296                 function keyNodeFilter(froms, tos) {
32297                     return function(n) {
32298                         return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
32299                     };
32300                 }
32301
32302                 function collectNodes(member, collection) {
32303                     var entity = graph.hasEntity(member.id);
32304                     if (!entity) return;
32305
32306                     var role = member.role || '';
32307                     if (!collection[role]) {
32308                         collection[role] = [];
32309                     }
32310
32311                     if (member.type === 'node') {
32312                         collection[role].push(member.id);
32313                         if (role === 'via') {
32314                             collection.keyfrom.push(member.id);
32315                             collection.keyto.push(member.id);
32316                         }
32317
32318                     } else if (member.type === 'way') {
32319                         collection[role].push.apply(collection[role], entity.nodes);
32320                         if (role === 'from' || role === 'via') {
32321                             collection.keyfrom.push(entity.first());
32322                             collection.keyfrom.push(entity.last());
32323                         }
32324                         if (role === 'to' || role === 'via') {
32325                             collection.keyto.push(entity.first());
32326                             collection.keyto.push(entity.last());
32327                         }
32328                     }
32329                 }
32330             };
32331
32332
32333             return action;
32334         }
32335
32336         function actionCopyEntities(ids, fromGraph) {
32337             var _copies = {};
32338
32339
32340             var action = function(graph) {
32341                 ids.forEach(function(id) {
32342                     fromGraph.entity(id).copy(fromGraph, _copies);
32343                 });
32344
32345                 for (var id in _copies) {
32346                     graph = graph.replace(_copies[id]);
32347                 }
32348
32349                 return graph;
32350             };
32351
32352
32353             action.copies = function() {
32354                 return _copies;
32355             };
32356
32357
32358             return action;
32359         }
32360
32361         function actionDeleteMember(relationId, memberIndex) {
32362             return function(graph) {
32363                 var relation = graph.entity(relationId)
32364                     .removeMember(memberIndex);
32365
32366                 graph = graph.replace(relation);
32367
32368                 if (relation.isDegenerate())
32369                     graph = actionDeleteRelation(relation.id)(graph);
32370
32371                 return graph;
32372             };
32373         }
32374
32375         function actionDiscardTags(difference) {
32376
32377             return function(graph) {
32378                 function discardTags(entity) {
32379                     var tags = {};
32380                     var keys = Object.keys(entity.tags);
32381                     var discarded = false;
32382
32383                     for (var i = 0; i < keys.length; i++) {
32384                         var k = keys[i];
32385                         if (dataDiscarded[k] || !entity.tags[k]) {
32386                             discarded = true;
32387                         } else {
32388                             tags[k] = entity.tags[k];
32389                         }
32390                     }
32391
32392                     if (discarded) {
32393                         graph = graph.replace(entity.update({ tags: tags }));
32394                     }
32395                 }
32396
32397                 difference.modified().forEach(discardTags);
32398                 difference.created().forEach(discardTags);
32399
32400                 return graph;
32401             };
32402         }
32403
32404         // Disconect the ways at the given node.
32405         //
32406         // Optionally, disconnect only the given ways.
32407         //
32408         // For testing convenience, accepts an ID to assign to the (first) new node.
32409         // Normally, this will be undefined and the way will automatically
32410         // be assigned a new ID.
32411         //
32412         // This is the inverse of `iD.actionConnect`.
32413         //
32414         // Reference:
32415         //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
32416         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
32417         //
32418         function actionDisconnect(nodeId, newNodeId) {
32419             var wayIds;
32420
32421
32422             var action = function(graph) {
32423                 var node = graph.entity(nodeId);
32424                 var connections = action.connections(graph);
32425
32426                 connections.forEach(function(connection) {
32427                     var way = graph.entity(connection.wayID);
32428                     var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
32429
32430                     graph = graph.replace(newNode);
32431                     if (connection.index === 0 && way.isArea()) {
32432                         // replace shared node with shared node..
32433                         graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
32434                     } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
32435                         // replace closing node with new new node..
32436                         graph = graph.replace(way.unclose().addNode(newNode.id));
32437                     } else {
32438                         // replace shared node with multiple new nodes..
32439                         graph = graph.replace(way.updateNode(newNode.id, connection.index));
32440                     }
32441                 });
32442
32443                 return graph;
32444             };
32445
32446
32447             action.connections = function(graph) {
32448                 var candidates = [];
32449                 var keeping = false;
32450                 var parentWays = graph.parentWays(graph.entity(nodeId));
32451
32452                 parentWays.forEach(function(way) {
32453                     if (wayIds && wayIds.indexOf(way.id) === -1) {
32454                         keeping = true;
32455                         return;
32456                     }
32457                     if (way.isArea() && (way.nodes[0] === nodeId)) {
32458                         candidates.push({ wayID: way.id, index: 0 });
32459                     } else {
32460                         way.nodes.forEach(function(waynode, index) {
32461                             if (waynode === nodeId) {
32462                                 if (way.isClosed() && parentWays.length > 1 && wayIds && wayIds.indexOf(way.id) !== -1 && index === way.nodes.length-1) {
32463                                     return;
32464                                 }
32465                                 candidates.push({ wayID: way.id, index: index });
32466                             }
32467                         });
32468                     }
32469                 });
32470
32471                 return keeping ? candidates : candidates.slice(1);
32472             };
32473
32474
32475             action.disabled = function(graph) {
32476                 var connections = action.connections(graph);
32477                 if (connections.length === 0)
32478                     return 'not_connected';
32479
32480                 var parentWays = graph.parentWays(graph.entity(nodeId));
32481                 var seenRelationIds = {};
32482                 var sharedRelation;
32483
32484                 parentWays.forEach(function(way) {
32485                     var relations = graph.parentRelations(way);
32486                     relations.forEach(function(relation) {
32487                         if (relation.id in seenRelationIds) {
32488                             if (wayIds) {
32489                                 if (wayIds.indexOf(way.id) !== -1 ||
32490                                     wayIds.indexOf(seenRelationIds[relation.id]) !== -1) {
32491                                     sharedRelation = relation;
32492                                 }
32493                             } else {
32494                                 sharedRelation = relation;
32495                             }
32496                         } else {
32497                             seenRelationIds[relation.id] = way.id;
32498                         }
32499                     });
32500                 });
32501
32502                 if (sharedRelation)
32503                     return 'relation';
32504             };
32505
32506
32507             action.limitWays = function(val) {
32508                 if (!arguments.length) return wayIds;
32509                 wayIds = val;
32510                 return action;
32511             };
32512
32513
32514             return action;
32515         }
32516
32517         function actionExtract(entityID, projection) {
32518
32519             var extractedNodeID;
32520
32521             var action = function(graph) {
32522                 var entity = graph.entity(entityID);
32523
32524                 if (entity.type === 'node') {
32525                     return extractFromNode(entity, graph);
32526                 }
32527
32528                 return extractFromArea(entity, graph);
32529             };
32530
32531             function extractFromNode(node, graph) {
32532
32533                 extractedNodeID = node.id;
32534
32535                 // Create a new node to replace the one we will detach
32536                 var replacement = osmNode({ loc: node.loc });
32537                 graph = graph.replace(replacement);
32538
32539                 // Process each way in turn, updating the graph as we go
32540                 graph = graph.parentWays(node)
32541                     .reduce(function(accGraph, parentWay) {
32542                         return accGraph.replace(parentWay.replaceNode(entityID, replacement.id));
32543                     }, graph);
32544
32545                 // Process any relations too
32546                 return graph.parentRelations(node)
32547                     .reduce(function(accGraph, parentRel) {
32548                         return accGraph.replace(parentRel.replaceMember(node, replacement));
32549                     }, graph);
32550             }
32551
32552             function extractFromArea(entity, graph) {
32553
32554                 var keysToCopyAndRetain = ['source', 'wheelchair'];
32555                 var keysToRetain = ['type'];
32556                 var buildingKeysToRetain = ['architect', 'building', 'height', 'layer'];
32557
32558                 var centroid = d3_geoPath(projection).centroid(entity.asGeoJSON(graph, true));
32559
32560                 var isBuilding = entity.tags.building;
32561
32562                 var areaTags = Object.assign({}, entity.tags);  // shallow copy
32563                 var pointTags = {};
32564                 for (var key in areaTags) {
32565
32566                     if (keysToRetain.indexOf(key) !== -1) {
32567                         continue;
32568                     }
32569
32570                     if (isBuilding) {
32571                         // don't transfer building-related tags
32572                         if (buildingKeysToRetain.indexOf(key) !== -1 ||
32573                             key.match(/^building:.{1,}/) ||
32574                             key.match(/^roof:.{1,}/)) continue;
32575                     }
32576
32577                     // copy the tag from the area to the point
32578                     pointTags[key] = areaTags[key];
32579
32580                     // leave addresses and some other tags so they're on both features
32581                     if (keysToCopyAndRetain.indexOf(key) !== -1 || key.match(/^addr:.{1,}/)) {
32582                         continue;
32583                     }
32584
32585                     // remove the tag from the area
32586                     delete areaTags[key];
32587                 }
32588
32589                 if (!isBuilding) {
32590                     // ensure that the area keeps the area geometry
32591                     areaTags.area = 'yes';
32592                 }
32593
32594                 var replacement = osmNode({ loc: centroid, tags: pointTags });
32595                 graph = graph.replace(replacement);
32596
32597                 extractedNodeID = replacement.id;
32598
32599                 return graph.replace(entity.update({tags: areaTags}));
32600             }
32601
32602             action.getExtractedNodeID = function() {
32603                 return extractedNodeID;
32604             };
32605
32606             action.disabled = function(graph) {
32607                 var entity = graph.entity(entityID);
32608
32609                 if (entity.type === 'node') {
32610                     var parentRels = graph.parentRelations(entity);
32611                     for (var i = 0; i < parentRels.length; i++) {
32612                         var relation = parentRels[i];
32613                         if (!relation.hasFromViaTo()) continue;
32614
32615                         for (var j = 0; j < relation.members.length; j++) {
32616                             var m = relation.members[j];
32617                             if (m.id === entityID && (m.role === 'via' || m.role === 'location_hint')) {
32618                                 return 'restriction';
32619                             }
32620                         }
32621                     }
32622                 }
32623
32624                 return false;
32625             };
32626
32627
32628             return action;
32629         }
32630
32631         // Join ways at the end node they share.
32632         //
32633         // This is the inverse of `iD.actionSplit`.
32634         //
32635         // Reference:
32636         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
32637         //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
32638         //
32639         function actionJoin(ids) {
32640
32641             function groupEntitiesByGeometry(graph) {
32642                 var entities = ids.map(function(id) { return graph.entity(id); });
32643                 return Object.assign(
32644                     { line: [] },
32645                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32646                 );
32647             }
32648
32649
32650             var action = function(graph) {
32651                 var ways = ids.map(graph.entity, graph);
32652                 var survivorID = ways[0].id;
32653
32654                 // if any of the ways are sided (e.g. coastline, cliff, kerb)
32655                 // sort them first so they establish the overall order - #6033
32656                 ways.sort(function(a, b) {
32657                     var aSided = a.isSided();
32658                     var bSided = b.isSided();
32659                     return (aSided && !bSided) ? -1
32660                         : (bSided && !aSided) ? 1
32661                         : 0;
32662                 });
32663
32664                 // Prefer to keep an existing way.
32665                 for (var i = 0; i < ways.length; i++) {
32666                     if (!ways[i].isNew()) {
32667                         survivorID = ways[i].id;
32668                         break;
32669                     }
32670                 }
32671
32672                 var sequences = osmJoinWays(ways, graph);
32673                 var joined = sequences[0];
32674
32675                 // We might need to reverse some of these ways before joining them.  #4688
32676                 // `joined.actions` property will contain any actions we need to apply.
32677                 graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
32678
32679                 var survivor = graph.entity(survivorID);
32680                 survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
32681                 graph = graph.replace(survivor);
32682
32683                 joined.forEach(function(way) {
32684                     if (way.id === survivorID) return;
32685
32686                     graph.parentRelations(way).forEach(function(parent) {
32687                         graph = graph.replace(parent.replaceMember(way, survivor));
32688                     });
32689
32690                     survivor = survivor.mergeTags(way.tags);
32691
32692                     graph = graph.replace(survivor);
32693                     graph = actionDeleteWay(way.id)(graph);
32694                 });
32695
32696                 return graph;
32697             };
32698
32699
32700             action.disabled = function(graph) {
32701                 var geometries = groupEntitiesByGeometry(graph);
32702                 if (ids.length < 2 || ids.length !== geometries.line.length) {
32703                     return 'not_eligible';
32704                 }
32705
32706                 var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
32707                 if (joined.length > 1) {
32708                     return 'not_adjacent';
32709                 }
32710
32711                 // Loop through all combinations of path-pairs
32712                 // to check potential intersections between all pairs
32713                 for (var i = 0; i < ids.length - 1; i++) {
32714                     for (var j = i + 1; j < ids.length; j++) {
32715                         var path1 = graph.childNodes(graph.entity(ids[i]))
32716                             .map(function(e) { return e.loc; });
32717                         var path2 = graph.childNodes(graph.entity(ids[j]))
32718                             .map(function(e) { return e.loc; });
32719                         var intersections = geoPathIntersections(path1, path2);
32720
32721                         // Check if intersections are just nodes lying on top of
32722                         // each other/the line, as opposed to crossing it
32723                         var common = utilArrayIntersection(
32724                             joined[0].nodes.map(function(n) { return n.loc.toString(); }),
32725                             intersections.map(function(n) { return n.toString(); })
32726                         );
32727                         if (common.length !== intersections.length) {
32728                             return 'paths_intersect';
32729                         }
32730                     }
32731                 }
32732
32733                 var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
32734                 var relation;
32735                 var tags = {};
32736                 var conflicting = false;
32737
32738                 joined[0].forEach(function(way) {
32739                     var parents = graph.parentRelations(way);
32740                     parents.forEach(function(parent) {
32741                         if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; })) {
32742                             relation = parent;
32743                         }
32744                     });
32745
32746                     for (var k in way.tags) {
32747                         if (!(k in tags)) {
32748                             tags[k] = way.tags[k];
32749                         } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
32750                             conflicting = true;
32751                         }
32752                     }
32753                 });
32754
32755                 if (relation) {
32756                     return 'restriction';
32757                 }
32758
32759                 if (conflicting) {
32760                     return 'conflicting_tags';
32761                 }
32762             };
32763
32764
32765             return action;
32766         }
32767
32768         function actionMerge(ids) {
32769
32770             function groupEntitiesByGeometry(graph) {
32771                 var entities = ids.map(function(id) { return graph.entity(id); });
32772                 return Object.assign(
32773                     { point: [], area: [], line: [], relation: [] },
32774                     utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
32775                 );
32776             }
32777
32778
32779             var action = function(graph) {
32780                 var geometries = groupEntitiesByGeometry(graph);
32781                 var target = geometries.area[0] || geometries.line[0];
32782                 var points = geometries.point;
32783
32784                 points.forEach(function(point) {
32785                     target = target.mergeTags(point.tags);
32786                     graph = graph.replace(target);
32787
32788                     graph.parentRelations(point).forEach(function(parent) {
32789                         graph = graph.replace(parent.replaceMember(point, target));
32790                     });
32791
32792                     var nodes = utilArrayUniq(graph.childNodes(target));
32793                     var removeNode = point;
32794
32795                     for (var i = 0; i < nodes.length; i++) {
32796                         var node = nodes[i];
32797                         if (graph.parentWays(node).length > 1 ||
32798                             graph.parentRelations(node).length ||
32799                             node.hasInterestingTags()) {
32800                             continue;
32801                         }
32802
32803                         // Found an uninteresting child node on the target way.
32804                         // Move orig point into its place to preserve point's history. #3683
32805                         graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
32806                         target = target.replaceNode(node.id, point.id);
32807                         graph = graph.replace(target);
32808                         removeNode = node;
32809                         break;
32810                     }
32811
32812                     graph = graph.remove(removeNode);
32813                 });
32814
32815                 return graph;
32816             };
32817
32818
32819             action.disabled = function(graph) {
32820                 var geometries = groupEntitiesByGeometry(graph);
32821                 if (geometries.point.length === 0 ||
32822                     (geometries.area.length + geometries.line.length) !== 1 ||
32823                     geometries.relation.length !== 0) {
32824                     return 'not_eligible';
32825                 }
32826             };
32827
32828
32829             return action;
32830         }
32831
32832         // `actionMergeNodes` is just a combination of:
32833         //
32834         // 1. move all the nodes to a common location
32835         // 2. `actionConnect` them
32836
32837         function actionMergeNodes(nodeIDs, loc) {
32838
32839             // If there is a single "interesting" node, use that as the location.
32840             // Otherwise return the average location of all the nodes.
32841             function chooseLoc(graph) {
32842                 if (!nodeIDs.length) return null;
32843                 var sum = [0,0];
32844                 var interestingCount = 0;
32845                 var interestingLoc;
32846
32847                 for (var i = 0; i < nodeIDs.length; i++) {
32848                     var node = graph.entity(nodeIDs[i]);
32849                     if (node.hasInterestingTags()) {
32850                         interestingLoc = (++interestingCount === 1) ? node.loc : null;
32851                     }
32852                     sum = geoVecAdd(sum, node.loc);
32853                 }
32854
32855                 return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
32856             }
32857
32858
32859             var action = function(graph) {
32860                 if (nodeIDs.length < 2) return graph;
32861                 var toLoc = loc;
32862                 if (!toLoc) {
32863                     toLoc = chooseLoc(graph);
32864                 }
32865
32866                 for (var i = 0; i < nodeIDs.length; i++) {
32867                     var node = graph.entity(nodeIDs[i]);
32868                     if (node.loc !== toLoc) {
32869                         graph = graph.replace(node.move(toLoc));
32870                     }
32871                 }
32872
32873                 return actionConnect(nodeIDs)(graph);
32874             };
32875
32876
32877             action.disabled = function(graph) {
32878                 if (nodeIDs.length < 2) return 'not_eligible';
32879
32880                 for (var i = 0; i < nodeIDs.length; i++) {
32881                     var entity = graph.entity(nodeIDs[i]);
32882                     if (entity.type !== 'node') return 'not_eligible';
32883                 }
32884
32885                 return actionConnect(nodeIDs).disabled(graph);
32886             };
32887
32888             return action;
32889         }
32890
32891         function osmChangeset() {
32892             if (!(this instanceof osmChangeset)) {
32893                 return (new osmChangeset()).initialize(arguments);
32894             } else if (arguments.length) {
32895                 this.initialize(arguments);
32896             }
32897         }
32898
32899
32900         osmEntity.changeset = osmChangeset;
32901
32902         osmChangeset.prototype = Object.create(osmEntity.prototype);
32903
32904         Object.assign(osmChangeset.prototype, {
32905
32906             type: 'changeset',
32907
32908
32909             extent: function() {
32910                 return new geoExtent();
32911             },
32912
32913
32914             geometry: function() {
32915                 return 'changeset';
32916             },
32917
32918
32919             asJXON: function() {
32920                 return {
32921                     osm: {
32922                         changeset: {
32923                             tag: Object.keys(this.tags).map(function(k) {
32924                                 return { '@k': k, '@v': this.tags[k] };
32925                             }, this),
32926                             '@version': 0.6,
32927                             '@generator': 'iD'
32928                         }
32929                     }
32930                 };
32931             },
32932
32933
32934             // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
32935             // XML. Returns a string.
32936             osmChangeJXON: function(changes) {
32937                 var changeset_id = this.id;
32938
32939                 function nest(x, order) {
32940                     var groups = {};
32941                     for (var i = 0; i < x.length; i++) {
32942                         var tagName = Object.keys(x[i])[0];
32943                         if (!groups[tagName]) groups[tagName] = [];
32944                         groups[tagName].push(x[i][tagName]);
32945                     }
32946                     var ordered = {};
32947                     order.forEach(function(o) {
32948                         if (groups[o]) ordered[o] = groups[o];
32949                     });
32950                     return ordered;
32951                 }
32952
32953
32954                 // sort relations in a changeset by dependencies
32955                 function sort(changes) {
32956
32957                     // find a referenced relation in the current changeset
32958                     function resolve(item) {
32959                         return relations.find(function(relation) {
32960                             return item.keyAttributes.type === 'relation'
32961                                 && item.keyAttributes.ref === relation['@id'];
32962                         });
32963                     }
32964
32965                     // a new item is an item that has not been already processed
32966                     function isNew(item) {
32967                         return !sorted[ item['@id'] ] && !processing.find(function(proc) {
32968                             return proc['@id'] === item['@id'];
32969                         });
32970                     }
32971
32972                     var processing = [];
32973                     var sorted = {};
32974                     var relations = changes.relation;
32975
32976                     if (!relations) return changes;
32977
32978                     for (var i = 0; i < relations.length; i++) {
32979                         var relation = relations[i];
32980
32981                         // skip relation if already sorted
32982                         if (!sorted[relation['@id']]) {
32983                             processing.push(relation);
32984                         }
32985
32986                         while (processing.length > 0) {
32987                             var next = processing[0],
32988                             deps = next.member.map(resolve).filter(Boolean).filter(isNew);
32989                             if (deps.length === 0) {
32990                                 sorted[next['@id']] = next;
32991                                 processing.shift();
32992                             } else {
32993                                 processing = deps.concat(processing);
32994                             }
32995                         }
32996                     }
32997
32998                     changes.relation = Object.values(sorted);
32999                     return changes;
33000                 }
33001
33002                 function rep(entity) {
33003                     return entity.asJXON(changeset_id);
33004                 }
33005
33006                 return {
33007                     osmChange: {
33008                         '@version': 0.6,
33009                         '@generator': 'iD',
33010                         'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
33011                         'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
33012                         'delete': Object.assign(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
33013                     }
33014                 };
33015             },
33016
33017
33018             asGeoJSON: function() {
33019                 return {};
33020             }
33021
33022         });
33023
33024         function osmNote() {
33025             if (!(this instanceof osmNote)) {
33026                 return (new osmNote()).initialize(arguments);
33027             } else if (arguments.length) {
33028                 this.initialize(arguments);
33029             }
33030         }
33031
33032
33033         osmNote.id = function() {
33034             return osmNote.id.next--;
33035         };
33036
33037
33038         osmNote.id.next = -1;
33039
33040
33041         Object.assign(osmNote.prototype, {
33042
33043             type: 'note',
33044
33045             initialize: function(sources) {
33046                 for (var i = 0; i < sources.length; ++i) {
33047                     var source = sources[i];
33048                     for (var prop in source) {
33049                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33050                             if (source[prop] === undefined) {
33051                                 delete this[prop];
33052                             } else {
33053                                 this[prop] = source[prop];
33054                             }
33055                         }
33056                     }
33057                 }
33058
33059                 if (!this.id) {
33060                     this.id = osmNote.id() + '';  // as string
33061                 }
33062
33063                 return this;
33064             },
33065
33066             extent: function() {
33067                 return new geoExtent(this.loc);
33068             },
33069
33070             update: function(attrs) {
33071                 return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
33072             },
33073
33074             isNew: function() {
33075                 return this.id < 0;
33076             },
33077
33078             move: function(loc) {
33079                 return this.update({ loc: loc });
33080             }
33081
33082         });
33083
33084         function osmRelation() {
33085             if (!(this instanceof osmRelation)) {
33086                 return (new osmRelation()).initialize(arguments);
33087             } else if (arguments.length) {
33088                 this.initialize(arguments);
33089             }
33090         }
33091
33092
33093         osmEntity.relation = osmRelation;
33094
33095         osmRelation.prototype = Object.create(osmEntity.prototype);
33096
33097
33098         osmRelation.creationOrder = function(a, b) {
33099             var aId = parseInt(osmEntity.id.toOSM(a.id), 10);
33100             var bId = parseInt(osmEntity.id.toOSM(b.id), 10);
33101
33102             if (aId < 0 || bId < 0) return aId - bId;
33103             return bId - aId;
33104         };
33105
33106
33107         Object.assign(osmRelation.prototype, {
33108             type: 'relation',
33109             members: [],
33110
33111
33112             copy: function(resolver, copies) {
33113                 if (copies[this.id]) return copies[this.id];
33114
33115                 var copy = osmEntity.prototype.copy.call(this, resolver, copies);
33116
33117                 var members = this.members.map(function(member) {
33118                     return Object.assign({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
33119                 });
33120
33121                 copy = copy.update({members: members});
33122                 copies[this.id] = copy;
33123
33124                 return copy;
33125             },
33126
33127
33128             extent: function(resolver, memo) {
33129                 return resolver.transient(this, 'extent', function() {
33130                     if (memo && memo[this.id]) return geoExtent();
33131                     memo = memo || {};
33132                     memo[this.id] = true;
33133
33134                     var extent = geoExtent();
33135                     for (var i = 0; i < this.members.length; i++) {
33136                         var member = resolver.hasEntity(this.members[i].id);
33137                         if (member) {
33138                             extent._extend(member.extent(resolver, memo));
33139                         }
33140                     }
33141                     return extent;
33142                 });
33143             },
33144
33145
33146             geometry: function(graph) {
33147                 return graph.transient(this, 'geometry', function() {
33148                     return this.isMultipolygon() ? 'area' : 'relation';
33149                 });
33150             },
33151
33152
33153             isDegenerate: function() {
33154                 return this.members.length === 0;
33155             },
33156
33157
33158             // Return an array of members, each extended with an 'index' property whose value
33159             // is the member index.
33160             indexedMembers: function() {
33161                 var result = new Array(this.members.length);
33162                 for (var i = 0; i < this.members.length; i++) {
33163                     result[i] = Object.assign({}, this.members[i], {index: i});
33164                 }
33165                 return result;
33166             },
33167
33168
33169             // Return the first member with the given role. A copy of the member object
33170             // is returned, extended with an 'index' property whose value is the member index.
33171             memberByRole: function(role) {
33172                 for (var i = 0; i < this.members.length; i++) {
33173                     if (this.members[i].role === role) {
33174                         return Object.assign({}, this.members[i], {index: i});
33175                     }
33176                 }
33177             },
33178
33179             // Same as memberByRole, but returns all members with the given role
33180             membersByRole: function(role) {
33181                 var result = [];
33182                 for (var i = 0; i < this.members.length; i++) {
33183                     if (this.members[i].role === role) {
33184                         result.push(Object.assign({}, this.members[i], {index: i}));
33185                     }
33186                 }
33187                 return result;
33188             },
33189
33190             // Return the first member with the given id. A copy of the member object
33191             // is returned, extended with an 'index' property whose value is the member index.
33192             memberById: function(id) {
33193                 for (var i = 0; i < this.members.length; i++) {
33194                     if (this.members[i].id === id) {
33195                         return Object.assign({}, this.members[i], {index: i});
33196                     }
33197                 }
33198             },
33199
33200
33201             // Return the first member with the given id and role. A copy of the member object
33202             // is returned, extended with an 'index' property whose value is the member index.
33203             memberByIdAndRole: function(id, role) {
33204                 for (var i = 0; i < this.members.length; i++) {
33205                     if (this.members[i].id === id && this.members[i].role === role) {
33206                         return Object.assign({}, this.members[i], {index: i});
33207                     }
33208                 }
33209             },
33210
33211
33212             addMember: function(member, index) {
33213                 var members = this.members.slice();
33214                 members.splice(index === undefined ? members.length : index, 0, member);
33215                 return this.update({members: members});
33216             },
33217
33218
33219             updateMember: function(member, index) {
33220                 var members = this.members.slice();
33221                 members.splice(index, 1, Object.assign({}, members[index], member));
33222                 return this.update({members: members});
33223             },
33224
33225
33226             removeMember: function(index) {
33227                 var members = this.members.slice();
33228                 members.splice(index, 1);
33229                 return this.update({members: members});
33230             },
33231
33232
33233             removeMembersWithID: function(id) {
33234                 var members = this.members.filter(function(m) { return m.id !== id; });
33235                 return this.update({members: members});
33236             },
33237
33238             moveMember: function(fromIndex, toIndex) {
33239                 var members = this.members.slice();
33240                 members.splice(toIndex, 0, members.splice(fromIndex, 1)[0]);
33241                 return this.update({members: members});
33242             },
33243
33244
33245             // Wherever a member appears with id `needle.id`, replace it with a member
33246             // with id `replacement.id`, type `replacement.type`, and the original role,
33247             // By default, adding a duplicate member (by id and role) is prevented.
33248             // Return an updated relation.
33249             replaceMember: function(needle, replacement, keepDuplicates) {
33250                 if (!this.memberById(needle.id)) return this;
33251
33252                 var members = [];
33253
33254                 for (var i = 0; i < this.members.length; i++) {
33255                     var member = this.members[i];
33256                     if (member.id !== needle.id) {
33257                         members.push(member);
33258                     } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
33259                         members.push({ id: replacement.id, type: replacement.type, role: member.role });
33260                     }
33261                 }
33262
33263                 return this.update({ members: members });
33264             },
33265
33266
33267             asJXON: function(changeset_id) {
33268                 var r = {
33269                     relation: {
33270                         '@id': this.osmId(),
33271                         '@version': this.version || 0,
33272                         member: this.members.map(function(member) {
33273                             return {
33274                                 keyAttributes: {
33275                                     type: member.type,
33276                                     role: member.role,
33277                                     ref: osmEntity.id.toOSM(member.id)
33278                                 }
33279                             };
33280                         }, this),
33281                         tag: Object.keys(this.tags).map(function(k) {
33282                             return { keyAttributes: { k: k, v: this.tags[k] } };
33283                         }, this)
33284                     }
33285                 };
33286                 if (changeset_id) {
33287                     r.relation['@changeset'] = changeset_id;
33288                 }
33289                 return r;
33290             },
33291
33292
33293             asGeoJSON: function(resolver) {
33294                 return resolver.transient(this, 'GeoJSON', function () {
33295                     if (this.isMultipolygon()) {
33296                         return {
33297                             type: 'MultiPolygon',
33298                             coordinates: this.multipolygon(resolver)
33299                         };
33300                     } else {
33301                         return {
33302                             type: 'FeatureCollection',
33303                             properties: this.tags,
33304                             features: this.members.map(function (member) {
33305                                 return Object.assign({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
33306                             })
33307                         };
33308                     }
33309                 });
33310             },
33311
33312
33313             area: function(resolver) {
33314                 return resolver.transient(this, 'area', function() {
33315                     return d3_geoArea(this.asGeoJSON(resolver));
33316                 });
33317             },
33318
33319
33320             isMultipolygon: function() {
33321                 return this.tags.type === 'multipolygon';
33322             },
33323
33324
33325             isComplete: function(resolver) {
33326                 for (var i = 0; i < this.members.length; i++) {
33327                     if (!resolver.hasEntity(this.members[i].id)) {
33328                         return false;
33329                     }
33330                 }
33331                 return true;
33332             },
33333
33334
33335             hasFromViaTo: function() {
33336                 return (
33337                     this.members.some(function(m) { return m.role === 'from'; }) &&
33338                     this.members.some(function(m) { return m.role === 'via'; }) &&
33339                     this.members.some(function(m) { return m.role === 'to'; })
33340                 );
33341             },
33342
33343
33344             isRestriction: function() {
33345                 return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
33346             },
33347
33348
33349             isValidRestriction: function() {
33350                 if (!this.isRestriction()) return false;
33351
33352                 var froms = this.members.filter(function(m) { return m.role === 'from'; });
33353                 var vias = this.members.filter(function(m) { return m.role === 'via'; });
33354                 var tos = this.members.filter(function(m) { return m.role === 'to'; });
33355
33356                 if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
33357                 if (froms.some(function(m) { return m.type !== 'way'; })) return false;
33358
33359                 if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
33360                 if (tos.some(function(m) { return m.type !== 'way'; })) return false;
33361
33362                 if (vias.length === 0) return false;
33363                 if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
33364
33365                 return true;
33366             },
33367
33368
33369             // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
33370             // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
33371             //
33372             // This corresponds to the structure needed for rendering a multipolygon path using a
33373             // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
33374             //
33375             // In the case of invalid geometries, this function will still return a result which
33376             // includes the nodes of all way members, but some Nds may be unclosed and some inner
33377             // rings not matched with the intended outer ring.
33378             //
33379             multipolygon: function(resolver) {
33380                 var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
33381                 var inners = this.members.filter(function(m) { return 'inner' === m.role; });
33382
33383                 outers = osmJoinWays(outers, resolver);
33384                 inners = osmJoinWays(inners, resolver);
33385
33386                 outers = outers.map(function(outer) {
33387                     return outer.nodes.map(function(node) { return node.loc; });
33388                 });
33389                 inners = inners.map(function(inner) {
33390                     return inner.nodes.map(function(node) { return node.loc; });
33391                 });
33392
33393                 var result = outers.map(function(o) {
33394                     // Heuristic for detecting counterclockwise winding order. Assumes
33395                     // that OpenStreetMap polygons are not hemisphere-spanning.
33396                     return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
33397                 });
33398
33399                 function findOuter(inner) {
33400                     var o, outer;
33401
33402                     for (o = 0; o < outers.length; o++) {
33403                         outer = outers[o];
33404                         if (geoPolygonContainsPolygon(outer, inner))
33405                             return o;
33406                     }
33407
33408                     for (o = 0; o < outers.length; o++) {
33409                         outer = outers[o];
33410                         if (geoPolygonIntersectsPolygon(outer, inner, false))
33411                             return o;
33412                     }
33413                 }
33414
33415                 for (var i = 0; i < inners.length; i++) {
33416                     var inner = inners[i];
33417
33418                     if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
33419                         inner = inner.reverse();
33420                     }
33421
33422                     var o = findOuter(inners[i]);
33423                     if (o !== undefined) {
33424                         result[o].push(inners[i]);
33425                     } else {
33426                         result.push([inners[i]]); // Invalid geometry
33427                     }
33428                 }
33429
33430                 return result;
33431             }
33432         });
33433
33434         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:{}}};
33435
33436         function qaError() {
33437             if (!(this instanceof qaError)) {
33438                 return (new qaError()).initialize(arguments);
33439             } else if (arguments.length) {
33440                 this.initialize(arguments);
33441             }
33442         }
33443
33444         // Generic handling for services without nice IDs
33445         qaError.id = function() {
33446             return qaError.id.next--;
33447         };
33448
33449         qaError.id.next = -1;
33450
33451         Object.assign(qaError.prototype, {
33452             type: 'qaError',
33453
33454             // All errors need a position
33455             loc: [0, 0],
33456
33457             // These should be passed in, used to retrieve from qa_errors.json
33458             service: '',
33459             error_type: '',
33460
33461             initialize: function(sources) {
33462                 for (var i = 0; i < sources.length; ++i) {
33463                     var source = sources[i];
33464                     for (var prop in source) {
33465                         if (Object.prototype.hasOwnProperty.call(source, prop)) {
33466                             if (source[prop] === undefined) {
33467                                 delete this[prop];
33468                             } else {
33469                                 this[prop] = source[prop];
33470                             }
33471                         }
33472                     }
33473                 }
33474
33475                 // Extract common error information from data
33476                 if (this.service && this.error_type) {
33477                     var serviceInfo = services[this.service];
33478
33479                     if (serviceInfo) {
33480                         var errInfo = serviceInfo.errorTypes[this.error_type];
33481
33482                         if (errInfo) {
33483                             this.icon = errInfo.icon;
33484                             this.category = errInfo.category;
33485                         }
33486                     }
33487                 }
33488
33489                 // All errors must have an ID for selection
33490                 if (!this.id) {
33491                     this.id = qaError.id() + '';  // as string
33492                 }
33493
33494                 return this;
33495             },
33496
33497             update: function(attrs) {
33498                 return qaError(this, attrs); // {v: 1 + (this.v || 0)}
33499             }
33500         });
33501
33502         // Split a way at the given node.
33503         //
33504         // Optionally, split only the given ways, if multiple ways share
33505         // the given node.
33506         //
33507         // This is the inverse of `iD.actionJoin`.
33508         //
33509         // For testing convenience, accepts an ID to assign to the new way.
33510         // Normally, this will be undefined and the way will automatically
33511         // be assigned a new ID.
33512         //
33513         // Reference:
33514         //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
33515         //
33516         function actionSplit(nodeId, newWayIds) {
33517             var _wayIDs;
33518
33519             // If the way is closed, we need to search for a partner node
33520             // to split the way at.
33521             //
33522             // The following looks for a node that is both far away from
33523             // the initial node in terms of way segment length and nearby
33524             // in terms of beeline-distance. This assures that areas get
33525             // split on the most "natural" points (independent of the number
33526             // of nodes).
33527             // For example: bone-shaped areas get split across their waist
33528             // line, circles across the diameter.
33529             function splitArea(nodes, idxA, graph) {
33530                 var lengths = new Array(nodes.length);
33531                 var length;
33532                 var i;
33533                 var best = 0;
33534                 var idxB;
33535
33536                 function wrap(index) {
33537                     return utilWrap(index, nodes.length);
33538                 }
33539
33540                 function dist(nA, nB) {
33541                     var locA = graph.entity(nA).loc;
33542                     var locB = graph.entity(nB).loc;
33543                     var epsilon = 1e-6;
33544                     return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
33545                 }
33546
33547                 // calculate lengths
33548                 length = 0;
33549                 for (i = wrap(idxA + 1); i !== idxA; i = wrap(i + 1)) {
33550                     length += dist(nodes[i], nodes[wrap(i - 1)]);
33551                     lengths[i] = length;
33552                 }
33553
33554                 length = 0;
33555                 for (i = wrap(idxA - 1); i !== idxA; i = wrap(i - 1)) {
33556                     length += dist(nodes[i], nodes[wrap(i + 1)]);
33557                     if (length < lengths[i]) {
33558                         lengths[i] = length;
33559                     }
33560                 }
33561
33562                 // determine best opposite node to split
33563                 for (i = 0; i < nodes.length; i++) {
33564                     var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
33565                     if (cost > best) {
33566                         idxB = i;
33567                         best = cost;
33568                     }
33569                 }
33570
33571                 return idxB;
33572             }
33573
33574
33575             function split(graph, wayA, newWayId) {
33576                 var wayB = osmWay({ id: newWayId, tags: wayA.tags });   // `wayB` is the NEW way
33577                 var origNodes = wayA.nodes.slice();
33578                 var nodesA;
33579                 var nodesB;
33580                 var isArea = wayA.isArea();
33581                 var isOuter = osmIsOldMultipolygonOuterMember(wayA, graph);
33582
33583                 if (wayA.isClosed()) {
33584                     var nodes = wayA.nodes.slice(0, -1);
33585                     var idxA = nodes.indexOf(nodeId);
33586                     var idxB = splitArea(nodes, idxA, graph);
33587
33588                     if (idxB < idxA) {
33589                         nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
33590                         nodesB = nodes.slice(idxB, idxA + 1);
33591                     } else {
33592                         nodesA = nodes.slice(idxA, idxB + 1);
33593                         nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
33594                     }
33595                 } else {
33596                     var idx = wayA.nodes.indexOf(nodeId, 1);
33597                     nodesA = wayA.nodes.slice(0, idx + 1);
33598                     nodesB = wayA.nodes.slice(idx);
33599                 }
33600
33601                 wayA = wayA.update({ nodes: nodesA });
33602                 wayB = wayB.update({ nodes: nodesB });
33603
33604                 graph = graph.replace(wayA);
33605                 graph = graph.replace(wayB);
33606
33607                 graph.parentRelations(wayA).forEach(function(relation) {
33608                     var member;
33609
33610                     // Turn restrictions - make sure:
33611                     // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
33612                     //    (whichever one is connected to the VIA node/ways)
33613                     // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
33614                     if (relation.hasFromViaTo()) {
33615                         var f = relation.memberByRole('from');
33616                         var v = relation.membersByRole('via');
33617                         var t = relation.memberByRole('to');
33618                         var i;
33619
33620                         // 1. split a FROM/TO
33621                         if (f.id === wayA.id || t.id === wayA.id) {
33622                             var keepB = false;
33623                             if (v.length === 1 && v[0].type === 'node') {   // check via node
33624                                 keepB = wayB.contains(v[0].id);
33625                             } else {                                        // check via way(s)
33626                                 for (i = 0; i < v.length; i++) {
33627                                     if (v[i].type === 'way') {
33628                                         var wayVia = graph.hasEntity(v[i].id);
33629                                         if (wayVia && utilArrayIntersection(wayB.nodes, wayVia.nodes).length) {
33630                                             keepB = true;
33631                                             break;
33632                                         }
33633                                     }
33634                                 }
33635                             }
33636
33637                             if (keepB) {
33638                                 relation = relation.replaceMember(wayA, wayB);
33639                                 graph = graph.replace(relation);
33640                             }
33641
33642                         // 2. split a VIA
33643                         } else {
33644                             for (i = 0; i < v.length; i++) {
33645                                 if (v[i].type === 'way' && v[i].id === wayA.id) {
33646                                     member = {
33647                                         id: wayB.id,
33648                                         type: 'way',
33649                                         role: 'via'
33650                                     };
33651                                     graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
33652                                     break;
33653                                 }
33654                             }
33655                         }
33656
33657                     // All other relations (Routes, Multipolygons, etc):
33658                     // 1. Both `wayA` and `wayB` remain in the relation
33659                     // 2. But must be inserted as a pair (see `actionAddMember` for details)
33660                     } else {
33661                         if (relation === isOuter) {
33662                             graph = graph.replace(relation.mergeTags(wayA.tags));
33663                             graph = graph.replace(wayA.update({ tags: {} }));
33664                             graph = graph.replace(wayB.update({ tags: {} }));
33665                         }
33666
33667                         member = {
33668                             id: wayB.id,
33669                             type: 'way',
33670                             role: relation.memberById(wayA.id).role
33671                         };
33672
33673                         var insertPair = {
33674                             originalID: wayA.id,
33675                             insertedID: wayB.id,
33676                             nodes: origNodes
33677                         };
33678
33679                         graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
33680                     }
33681                 });
33682
33683                 if (!isOuter && isArea) {
33684                     var multipolygon = osmRelation({
33685                         tags: Object.assign({}, wayA.tags, { type: 'multipolygon' }),
33686                         members: [
33687                             { id: wayA.id, role: 'outer', type: 'way' },
33688                             { id: wayB.id, role: 'outer', type: 'way' }
33689                         ]
33690                     });
33691
33692                     graph = graph.replace(multipolygon);
33693                     graph = graph.replace(wayA.update({ tags: {} }));
33694                     graph = graph.replace(wayB.update({ tags: {} }));
33695                 }
33696
33697                 return graph;
33698             }
33699
33700
33701             var action = function(graph) {
33702                 var candidates = action.ways(graph);
33703                 for (var i = 0; i < candidates.length; i++) {
33704                     graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
33705                 }
33706                 return graph;
33707             };
33708
33709
33710             action.ways = function(graph) {
33711                 var node = graph.entity(nodeId);
33712                 var parents = graph.parentWays(node);
33713                 var hasLines = parents.some(function(parent) {
33714                     return parent.geometry(graph) === 'line';
33715                 });
33716
33717                 return parents.filter(function(parent) {
33718                     if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
33719                         return false;
33720
33721                     if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
33722                         return false;
33723
33724                     if (parent.isClosed()) {
33725                         return true;
33726                     }
33727
33728                     for (var i = 1; i < parent.nodes.length - 1; i++) {
33729                         if (parent.nodes[i] === nodeId) {
33730                             return true;
33731                         }
33732                     }
33733
33734                     return false;
33735                 });
33736             };
33737
33738
33739             action.disabled = function(graph) {
33740                 var candidates = action.ways(graph);
33741                 if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length)) {
33742                     return 'not_eligible';
33743                 }
33744             };
33745
33746
33747             action.limitWays = function(val) {
33748                 if (!arguments.length) return _wayIDs;
33749                 _wayIDs = val;
33750                 return action;
33751             };
33752
33753
33754             return action;
33755         }
33756
33757         function coreGraph(other, mutable) {
33758             if (!(this instanceof coreGraph)) return new coreGraph(other, mutable);
33759
33760             if (other instanceof coreGraph) {
33761                 var base = other.base();
33762                 this.entities = Object.assign(Object.create(base.entities), other.entities);
33763                 this._parentWays = Object.assign(Object.create(base.parentWays), other._parentWays);
33764                 this._parentRels = Object.assign(Object.create(base.parentRels), other._parentRels);
33765
33766             } else {
33767                 this.entities = Object.create({});
33768                 this._parentWays = Object.create({});
33769                 this._parentRels = Object.create({});
33770                 this.rebase(other || [], [this]);
33771             }
33772
33773             this.transients = {};
33774             this._childNodes = {};
33775             this.frozen = !mutable;
33776         }
33777
33778
33779         coreGraph.prototype = {
33780
33781             hasEntity: function(id) {
33782                 return this.entities[id];
33783             },
33784
33785
33786             entity: function(id) {
33787                 var entity = this.entities[id];
33788
33789                 //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
33790                 if (!entity) {
33791                     entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
33792                 }
33793
33794                 if (!entity) {
33795                     throw new Error('entity ' + id + ' not found');
33796                 }
33797                 return entity;
33798             },
33799
33800
33801             transient: function(entity, key, fn) {
33802                 var id = entity.id;
33803                 var transients = this.transients[id] || (this.transients[id] = {});
33804
33805                 if (transients[key] !== undefined) {
33806                     return transients[key];
33807                 }
33808
33809                 transients[key] = fn.call(entity);
33810
33811                 return transients[key];
33812             },
33813
33814
33815             parentWays: function(entity) {
33816                 var parents = this._parentWays[entity.id];
33817                 var result = [];
33818                 if (parents) {
33819                     parents.forEach(function(id) {
33820                         result.push(this.entity(id));
33821                     }, this);
33822                 }
33823                 return result;
33824             },
33825
33826
33827             isPoi: function(entity) {
33828                 var parents = this._parentWays[entity.id];
33829                 return !parents || parents.size === 0;
33830             },
33831
33832
33833             isShared: function(entity) {
33834                 var parents = this._parentWays[entity.id];
33835                 return parents && parents.size > 1;
33836             },
33837
33838
33839             parentRelations: function(entity) {
33840                 var parents = this._parentRels[entity.id];
33841                 var result = [];
33842                 if (parents) {
33843                     parents.forEach(function(id) {
33844                         result.push(this.entity(id));
33845                     }, this);
33846                 }
33847                 return result;
33848             },
33849
33850             parentMultipolygons: function(entity) {
33851                 return this.parentRelations(entity).filter(function(relation) {
33852                     return relation.isMultipolygon();
33853                 });
33854             },
33855
33856
33857             childNodes: function(entity) {
33858                 if (this._childNodes[entity.id]) return this._childNodes[entity.id];
33859                 if (!entity.nodes) return [];
33860
33861                 var nodes = [];
33862                 for (var i = 0; i < entity.nodes.length; i++) {
33863                     nodes[i] = this.entity(entity.nodes[i]);
33864                 }
33865
33866                 this._childNodes[entity.id] = nodes;
33867                 return this._childNodes[entity.id];
33868             },
33869
33870
33871             base: function() {
33872                 return {
33873                     'entities': Object.getPrototypeOf(this.entities),
33874                     'parentWays': Object.getPrototypeOf(this._parentWays),
33875                     'parentRels': Object.getPrototypeOf(this._parentRels)
33876                 };
33877             },
33878
33879
33880             // Unlike other graph methods, rebase mutates in place. This is because it
33881             // is used only during the history operation that merges newly downloaded
33882             // data into each state. To external consumers, it should appear as if the
33883             // graph always contained the newly downloaded data.
33884             rebase: function(entities, stack, force) {
33885                 var base = this.base();
33886                 var i, j, k, id;
33887
33888                 for (i = 0; i < entities.length; i++) {
33889                     var entity = entities[i];
33890
33891                     if (!entity.visible || (!force && base.entities[entity.id]))
33892                         continue;
33893
33894                     // Merging data into the base graph
33895                     base.entities[entity.id] = entity;
33896                     this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
33897
33898                     // Restore provisionally-deleted nodes that are discovered to have an extant parent
33899                     if (entity.type === 'way') {
33900                         for (j = 0; j < entity.nodes.length; j++) {
33901                             id = entity.nodes[j];
33902                             for (k = 1; k < stack.length; k++) {
33903                                 var ents = stack[k].entities;
33904                                 if (ents.hasOwnProperty(id) && ents[id] === undefined) {
33905                                     delete ents[id];
33906                                 }
33907                             }
33908                         }
33909                     }
33910                 }
33911
33912                 for (i = 0; i < stack.length; i++) {
33913                     stack[i]._updateRebased();
33914                 }
33915             },
33916
33917
33918             _updateRebased: function() {
33919                 var base = this.base();
33920
33921                 Object.keys(this._parentWays).forEach(function(child) {
33922                     if (base.parentWays[child]) {
33923                         base.parentWays[child].forEach(function(id) {
33924                             if (!this.entities.hasOwnProperty(id)) {
33925                                 this._parentWays[child].add(id);
33926                             }
33927                         }, this);
33928                     }
33929                 }, this);
33930
33931                 Object.keys(this._parentRels).forEach(function(child) {
33932                     if (base.parentRels[child]) {
33933                         base.parentRels[child].forEach(function(id) {
33934                             if (!this.entities.hasOwnProperty(id)) {
33935                                 this._parentRels[child].add(id);
33936                             }
33937                         }, this);
33938                     }
33939                 }, this);
33940
33941                 this.transients = {};
33942
33943                 // this._childNodes is not updated, under the assumption that
33944                 // ways are always downloaded with their child nodes.
33945             },
33946
33947
33948             // Updates calculated properties (parentWays, parentRels) for the specified change
33949             _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
33950                 parentWays = parentWays || this._parentWays;
33951                 parentRels = parentRels || this._parentRels;
33952
33953                 var type = entity && entity.type || oldentity && oldentity.type;
33954                 var removed, added, i;
33955
33956                 if (type === 'way') {   // Update parentWays
33957                     if (oldentity && entity) {
33958                         removed = utilArrayDifference(oldentity.nodes, entity.nodes);
33959                         added = utilArrayDifference(entity.nodes, oldentity.nodes);
33960                     } else if (oldentity) {
33961                         removed = oldentity.nodes;
33962                         added = [];
33963                     } else if (entity) {
33964                         removed = [];
33965                         added = entity.nodes;
33966                     }
33967                     for (i = 0; i < removed.length; i++) {
33968                         // make a copy of prototype property, store as own property, and update..
33969                         parentWays[removed[i]] = new Set(parentWays[removed[i]]);
33970                         parentWays[removed[i]].delete(oldentity.id);
33971                     }
33972                     for (i = 0; i < added.length; i++) {
33973                         // make a copy of prototype property, store as own property, and update..
33974                         parentWays[added[i]] = new Set(parentWays[added[i]]);
33975                         parentWays[added[i]].add(entity.id);
33976                     }
33977
33978                 } else if (type === 'relation') {   // Update parentRels
33979                     if (oldentity && entity) {
33980                         removed = utilArrayDifference(oldentity.members, entity.members);
33981                         added = utilArrayDifference(entity.members, oldentity.members);
33982                     } else if (oldentity) {
33983                         removed = oldentity.members;
33984                         added = [];
33985                     } else if (entity) {
33986                         removed = [];
33987                         added = entity.members;
33988                     }
33989                     for (i = 0; i < removed.length; i++) {
33990                         // make a copy of prototype property, store as own property, and update..
33991                         parentRels[removed[i].id] = new Set(parentRels[removed[i].id]);
33992                         parentRels[removed[i].id].delete(oldentity.id);
33993                     }
33994                     for (i = 0; i < added.length; i++) {
33995                         // make a copy of prototype property, store as own property, and update..
33996                         parentRels[added[i].id] = new Set(parentRels[added[i].id]);
33997                         parentRels[added[i].id].add(entity.id);
33998                     }
33999                 }
34000             },
34001
34002
34003             replace: function(entity) {
34004                 if (this.entities[entity.id] === entity) return this;
34005
34006                 return this.update(function() {
34007                     this._updateCalculated(this.entities[entity.id], entity);
34008                     this.entities[entity.id] = entity;
34009                 });
34010             },
34011
34012
34013             remove: function(entity) {
34014                 return this.update(function() {
34015                     this._updateCalculated(entity, undefined);
34016                     this.entities[entity.id] = undefined;
34017                 });
34018             },
34019
34020
34021             revert: function(id) {
34022                 var baseEntity = this.base().entities[id];
34023                 var headEntity = this.entities[id];
34024                 if (headEntity === baseEntity) return this;
34025
34026                 return this.update(function() {
34027                     this._updateCalculated(headEntity, baseEntity);
34028                     delete this.entities[id];
34029                 });
34030             },
34031
34032
34033             update: function() {
34034                 var graph = this.frozen ? coreGraph(this, true) : this;
34035                 for (var i = 0; i < arguments.length; i++) {
34036                     arguments[i].call(graph, graph);
34037                 }
34038
34039                 if (this.frozen) graph.frozen = true;
34040
34041                 return graph;
34042             },
34043
34044
34045             // Obliterates any existing entities
34046             load: function(entities) {
34047                 var base = this.base();
34048                 this.entities = Object.create(base.entities);
34049
34050                 for (var i in entities) {
34051                     this.entities[i] = entities[i];
34052                     this._updateCalculated(base.entities[i], this.entities[i]);
34053                 }
34054
34055                 return this;
34056             }
34057         };
34058
34059         function osmTurn(turn) {
34060             if (!(this instanceof osmTurn)) {
34061                 return new osmTurn(turn);
34062             }
34063             Object.assign(this, turn);
34064         }
34065
34066
34067         function osmIntersection(graph, startVertexId, maxDistance) {
34068             maxDistance = maxDistance || 30;    // in meters
34069             var vgraph = coreGraph();           // virtual graph
34070             var i, j, k;
34071
34072
34073             function memberOfRestriction(entity) {
34074                 return graph.parentRelations(entity)
34075                     .some(function(r) { return r.isRestriction(); });
34076             }
34077
34078             function isRoad(way) {
34079                 if (way.isArea() || way.isDegenerate()) return false;
34080                 var roads = {
34081                     'motorway': true,
34082                     'motorway_link': true,
34083                     'trunk': true,
34084                     'trunk_link': true,
34085                     'primary': true,
34086                     'primary_link': true,
34087                     'secondary': true,
34088                     'secondary_link': true,
34089                     'tertiary': true,
34090                     'tertiary_link': true,
34091                     'residential': true,
34092                     'unclassified': true,
34093                     'living_street': true,
34094                     'service': true,
34095                     'road': true,
34096                     'track': true
34097                 };
34098                 return roads[way.tags.highway];
34099             }
34100
34101
34102             var startNode = graph.entity(startVertexId);
34103             var checkVertices = [startNode];
34104             var checkWays;
34105             var vertices = [];
34106             var vertexIds = [];
34107             var vertex;
34108             var ways = [];
34109             var wayIds = [];
34110             var way;
34111             var nodes = [];
34112             var node;
34113             var parents = [];
34114             var parent;
34115
34116             // `actions` will store whatever actions must be performed to satisfy
34117             // preconditions for adding a turn restriction to this intersection.
34118             //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
34119             //  - Reverse oneways so that they are drawn in the forward direction
34120             //  - Split ways on key vertices
34121             var actions = [];
34122
34123
34124             // STEP 1:  walk the graph outwards from starting vertex to search
34125             //  for more key vertices and ways to include in the intersection..
34126
34127             while (checkVertices.length) {
34128                 vertex = checkVertices.pop();
34129
34130                 // check this vertex for parent ways that are roads
34131                 checkWays = graph.parentWays(vertex);
34132                 var hasWays = false;
34133                 for (i = 0; i < checkWays.length; i++) {
34134                     way = checkWays[i];
34135                     if (!isRoad(way) && !memberOfRestriction(way)) continue;
34136
34137                     ways.push(way);   // it's a road, or it's already in a turn restriction
34138                     hasWays = true;
34139
34140                     // check the way's children for more key vertices
34141                     nodes = utilArrayUniq(graph.childNodes(way));
34142                     for (j = 0; j < nodes.length; j++) {
34143                         node = nodes[j];
34144                         if (node === vertex) continue;                                           // same thing
34145                         if (vertices.indexOf(node) !== -1) continue;                             // seen it already
34146                         if (geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
34147
34148                         // a key vertex will have parents that are also roads
34149                         var hasParents = false;
34150                         parents = graph.parentWays(node);
34151                         for (k = 0; k < parents.length; k++) {
34152                             parent = parents[k];
34153                             if (parent === way) continue;                 // same thing
34154                             if (ways.indexOf(parent) !== -1) continue;    // seen it already
34155                             if (!isRoad(parent)) continue;                // not a road
34156                             hasParents = true;
34157                             break;
34158                         }
34159
34160                         if (hasParents) {
34161                             checkVertices.push(node);
34162                         }
34163                     }
34164                 }
34165
34166                 if (hasWays) {
34167                     vertices.push(vertex);
34168                 }
34169             }
34170
34171             vertices = utilArrayUniq(vertices);
34172             ways = utilArrayUniq(ways);
34173
34174
34175             // STEP 2:  Build a virtual graph containing only the entities in the intersection..
34176             // Everything done after this step should act on the virtual graph
34177             // Any actions that must be performed later to the main graph go in `actions` array
34178             ways.forEach(function(way) {
34179                 graph.childNodes(way).forEach(function(node) {
34180                     vgraph = vgraph.replace(node);
34181                 });
34182
34183                 vgraph = vgraph.replace(way);
34184
34185                 graph.parentRelations(way).forEach(function(relation) {
34186                     if (relation.isRestriction()) {
34187                         if (relation.isValidRestriction(graph)) {
34188                             vgraph = vgraph.replace(relation);
34189                         } else if (relation.isComplete(graph)) {
34190                             actions.push(actionDeleteRelation(relation.id));
34191                         }
34192                     }
34193                 });
34194             });
34195
34196
34197             // STEP 3:  Force all oneways to be drawn in the forward direction
34198             ways.forEach(function(w) {
34199                 var way = vgraph.entity(w.id);
34200                 if (way.tags.oneway === '-1') {
34201                     var action = actionReverse(way.id, { reverseOneway: true });
34202                     actions.push(action);
34203                     vgraph = action(vgraph);
34204                 }
34205             });
34206
34207
34208             // STEP 4:  Split ways on key vertices
34209             var origCount = osmEntity.id.next.way;
34210             vertices.forEach(function(v) {
34211                 // This is an odd way to do it, but we need to find all the ways that
34212                 // will be split here, then split them one at a time to ensure that these
34213                 // actions can be replayed on the main graph exactly in the same order.
34214                 // (It is unintuitive, but the order of ways returned from graph.parentWays()
34215                 // is arbitrary, depending on how the main graph and vgraph were built)
34216                 var splitAll = actionSplit(v.id);
34217                 if (!splitAll.disabled(vgraph)) {
34218                     splitAll.ways(vgraph).forEach(function(way) {
34219                         var splitOne = actionSplit(v.id).limitWays([way.id]);
34220                         actions.push(splitOne);
34221                         vgraph = splitOne(vgraph);
34222                     });
34223                 }
34224             });
34225
34226             // In here is where we should also split the intersection at nearby junction.
34227             //   for https://github.com/mapbox/iD-internal/issues/31
34228             // nearbyVertices.forEach(function(v) {
34229             // });
34230
34231             // Reasons why we reset the way id count here:
34232             //  1. Continuity with way ids created by the splits so that we can replay
34233             //     these actions later if the user decides to create a turn restriction
34234             //  2. Avoids churning way ids just by hovering over a vertex
34235             //     and displaying the turn restriction editor
34236             osmEntity.id.next.way = origCount;
34237
34238
34239             // STEP 5:  Update arrays to point to vgraph entities
34240             vertexIds = vertices.map(function(v) { return v.id; });
34241             vertices = [];
34242             ways = [];
34243
34244             vertexIds.forEach(function(id) {
34245                 var vertex = vgraph.entity(id);
34246                 var parents = vgraph.parentWays(vertex);
34247                 vertices.push(vertex);
34248                 ways = ways.concat(parents);
34249             });
34250
34251             vertices = utilArrayUniq(vertices);
34252             ways = utilArrayUniq(ways);
34253
34254             vertexIds = vertices.map(function(v) { return v.id; });
34255             wayIds = ways.map(function(w) { return w.id; });
34256
34257
34258             // STEP 6:  Update the ways with some metadata that will be useful for
34259             // walking the intersection graph later and rendering turn arrows.
34260
34261             function withMetadata(way, vertexIds) {
34262                 var __oneWay = way.isOneWay();
34263
34264                 // which affixes are key vertices?
34265                 var __first = (vertexIds.indexOf(way.first()) !== -1);
34266                 var __last = (vertexIds.indexOf(way.last()) !== -1);
34267
34268                 // what roles is this way eligible for?
34269                 var __via = (__first && __last);
34270                 var __from = ((__first && !__oneWay) || __last);
34271                 var __to = (__first || (__last && !__oneWay));
34272
34273                 return way.update({
34274                     __first:  __first,
34275                     __last:  __last,
34276                     __from:  __from,
34277                     __via: __via,
34278                     __to:  __to,
34279                     __oneWay:  __oneWay
34280                 });
34281             }
34282
34283             ways = [];
34284             wayIds.forEach(function(id) {
34285                 var way = withMetadata(vgraph.entity(id), vertexIds);
34286                 vgraph = vgraph.replace(way);
34287                 ways.push(way);
34288             });
34289
34290
34291             // STEP 7:  Simplify - This is an iterative process where we:
34292             //  1. Find trivial vertices with only 2 parents
34293             //  2. trim off the leaf way from those vertices and remove from vgraph
34294
34295             var keepGoing;
34296             var removeWayIds = [];
34297             var removeVertexIds = [];
34298
34299             do {
34300                 keepGoing = false;
34301                 checkVertices = vertexIds.slice();
34302
34303                 for (i = 0; i < checkVertices.length; i++) {
34304                     var vertexId = checkVertices[i];
34305                     vertex = vgraph.hasEntity(vertexId);
34306
34307                     if (!vertex) {
34308                         if (vertexIds.indexOf(vertexId) !== -1) {
34309                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34310                         }
34311                         removeVertexIds.push(vertexId);
34312                         continue;
34313                     }
34314
34315                     parents = vgraph.parentWays(vertex);
34316                     if (parents.length < 3) {
34317                         if (vertexIds.indexOf(vertexId) !== -1) {
34318                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34319                         }
34320                     }
34321
34322                     if (parents.length === 2) {     // vertex with 2 parents is trivial
34323                         var a = parents[0];
34324                         var b = parents[1];
34325                         var aIsLeaf = a && !a.__via;
34326                         var bIsLeaf = b && !b.__via;
34327                         var leaf, survivor;
34328
34329                         if (aIsLeaf && !bIsLeaf) {
34330                             leaf = a;
34331                             survivor = b;
34332                         } else if (!aIsLeaf && bIsLeaf) {
34333                             leaf = b;
34334                             survivor = a;
34335                         }
34336
34337                         if (leaf && survivor) {
34338                             survivor = withMetadata(survivor, vertexIds);      // update survivor way
34339                             vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
34340                             removeWayIds.push(leaf.id);
34341                             keepGoing = true;
34342                         }
34343                     }
34344
34345                     parents = vgraph.parentWays(vertex);
34346
34347                     if (parents.length < 2) {     // vertex is no longer a key vertex
34348                         if (vertexIds.indexOf(vertexId) !== -1) {
34349                             vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
34350                         }
34351                         removeVertexIds.push(vertexId);
34352                         keepGoing = true;
34353                     }
34354
34355                     if (parents.length < 1) {     // vertex is no longer attached to anything
34356                         vgraph = vgraph.remove(vertex);
34357                     }
34358
34359                 }
34360             } while (keepGoing);
34361
34362
34363             vertices = vertices
34364                 .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
34365                 .map(function(vertex) { return vgraph.entity(vertex.id); });
34366             ways = ways
34367                 .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
34368                 .map(function(way) { return vgraph.entity(way.id); });
34369
34370
34371             // OK!  Here is our intersection..
34372             var intersection = {
34373                 graph: vgraph,
34374                 actions: actions,
34375                 vertices: vertices,
34376                 ways: ways,
34377             };
34378
34379
34380
34381             // Get all the valid turns through this intersection given a starting way id.
34382             // This operates on the virtual graph for everything.
34383             //
34384             // Basically, walk through all possible paths from starting way,
34385             //   honoring the existing turn restrictions as we go (watch out for loops!)
34386             //
34387             // For each path found, generate and return a `osmTurn` datastructure.
34388             //
34389             intersection.turns = function(fromWayId, maxViaWay) {
34390                 if (!fromWayId) return [];
34391                 if (!maxViaWay) maxViaWay = 0;
34392
34393                 var vgraph = intersection.graph;
34394                 var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
34395
34396                 var start = vgraph.entity(fromWayId);
34397                 if (!start || !(start.__from || start.__via)) return [];
34398
34399                 // maxViaWay=0   from-*-to              (0 vias)
34400                 // maxViaWay=1   from-*-via-*-to        (1 via max)
34401                 // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
34402                 var maxPathLength = (maxViaWay * 2) + 3;
34403                 var turns = [];
34404
34405                 step(start);
34406                 return turns;
34407
34408
34409                 // traverse the intersection graph and find all the valid paths
34410                 function step(entity, currPath, currRestrictions, matchedRestriction) {
34411                     currPath = (currPath || []).slice();  // shallow copy
34412                     if (currPath.length >= maxPathLength) return;
34413                     currPath.push(entity.id);
34414                     currRestrictions = (currRestrictions || []).slice();  // shallow copy
34415                     var i, j;
34416
34417                     if (entity.type === 'node') {
34418                         var parents = vgraph.parentWays(entity);
34419                         var nextWays = [];
34420
34421                         // which ways can we step into?
34422                         for (i = 0; i < parents.length; i++) {
34423                             var way = parents[i];
34424
34425                             // if next way is a oneway incoming to this vertex, skip
34426                             if (way.__oneWay && way.nodes[0] !== entity.id) continue;
34427
34428                             // if we have seen it before (allowing for an initial u-turn), skip
34429                             if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
34430
34431                             // Check all "current" restrictions (where we've already walked the `FROM`)
34432                             var restrict = undefined;
34433                             for (j = 0; j < currRestrictions.length; j++) {
34434                                 var restriction = currRestrictions[j];
34435                                 var f = restriction.memberByRole('from');
34436                                 var v = restriction.membersByRole('via');
34437                                 var t = restriction.memberByRole('to');
34438                                 var isOnly = /^only_/.test(restriction.tags.restriction);
34439
34440                                 // Does the current path match this turn restriction?
34441                                 var matchesFrom = (f.id === fromWayId);
34442                                 var matchesViaTo = false;
34443                                 var isAlongOnlyPath = false;
34444
34445                                 if (t.id === way.id) {     // match TO
34446
34447                                     if (v.length === 1 && v[0].type === 'node') {    // match VIA node
34448                                         matchesViaTo = (v[0].id === entity.id && (
34449                                             (matchesFrom && currPath.length === 2) ||
34450                                             (!matchesFrom && currPath.length > 2)
34451                                         ));
34452
34453                                     } else {                                         // match all VIA ways
34454                                         var pathVias = [];
34455                                         for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
34456                                             pathVias.push(currPath[k]);              // (path goes way-node-way...)
34457                                         }
34458                                         var restrictionVias = [];
34459                                         for (k = 0; k < v.length; k++) {
34460                                             if (v[k].type === 'way') {
34461                                                 restrictionVias.push(v[k].id);
34462                                             }
34463                                         }
34464                                         var diff = utilArrayDifference(pathVias, restrictionVias);
34465                                         matchesViaTo = !diff.length;
34466                                     }
34467
34468                                 } else if (isOnly) {
34469                                     for (k = 0; k < v.length; k++) {
34470                                         // way doesn't match TO, but is one of the via ways along the path of an "only"
34471                                         if (v[k].type === 'way' && v[k].id === way.id) {
34472                                             isAlongOnlyPath = true;
34473                                             break;
34474                                         }
34475                                     }
34476                                 }
34477
34478                                 if (matchesViaTo) {
34479                                     if (isOnly) {
34480                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
34481                                     } else {
34482                                         restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
34483                                     }
34484                                 } else {    // indirect - caused by a different nearby restriction
34485                                     if (isAlongOnlyPath) {
34486                                         restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
34487                                     } else if (isOnly) {
34488                                         restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
34489                                     }
34490                                 }
34491
34492                                 // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
34493                                 if (restrict && restrict.direct)
34494                                     break;
34495                             }
34496
34497                             nextWays.push({ way: way, restrict: restrict });
34498                         }
34499
34500                         nextWays.forEach(function(nextWay) {
34501                             step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
34502                         });
34503
34504
34505                     } else {  // entity.type === 'way'
34506                         if (currPath.length >= 3) {     // this is a "complete" path..
34507                             var turnPath = currPath.slice();   // shallow copy
34508
34509                             // an indirect restriction - only include the partial path (starting at FROM)
34510                             if (matchedRestriction && matchedRestriction.direct === false) {
34511                                 for (i = 0; i < turnPath.length; i++) {
34512                                     if (turnPath[i] === matchedRestriction.from) {
34513                                         turnPath = turnPath.slice(i);
34514                                         break;
34515                                     }
34516                                 }
34517                             }
34518
34519                             var turn = pathToTurn(turnPath);
34520                             if (turn) {
34521                                 if (matchedRestriction) {
34522                                     turn.restrictionID = matchedRestriction.id;
34523                                     turn.no = matchedRestriction.no;
34524                                     turn.only = matchedRestriction.only;
34525                                     turn.direct = matchedRestriction.direct;
34526                                 }
34527                                 turns.push(osmTurn(turn));
34528                             }
34529
34530                             if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
34531                         }
34532
34533                         if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
34534
34535                         // which nodes can we step into?
34536                         var n1 = vgraph.entity(entity.first());
34537                         var n2 = vgraph.entity(entity.last());
34538                         var dist = geoSphericalDistance(n1.loc, n2.loc);
34539                         var nextNodes = [];
34540
34541                         if (currPath.length > 1) {
34542                             if (dist > maxDistance) return;   // the next node is too far
34543                             if (!entity.__via) return;        // this way is a leaf / can't be a via
34544                         }
34545
34546                         if (!entity.__oneWay &&                     // bidirectional..
34547                             keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
34548                             currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
34549                             nextNodes.push(n1);                     // can advance to first node
34550                         }
34551                         if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
34552                             currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
34553                             nextNodes.push(n2);                     // can advance to last node
34554                         }
34555
34556                         nextNodes.forEach(function(nextNode) {
34557                             // gather restrictions FROM this way
34558                             var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
34559                                 if (!r.isRestriction()) return false;
34560
34561                                 var f = r.memberByRole('from');
34562                                 if (!f || f.id !== entity.id) return false;
34563
34564                                 var isOnly = /^only_/.test(r.tags.restriction);
34565                                 if (!isOnly) return true;
34566
34567                                 // `only_` restrictions only matter along the direction of the VIA - #4849
34568                                 var isOnlyVia = false;
34569                                 var v = r.membersByRole('via');
34570                                 if (v.length === 1 && v[0].type === 'node') {   // via node
34571                                     isOnlyVia = (v[0].id === nextNode.id);
34572                                 } else {                                        // via way(s)
34573                                     for (var i = 0; i < v.length; i++) {
34574                                         if (v[i].type !== 'way') continue;
34575                                         var viaWay = vgraph.entity(v[i].id);
34576                                         if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
34577                                             isOnlyVia = true;
34578                                             break;
34579                                         }
34580                                     }
34581                                 }
34582                                 return isOnlyVia;
34583                             });
34584
34585                             step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
34586                         });
34587                     }
34588                 }
34589
34590
34591                 // assumes path is alternating way-node-way of odd length
34592                 function pathToTurn(path) {
34593                     if (path.length < 3) return;
34594                     var fromWayId, fromNodeId, fromVertexId;
34595                     var toWayId, toNodeId, toVertexId;
34596                     var viaWayIds, viaNodeId, isUturn;
34597
34598                     fromWayId = path[0];
34599                     toWayId = path[path.length - 1];
34600
34601                     if (path.length === 3 && fromWayId === toWayId) {  // u turn
34602                         var way = vgraph.entity(fromWayId);
34603                         if (way.__oneWay) return null;
34604
34605                         isUturn = true;
34606                         viaNodeId = fromVertexId = toVertexId = path[1];
34607                         fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
34608
34609                     } else {
34610                         isUturn = false;
34611                         fromVertexId = path[1];
34612                         fromNodeId = adjacentNode(fromWayId, fromVertexId);
34613                         toVertexId = path[path.length - 2];
34614                         toNodeId = adjacentNode(toWayId, toVertexId);
34615
34616                         if (path.length === 3) {
34617                             viaNodeId = path[1];
34618                         } else {
34619                             viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
34620                             viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
34621                         }
34622                     }
34623
34624                     return {
34625                         key:  path.join('_'),
34626                         path: path,
34627                         from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
34628                         via:  { node: viaNodeId,  ways: viaWayIds },
34629                         to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
34630                         u:    isUturn
34631                     };
34632
34633
34634                     function adjacentNode(wayId, affixId) {
34635                         var nodes = vgraph.entity(wayId).nodes;
34636                         return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
34637                     }
34638                 }
34639
34640             };
34641
34642             return intersection;
34643         }
34644
34645
34646         function osmInferRestriction(graph, turn, projection) {
34647             var fromWay = graph.entity(turn.from.way);
34648             var fromNode = graph.entity(turn.from.node);
34649             var fromVertex = graph.entity(turn.from.vertex);
34650             var toWay = graph.entity(turn.to.way);
34651             var toNode = graph.entity(turn.to.node);
34652             var toVertex = graph.entity(turn.to.vertex);
34653
34654             var fromOneWay = (fromWay.tags.oneway === 'yes');
34655             var toOneWay = (toWay.tags.oneway === 'yes');
34656             var angle = (geoAngle(fromVertex, fromNode, projection) -
34657                         geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
34658
34659             while (angle < 0)
34660                 angle += 360;
34661
34662             if (fromNode === toNode)
34663                 return 'no_u_turn';
34664             if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
34665                 return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
34666             if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
34667                 return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
34668             if (angle < 158)
34669                 return 'no_right_turn';
34670             if (angle > 202)
34671                 return 'no_left_turn';
34672
34673             return 'no_straight_on';
34674         }
34675
34676         function actionMergePolygon(ids, newRelationId) {
34677
34678             function groupEntities(graph) {
34679                 var entities = ids.map(function (id) { return graph.entity(id); });
34680                 var geometryGroups = utilArrayGroupBy(entities, function(entity) {
34681                     if (entity.type === 'way' && entity.isClosed()) {
34682                         return 'closedWay';
34683                     } else if (entity.type === 'relation' && entity.isMultipolygon()) {
34684                         return 'multipolygon';
34685                     } else {
34686                         return 'other';
34687                     }
34688                 });
34689
34690                 return Object.assign(
34691                     { closedWay: [], multipolygon: [], other: [] },
34692                     geometryGroups
34693                 );
34694             }
34695
34696
34697             var action = function(graph) {
34698                 var entities = groupEntities(graph);
34699
34700                 // An array representing all the polygons that are part of the multipolygon.
34701                 //
34702                 // Each element is itself an array of objects with an id property, and has a
34703                 // locs property which is an array of the locations forming the polygon.
34704                 var polygons = entities.multipolygon.reduce(function(polygons, m) {
34705                     return polygons.concat(osmJoinWays(m.members, graph));
34706                 }, []).concat(entities.closedWay.map(function(d) {
34707                     var member = [{id: d.id}];
34708                     member.nodes = graph.childNodes(d);
34709                     return member;
34710                 }));
34711
34712                 // contained is an array of arrays of boolean values,
34713                 // where contained[j][k] is true iff the jth way is
34714                 // contained by the kth way.
34715                 var contained = polygons.map(function(w, i) {
34716                     return polygons.map(function(d, n) {
34717                         if (i === n) return null;
34718                         return geoPolygonContainsPolygon(
34719                             d.nodes.map(function(n) { return n.loc; }),
34720                             w.nodes.map(function(n) { return n.loc; })
34721                         );
34722                     });
34723                 });
34724
34725                 // Sort all polygons as either outer or inner ways
34726                 var members = [];
34727                 var outer = true;
34728
34729                 while (polygons.length) {
34730                     extractUncontained(polygons);
34731                     polygons = polygons.filter(isContained);
34732                     contained = contained.filter(isContained).map(filterContained);
34733                 }
34734
34735                 function isContained(d, i) {
34736                     return contained[i].some(function(val) { return val; });
34737                 }
34738
34739                 function filterContained(d) {
34740                     return d.filter(isContained);
34741                 }
34742
34743                 function extractUncontained(polygons) {
34744                     polygons.forEach(function(d, i) {
34745                         if (!isContained(d, i)) {
34746                             d.forEach(function(member) {
34747                                 members.push({
34748                                     type: 'way',
34749                                     id: member.id,
34750                                     role: outer ? 'outer' : 'inner'
34751                                 });
34752                             });
34753                         }
34754                     });
34755                     outer = !outer;
34756                 }
34757
34758                 // Move all tags to one relation
34759                 var relation = entities.multipolygon[0] ||
34760                     osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
34761
34762                 entities.multipolygon.slice(1).forEach(function(m) {
34763                     relation = relation.mergeTags(m.tags);
34764                     graph = graph.remove(m);
34765                 });
34766
34767                 entities.closedWay.forEach(function(way) {
34768                     function isThisOuter(m) {
34769                         return m.id === way.id && m.role !== 'inner';
34770                     }
34771                     if (members.some(isThisOuter)) {
34772                         relation = relation.mergeTags(way.tags);
34773                         graph = graph.replace(way.update({ tags: {} }));
34774                     }
34775                 });
34776
34777                 return graph.replace(relation.update({
34778                     members: members,
34779                     tags: utilObjectOmit(relation.tags, ['area'])
34780                 }));
34781             };
34782
34783
34784             action.disabled = function(graph) {
34785                 var entities = groupEntities(graph);
34786                 if (entities.other.length > 0 ||
34787                     entities.closedWay.length + entities.multipolygon.length < 2)
34788                     return 'not_eligible';
34789                 if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
34790                     return 'incomplete_relation';
34791             };
34792
34793
34794             return action;
34795         }
34796
34797         var isArray$3 = Array.isArray;
34798         var keyList = Object.keys;
34799         var hasProp = Object.prototype.hasOwnProperty;
34800
34801         var fastDeepEqual = function equal(a, b) {
34802           if (a === b) return true;
34803
34804           if (a && b && typeof a == 'object' && typeof b == 'object') {
34805             var arrA = isArray$3(a)
34806               , arrB = isArray$3(b)
34807               , i
34808               , length
34809               , key;
34810
34811             if (arrA && arrB) {
34812               length = a.length;
34813               if (length != b.length) return false;
34814               for (i = length; i-- !== 0;)
34815                 if (!equal(a[i], b[i])) return false;
34816               return true;
34817             }
34818
34819             if (arrA != arrB) return false;
34820
34821             var dateA = a instanceof Date
34822               , dateB = b instanceof Date;
34823             if (dateA != dateB) return false;
34824             if (dateA && dateB) return a.getTime() == b.getTime();
34825
34826             var regexpA = a instanceof RegExp
34827               , regexpB = b instanceof RegExp;
34828             if (regexpA != regexpB) return false;
34829             if (regexpA && regexpB) return a.toString() == b.toString();
34830
34831             var keys = keyList(a);
34832             length = keys.length;
34833
34834             if (length !== keyList(b).length)
34835               return false;
34836
34837             for (i = length; i-- !== 0;)
34838               if (!hasProp.call(b, keys[i])) return false;
34839
34840             for (i = length; i-- !== 0;) {
34841               key = keys[i];
34842               if (!equal(a[key], b[key])) return false;
34843             }
34844
34845             return true;
34846           }
34847
34848           return a!==a && b!==b;
34849         };
34850
34851         // Text diff algorithm following Hunt and McIlroy 1976.
34852         // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
34853         // comparison, Bell Telephone Laboratories CSTR #41 (1976)
34854         // http://www.cs.dartmouth.edu/~doug/
34855         //
34856         // Expects two arrays of strings.
34857         function LCS(file1, file2) {
34858           var equivalenceClasses;
34859           var file2indices;
34860           var newCandidate;
34861           var candidates;
34862           var line;
34863           var c, i, j, jX, r, s;
34864
34865           equivalenceClasses = {};
34866           for (j = 0; j < file2.length; j++) {
34867             line = file2[j];
34868             if (equivalenceClasses[line]) {
34869               equivalenceClasses[line].push(j);
34870             } else {
34871               equivalenceClasses[line] = [j];
34872             }
34873           }
34874
34875           candidates = [
34876             { file1index: -1, file2index: -1, chain: null }
34877           ];
34878
34879           for (i = 0; i < file1.length; i++) {
34880             line = file1[i];
34881             file2indices = equivalenceClasses[line] || [];
34882
34883             r = 0;
34884             c = candidates[0];
34885
34886             for (jX = 0; jX < file2indices.length; jX++) {
34887               j = file2indices[jX];
34888
34889               for (s = r; s < candidates.length; s++) {
34890                 if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
34891                   break;
34892                 }
34893               }
34894
34895               if (s < candidates.length) {
34896                 newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
34897                 if (r === candidates.length) {
34898                   candidates.push(c);
34899                 } else {
34900                   candidates[r] = c;
34901                 }
34902                 r = s + 1;
34903                 c = newCandidate;
34904                 if (r === candidates.length) {
34905                   break; // no point in examining further (j)s
34906                 }
34907               }
34908             }
34909
34910             candidates[r] = c;
34911           }
34912
34913           // At this point, we know the LCS: it's in the reverse of the
34914           // linked-list through .chain of candidates[candidates.length - 1].
34915
34916           return candidates[candidates.length - 1];
34917         }
34918
34919
34920         // We apply the LCS to give a simple representation of the
34921         // offsets and lengths of mismatched chunks in the input
34922         // files. This is used by diff3MergeIndices below.
34923         function diffIndices(file1, file2) {
34924           var result = [];
34925           var tail1 = file1.length;
34926           var tail2 = file2.length;
34927
34928           for (var candidate = LCS(file1, file2);
34929              candidate !== null;
34930              candidate = candidate.chain)
34931           {
34932             var mismatchLength1 = tail1 - candidate.file1index - 1;
34933             var mismatchLength2 = tail2 - candidate.file2index - 1;
34934             tail1 = candidate.file1index;
34935             tail2 = candidate.file2index;
34936
34937             if (mismatchLength1 || mismatchLength2) {
34938               result.push({
34939                 file1: [tail1 + 1, mismatchLength1],
34940                 file2: [tail2 + 1, mismatchLength2]
34941               });
34942             }
34943           }
34944
34945           result.reverse();
34946           return result;
34947         }
34948
34949
34950         // Given three files, A, O, and B, where both A and B are
34951         // independently derived from O, returns a fairly complicated
34952         // internal representation of merge decisions it's taken. The
34953         // interested reader may wish to consult
34954         //
34955         // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
34956         // 'A Formal Investigation of ' In Arvind and Prasad,
34957         // editors, Foundations of Software Technology and Theoretical
34958         // Computer Science (FSTTCS), December 2007.
34959         //
34960         // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
34961         function diff3MergeIndices(a, o, b) {
34962           var i;
34963           var m1 = diffIndices(o, a);
34964           var m2 = diffIndices(o, b);
34965
34966           var hunks = [];
34967           function addHunk(h, side) {
34968             hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
34969           }
34970           for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
34971           for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
34972           hunks.sort(function (x, y) { return x[0] - y[0]; });
34973
34974           var result = [];
34975           var commonOffset = 0;
34976           function copyCommon(targetOffset) {
34977             if (targetOffset > commonOffset) {
34978               result.push([1, commonOffset, targetOffset - commonOffset]);
34979               commonOffset = targetOffset;
34980             }
34981           }
34982
34983           for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
34984             var firstHunkIndex = hunkIndex;
34985             var hunk = hunks[hunkIndex];
34986             var regionLhs = hunk[0];
34987             var regionRhs = regionLhs + hunk[2];
34988             while (hunkIndex < hunks.length - 1) {
34989               var maybeOverlapping = hunks[hunkIndex + 1];
34990               var maybeLhs = maybeOverlapping[0];
34991               if (maybeLhs > regionRhs) {
34992                 break;
34993               }
34994               regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
34995               hunkIndex++;
34996             }
34997
34998             copyCommon(regionLhs);
34999             if (firstHunkIndex === hunkIndex) {
35000               // The 'overlap' was only one hunk long, meaning that
35001               // there's no conflict here. Either a and o were the
35002               // same, or b and o were the same.
35003               if (hunk[4] > 0) {
35004                 result.push([hunk[1], hunk[3], hunk[4]]);
35005               }
35006             } else {
35007               // A proper conflict. Determine the extents of the
35008               // regions involved from a, o and b. Effectively merge
35009               // all the hunks on the left into one giant hunk, and
35010               // do the same for the right; then, correct for skew
35011               // in the regions of o that each side changed, and
35012               // report appropriate spans for the three sides.
35013               var regions = {
35014                 0: [a.length, -1, o.length, -1],
35015                 2: [b.length, -1, o.length, -1]
35016               };
35017               for (i = firstHunkIndex; i <= hunkIndex; i++) {
35018                 hunk = hunks[i];
35019                 var side = hunk[1];
35020                 var r = regions[side];
35021                 var oLhs = hunk[0];
35022                 var oRhs = oLhs + hunk[2];
35023                 var abLhs = hunk[3];
35024                 var abRhs = abLhs + hunk[4];
35025                 r[0] = Math.min(abLhs, r[0]);
35026                 r[1] = Math.max(abRhs, r[1]);
35027                 r[2] = Math.min(oLhs, r[2]);
35028                 r[3] = Math.max(oRhs, r[3]);
35029               }
35030               var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
35031               var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
35032               var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
35033               var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
35034               result.push([-1,
35035                            aLhs,      aRhs      - aLhs,
35036                            regionLhs, regionRhs - regionLhs,
35037                            bLhs,      bRhs      - bLhs]);
35038             }
35039             commonOffset = regionRhs;
35040           }
35041
35042           copyCommon(o.length);
35043           return result;
35044         }
35045
35046
35047         // Applies the output of diff3MergeIndices to actually
35048         // construct the merged file; the returned result alternates
35049         // between 'ok' and 'conflict' blocks.
35050         function diff3Merge(a, o, b, excludeFalseConflicts) {
35051           var result = [];
35052           var files = [a, o, b];
35053           var indices = diff3MergeIndices(a, o, b);
35054
35055           var okLines = [];
35056           function flushOk() {
35057             if (okLines.length) {
35058               result.push({ok: okLines});
35059             }
35060             okLines = [];
35061           }
35062           function pushOk(xs) {
35063             for (var j = 0; j < xs.length; j++) {
35064               okLines.push(xs[j]);
35065             }
35066           }
35067
35068           function isTrueConflict(rec) {
35069             if (rec[2] !== rec[6]) return true;
35070             var aoff = rec[1];
35071             var boff = rec[5];
35072             for (var j = 0; j < rec[2]; j++) {
35073               if (a[j + aoff] !== b[j + boff]) {
35074                 return true;
35075               }
35076             }
35077             return false;
35078           }
35079
35080           for (var i = 0; i < indices.length; i++) {
35081             var x = indices[i];
35082             var side = x[0];
35083             if (side === -1) {
35084               if (excludeFalseConflicts && !isTrueConflict(x)) {
35085                 pushOk(files[0].slice(x[1], x[1] + x[2]));
35086               } else {
35087                 flushOk();
35088                 result.push({
35089                   conflict: {
35090                     a: a.slice(x[1], x[1] + x[2]),
35091                     aIndex: x[1],
35092                     o: o.slice(x[3], x[3] + x[4]),
35093                     oIndex: x[3],
35094                     b: b.slice(x[5], x[5] + x[6]),
35095                     bIndex: x[5]
35096                   }
35097                 });
35098               }
35099             } else {
35100               pushOk(files[side].slice(x[1], x[1] + x[2]));
35101             }
35102           }
35103
35104           flushOk();
35105           return result;
35106         }
35107
35108         function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
35109             var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
35110             var _conflicts = [];
35111
35112
35113             function user(d) {
35114                 return (typeof formatUser === 'function') ? formatUser(d) : d;
35115             }
35116
35117
35118             function mergeLocation(remote, target) {
35119                 function pointEqual(a, b) {
35120                     var epsilon = 1e-6;
35121                     return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
35122                 }
35123
35124                 if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
35125                     return target;
35126                 }
35127                 if (_option === 'force_remote') {
35128                     return target.update({loc: remote.loc});
35129                 }
35130
35131                 _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
35132                 return target;
35133             }
35134
35135
35136             function mergeNodes(base, remote, target) {
35137                 if (_option === 'force_local' || fastDeepEqual(target.nodes, remote.nodes)) {
35138                     return target;
35139                 }
35140                 if (_option === 'force_remote') {
35141                     return target.update({nodes: remote.nodes});
35142                 }
35143
35144                 var ccount = _conflicts.length;
35145                 var o = base.nodes || [];
35146                 var a = target.nodes || [];
35147                 var b = remote.nodes || [];
35148                 var nodes = [];
35149                 var hunks = diff3Merge(a, o, b, true);
35150
35151                 for (var i = 0; i < hunks.length; i++) {
35152                     var hunk = hunks[i];
35153                     if (hunk.ok) {
35154                         nodes.push.apply(nodes, hunk.ok);
35155                     } else {
35156                         // for all conflicts, we can assume c.a !== c.b
35157                         // because `diff3Merge` called with `true` option to exclude false conflicts..
35158                         var c = hunk.conflict;
35159                         if (fastDeepEqual(c.o, c.a)) {  // only changed remotely
35160                             nodes.push.apply(nodes, c.b);
35161                         } else if (fastDeepEqual(c.o, c.b)) {  // only changed locally
35162                             nodes.push.apply(nodes, c.a);
35163                         } else {       // changed both locally and remotely
35164                             _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
35165                             break;
35166                         }
35167                     }
35168                 }
35169
35170                 return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
35171             }
35172
35173
35174             function mergeChildren(targetWay, children, updates, graph) {
35175                 function isUsed(node, targetWay) {
35176                     var hasInterestingParent = graph.parentWays(node)
35177                         .some(function(way) { return way.id !== targetWay.id; });
35178
35179                     return node.hasInterestingTags() ||
35180                         hasInterestingParent ||
35181                         graph.parentRelations(node).length > 0;
35182                 }
35183
35184                 var ccount = _conflicts.length;
35185
35186                 for (var i = 0; i < children.length; i++) {
35187                     var id = children[i];
35188                     var node = graph.hasEntity(id);
35189
35190                     // remove unused childNodes..
35191                     if (targetWay.nodes.indexOf(id) === -1) {
35192                         if (node && !isUsed(node, targetWay)) {
35193                             updates.removeIds.push(id);
35194                         }
35195                         continue;
35196                     }
35197
35198                     // restore used childNodes..
35199                     var local = localGraph.hasEntity(id);
35200                     var remote = remoteGraph.hasEntity(id);
35201                     var target;
35202
35203                     if (_option === 'force_remote' && remote && remote.visible) {
35204                         updates.replacements.push(remote);
35205
35206                     } else if (_option === 'force_local' && local) {
35207                         target = osmEntity(local);
35208                         if (remote) {
35209                             target = target.update({ version: remote.version });
35210                         }
35211                         updates.replacements.push(target);
35212
35213                     } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
35214                         target = osmEntity(local, { version: remote.version });
35215                         if (remote.visible) {
35216                             target = mergeLocation(remote, target);
35217                         } else {
35218                             _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35219                         }
35220
35221                         if (_conflicts.length !== ccount) break;
35222                         updates.replacements.push(target);
35223                     }
35224                 }
35225
35226                 return targetWay;
35227             }
35228
35229
35230             function updateChildren(updates, graph) {
35231                 for (var i = 0; i < updates.replacements.length; i++) {
35232                     graph = graph.replace(updates.replacements[i]);
35233                 }
35234                 if (updates.removeIds.length) {
35235                     graph = actionDeleteMultiple(updates.removeIds)(graph);
35236                 }
35237                 return graph;
35238             }
35239
35240
35241             function mergeMembers(remote, target) {
35242                 if (_option === 'force_local' || fastDeepEqual(target.members, remote.members)) {
35243                     return target;
35244                 }
35245                 if (_option === 'force_remote') {
35246                     return target.update({members: remote.members});
35247                 }
35248
35249                 _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
35250                 return target;
35251             }
35252
35253
35254             function mergeTags(base, remote, target) {
35255                 if (_option === 'force_local' || fastDeepEqual(target.tags, remote.tags)) {
35256                     return target;
35257                 }
35258                 if (_option === 'force_remote') {
35259                     return target.update({tags: remote.tags});
35260                 }
35261
35262                 var ccount = _conflicts.length;
35263                 var o = base.tags || {};
35264                 var a = target.tags || {};
35265                 var b = remote.tags || {};
35266                 var keys = utilArrayUnion(utilArrayUnion(Object.keys(o), Object.keys(a)), Object.keys(b))
35267                     .filter(function(k) { return !dataDiscarded[k]; });
35268                 var tags = Object.assign({}, a);   // shallow copy
35269                 var changed = false;
35270
35271                 for (var i = 0; i < keys.length; i++) {
35272                     var k = keys[i];
35273
35274                     if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
35275                         if (o[k] !== a[k]) {      // changed locally..
35276                             _conflicts.push(t('merge_remote_changes.conflict.tags',
35277                                 { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
35278
35279                         } else {                  // unchanged locally, accept remote change..
35280                             if (b.hasOwnProperty(k)) {
35281                                 tags[k] = b[k];
35282                             } else {
35283                                 delete tags[k];
35284                             }
35285                             changed = true;
35286                         }
35287                     }
35288                 }
35289
35290                 return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
35291             }
35292
35293
35294             //  `graph.base()` is the common ancestor of the two graphs.
35295             //  `localGraph` contains user's edits up to saving
35296             //  `remoteGraph` contains remote edits to modified nodes
35297             //  `graph` must be a descendent of `localGraph` and may include
35298             //      some conflict resolution actions performed on it.
35299             //
35300             //                  --- ... --- `localGraph` -- ... -- `graph`
35301             //                 /
35302             //  `graph.base()` --- ... --- `remoteGraph`
35303             //
35304             var action = function(graph) {
35305                 var updates = { replacements: [], removeIds: [] };
35306                 var base = graph.base().entities[id];
35307                 var local = localGraph.entity(id);
35308                 var remote = remoteGraph.entity(id);
35309                 var target = osmEntity(local, { version: remote.version });
35310
35311                 // delete/undelete
35312                 if (!remote.visible) {
35313                     if (_option === 'force_remote') {
35314                         return actionDeleteMultiple([id])(graph);
35315
35316                     } else if (_option === 'force_local') {
35317                         if (target.type === 'way') {
35318                             target = mergeChildren(target, utilArrayUniq(local.nodes), updates, graph);
35319                             graph = updateChildren(updates, graph);
35320                         }
35321                         return graph.replace(target);
35322
35323                     } else {
35324                         _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
35325                         return graph;  // do nothing
35326                     }
35327                 }
35328
35329                 // merge
35330                 if (target.type === 'node') {
35331                     target = mergeLocation(remote, target);
35332
35333                 } else if (target.type === 'way') {
35334                     // pull in any child nodes that may not be present locally..
35335                     graph.rebase(remoteGraph.childNodes(remote), [graph], false);
35336                     target = mergeNodes(base, remote, target);
35337                     target = mergeChildren(target, utilArrayUnion(local.nodes, remote.nodes), updates, graph);
35338
35339                 } else if (target.type === 'relation') {
35340                     target = mergeMembers(remote, target);
35341                 }
35342
35343                 target = mergeTags(base, remote, target);
35344
35345                 if (!_conflicts.length) {
35346                     graph = updateChildren(updates, graph).replace(target);
35347                 }
35348
35349                 return graph;
35350             };
35351
35352
35353             action.withOption = function(opt) {
35354                 _option = opt;
35355                 return action;
35356             };
35357
35358
35359             action.conflicts = function() {
35360                 return _conflicts;
35361             };
35362
35363
35364             return action;
35365         }
35366
35367         // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
35368         // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
35369         function actionMove(moveIDs, tryDelta, projection, cache) {
35370             var _delta = tryDelta;
35371
35372             function setupCache(graph) {
35373                 function canMove(nodeID) {
35374                     // Allow movement of any node that is in the selectedIDs list..
35375                     if (moveIDs.indexOf(nodeID) !== -1) return true;
35376
35377                     // Allow movement of a vertex where 2 ways meet..
35378                     var parents = graph.parentWays(graph.entity(nodeID));
35379                     if (parents.length < 3) return true;
35380
35381                     // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
35382                     var parentsMoving = parents.every(function(way) { return cache.moving[way.id]; });
35383                     if (!parentsMoving) delete cache.moving[nodeID];
35384
35385                     return parentsMoving;
35386                 }
35387
35388                 function cacheEntities(ids) {
35389                     for (var i = 0; i < ids.length; i++) {
35390                         var id = ids[i];
35391                         if (cache.moving[id]) continue;
35392                         cache.moving[id] = true;
35393
35394                         var entity = graph.hasEntity(id);
35395                         if (!entity) continue;
35396
35397                         if (entity.type === 'node') {
35398                             cache.nodes.push(id);
35399                             cache.startLoc[id] = entity.loc;
35400                         } else if (entity.type === 'way') {
35401                             cache.ways.push(id);
35402                             cacheEntities(entity.nodes);
35403                         } else {
35404                             cacheEntities(entity.members.map(function(member) {
35405                                 return member.id;
35406                             }));
35407                         }
35408                     }
35409                 }
35410
35411                 function cacheIntersections(ids) {
35412                     function isEndpoint(way, id) {
35413                         return !way.isClosed() && !!way.affix(id);
35414                     }
35415
35416                     for (var i = 0; i < ids.length; i++) {
35417                         var id = ids[i];
35418
35419                         // consider only intersections with 1 moved and 1 unmoved way.
35420                         var childNodes = graph.childNodes(graph.entity(id));
35421                         for (var j = 0; j < childNodes.length; j++) {
35422                             var node = childNodes[j];
35423                             var parents = graph.parentWays(node);
35424                             if (parents.length !== 2) continue;
35425
35426                             var moved = graph.entity(id);
35427                             var unmoved = null;
35428                             for (var k = 0; k < parents.length; k++) {
35429                                 var way = parents[k];
35430                                 if (!cache.moving[way.id]) {
35431                                     unmoved = way;
35432                                     break;
35433                                 }
35434                             }
35435                             if (!unmoved) continue;
35436
35437                             // exclude ways that are overly connected..
35438                             if (utilArrayIntersection(moved.nodes, unmoved.nodes).length > 2) continue;
35439                             if (moved.isArea() || unmoved.isArea()) continue;
35440
35441                             cache.intersections.push({
35442                                 nodeId: node.id,
35443                                 movedId: moved.id,
35444                                 unmovedId: unmoved.id,
35445                                 movedIsEP: isEndpoint(moved, node.id),
35446                                 unmovedIsEP: isEndpoint(unmoved, node.id)
35447                             });
35448                         }
35449                     }
35450                 }
35451
35452
35453                 if (!cache) {
35454                     cache = {};
35455                 }
35456                 if (!cache.ok) {
35457                     cache.moving = {};
35458                     cache.intersections = [];
35459                     cache.replacedVertex = {};
35460                     cache.startLoc = {};
35461                     cache.nodes = [];
35462                     cache.ways = [];
35463
35464                     cacheEntities(moveIDs);
35465                     cacheIntersections(cache.ways);
35466                     cache.nodes = cache.nodes.filter(canMove);
35467
35468                     cache.ok = true;
35469                 }
35470             }
35471
35472
35473             // Place a vertex where the moved vertex used to be, to preserve way shape..
35474             //
35475             //  Start:
35476             //      b ---- e
35477             //     / \
35478             //    /   \
35479             //   /     \
35480             //  a       c
35481             //
35482             //      *               node '*' added to preserve shape
35483             //     / \
35484             //    /   b ---- e      way `b,e` moved here:
35485             //   /     \
35486             //  a       c
35487             //
35488             //
35489             function replaceMovedVertex(nodeId, wayId, graph, delta) {
35490                 var way = graph.entity(wayId);
35491                 var moved = graph.entity(nodeId);
35492                 var movedIndex = way.nodes.indexOf(nodeId);
35493                 var len, prevIndex, nextIndex;
35494
35495                 if (way.isClosed()) {
35496                     len = way.nodes.length - 1;
35497                     prevIndex = (movedIndex + len - 1) % len;
35498                     nextIndex = (movedIndex + len + 1) % len;
35499                 } else {
35500                     len = way.nodes.length;
35501                     prevIndex = movedIndex - 1;
35502                     nextIndex = movedIndex + 1;
35503                 }
35504
35505                 var prev = graph.hasEntity(way.nodes[prevIndex]);
35506                 var next = graph.hasEntity(way.nodes[nextIndex]);
35507
35508                 // Don't add orig vertex at endpoint..
35509                 if (!prev || !next) return graph;
35510
35511                 var key = wayId + '_' + nodeId;
35512                 var orig = cache.replacedVertex[key];
35513                 if (!orig) {
35514                     orig = osmNode();
35515                     cache.replacedVertex[key] = orig;
35516                     cache.startLoc[orig.id] = cache.startLoc[nodeId];
35517                 }
35518
35519                 var start, end;
35520                 if (delta) {
35521                     start = projection(cache.startLoc[nodeId]);
35522                     end = projection.invert(geoVecAdd(start, delta));
35523                 } else {
35524                     end = cache.startLoc[nodeId];
35525                 }
35526                 orig = orig.move(end);
35527
35528                 var angle = Math.abs(geoAngle(orig, prev, projection) -
35529                         geoAngle(orig, next, projection)) * 180 / Math.PI;
35530
35531                 // Don't add orig vertex if it would just make a straight line..
35532                 if (angle > 175 && angle < 185) return graph;
35533
35534                 // moving forward or backward along way?
35535                 var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
35536                 var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
35537                 var d1 = geoPathLength(p1);
35538                 var d2 = geoPathLength(p2);
35539                 var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
35540
35541                 // moving around closed loop?
35542                 if (way.isClosed() && insertAt === 0) insertAt = len;
35543
35544                 way = way.addNode(orig.id, insertAt);
35545                 return graph.replace(orig).replace(way);
35546             }
35547
35548
35549             // Remove duplicate vertex that might have been added by
35550             // replaceMovedVertex.  This is done after the unzorro checks.
35551             function removeDuplicateVertices(wayId, graph) {
35552                 var way = graph.entity(wayId);
35553                 var epsilon = 1e-6;
35554                 var prev, curr;
35555
35556                 function isInteresting(node, graph) {
35557                     return graph.parentWays(node).length > 1 ||
35558                         graph.parentRelations(node).length ||
35559                         node.hasInterestingTags();
35560                 }
35561
35562                 for (var i = 0; i < way.nodes.length; i++) {
35563                     curr = graph.entity(way.nodes[i]);
35564
35565                     if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
35566                         if (!isInteresting(prev, graph)) {
35567                             way = way.removeNode(prev.id);
35568                             graph = graph.replace(way).remove(prev);
35569                         } else if (!isInteresting(curr, graph)) {
35570                             way = way.removeNode(curr.id);
35571                             graph = graph.replace(way).remove(curr);
35572                         }
35573                     }
35574
35575                     prev = curr;
35576                 }
35577
35578                 return graph;
35579             }
35580
35581
35582             // Reorder nodes around intersections that have moved..
35583             //
35584             //  Start:                way1.nodes: b,e         (moving)
35585             //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
35586             //      |                 vertex: b
35587             //      e                 isEP1: true,  isEP2, false
35588             //
35589             //  way1 `b,e` moved here:
35590             //  a ----- c = b - d
35591             //              |
35592             //              e
35593             //
35594             //  reorder nodes         way1.nodes: b,e
35595             //  a ----- c - b - d     way2.nodes: a,c,b,d
35596             //              |
35597             //              e
35598             //
35599             function unZorroIntersection(intersection, graph) {
35600                 var vertex = graph.entity(intersection.nodeId);
35601                 var way1 = graph.entity(intersection.movedId);
35602                 var way2 = graph.entity(intersection.unmovedId);
35603                 var isEP1 = intersection.movedIsEP;
35604                 var isEP2 = intersection.unmovedIsEP;
35605
35606                 // don't move the vertex if it is the endpoint of both ways.
35607                 if (isEP1 && isEP2) return graph;
35608
35609                 var nodes1 = graph.childNodes(way1).filter(function(n) { return n !== vertex; });
35610                 var nodes2 = graph.childNodes(way2).filter(function(n) { return n !== vertex; });
35611
35612                 if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
35613                 if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
35614
35615                 var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
35616                 var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
35617                 var loc;
35618
35619                 // snap vertex to nearest edge (or some point between them)..
35620                 if (!isEP1 && !isEP2) {
35621                     var epsilon = 1e-6, maxIter = 10;
35622                     for (var i = 0; i < maxIter; i++) {
35623                         loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
35624                         edge1 = geoChooseEdge(nodes1, projection(loc), projection);
35625                         edge2 = geoChooseEdge(nodes2, projection(loc), projection);
35626                         if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
35627                     }
35628                 } else if (!isEP1) {
35629                     loc = edge1.loc;
35630                 } else {
35631                     loc = edge2.loc;
35632                 }
35633
35634                 graph = graph.replace(vertex.move(loc));
35635
35636                 // if zorro happened, reorder nodes..
35637                 if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
35638                     way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
35639                     graph = graph.replace(way1);
35640                 }
35641                 if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
35642                     way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
35643                     graph = graph.replace(way2);
35644                 }
35645
35646                 return graph;
35647             }
35648
35649
35650             function cleanupIntersections(graph) {
35651                 for (var i = 0; i < cache.intersections.length; i++) {
35652                     var obj = cache.intersections[i];
35653                     graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
35654                     graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
35655                     graph = unZorroIntersection(obj, graph);
35656                     graph = removeDuplicateVertices(obj.movedId, graph);
35657                     graph = removeDuplicateVertices(obj.unmovedId, graph);
35658                 }
35659
35660                 return graph;
35661             }
35662
35663
35664             // check if moving way endpoint can cross an unmoved way, if so limit delta..
35665             function limitDelta(graph) {
35666                 function moveNode(loc) {
35667                     return geoVecAdd(projection(loc), _delta);
35668                 }
35669
35670                 for (var i = 0; i < cache.intersections.length; i++) {
35671                     var obj = cache.intersections[i];
35672
35673                     // Don't limit movement if this is vertex joins 2 endpoints..
35674                     if (obj.movedIsEP && obj.unmovedIsEP) continue;
35675                     // Don't limit movement if this vertex is not an endpoint anyway..
35676                     if (!obj.movedIsEP) continue;
35677
35678                     var node = graph.entity(obj.nodeId);
35679                     var start = projection(node.loc);
35680                     var end = geoVecAdd(start, _delta);
35681                     var movedNodes = graph.childNodes(graph.entity(obj.movedId));
35682                     var movedPath = movedNodes.map(function(n) { return moveNode(n.loc); });
35683                     var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
35684                     var unmovedPath = unmovedNodes.map(function(n) { return projection(n.loc); });
35685                     var hits = geoPathIntersections(movedPath, unmovedPath);
35686
35687                     for (var j = 0; i < hits.length; i++) {
35688                         if (geoVecEqual(hits[j], end)) continue;
35689                         var edge = geoChooseEdge(unmovedNodes, end, projection);
35690                         _delta = geoVecSubtract(projection(edge.loc), start);
35691                     }
35692                 }
35693             }
35694
35695
35696             var action = function(graph) {
35697                 if (_delta[0] === 0 && _delta[1] === 0) return graph;
35698
35699                 setupCache(graph);
35700
35701                 if (cache.intersections.length) {
35702                     limitDelta(graph);
35703                 }
35704
35705                 for (var i = 0; i < cache.nodes.length; i++) {
35706                     var node = graph.entity(cache.nodes[i]);
35707                     var start = projection(node.loc);
35708                     var end = geoVecAdd(start, _delta);
35709                     graph = graph.replace(node.move(projection.invert(end)));
35710                 }
35711
35712                 if (cache.intersections.length) {
35713                     graph = cleanupIntersections(graph);
35714                 }
35715
35716                 return graph;
35717             };
35718
35719
35720             action.delta = function() {
35721                 return _delta;
35722             };
35723
35724
35725             return action;
35726         }
35727
35728         function actionMoveMember(relationId, fromIndex, toIndex) {
35729             return function(graph) {
35730                 return graph.replace(graph.entity(relationId).moveMember(fromIndex, toIndex));
35731             };
35732         }
35733
35734         function actionMoveNode(nodeID, toLoc) {
35735
35736             var action = function(graph, t) {
35737                 if (t === null || !isFinite(t)) t = 1;
35738                 t = Math.min(Math.max(+t, 0), 1);
35739
35740                 var node = graph.entity(nodeID);
35741                 return graph.replace(
35742                     node.move(geoVecInterp(node.loc, toLoc, t))
35743                 );
35744             };
35745
35746             action.transitionable = true;
35747
35748             return action;
35749         }
35750
35751         function actionNoop() {
35752             return function(graph) {
35753                 return graph;
35754             };
35755         }
35756
35757         function actionOrthogonalize(wayID, projection, vertexID, degThresh, ep) {
35758             var epsilon = ep || 1e-4;
35759             var threshold = degThresh || 13;  // degrees within right or straight to alter
35760
35761             // We test normalized dot products so we can compare as cos(angle)
35762             var lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180);
35763             var upperThreshold = Math.cos(threshold * Math.PI / 180);
35764
35765
35766             var action = function(graph, t) {
35767                 if (t === null || !isFinite(t)) t = 1;
35768                 t = Math.min(Math.max(+t, 0), 1);
35769
35770                 var way = graph.entity(wayID);
35771                 way = way.removeNode('');   // sanity check - remove any consecutive duplicates
35772
35773                 if (way.tags.nonsquare) {
35774                     var tags = Object.assign({}, way.tags);
35775                     // since we're squaring, remove indication that this is physically unsquare
35776                     delete tags.nonsquare;
35777                     way = way.update({tags: tags});
35778                 }
35779
35780                 graph = graph.replace(way);
35781
35782                 var isClosed = way.isClosed();
35783                 var nodes = graph.childNodes(way).slice();  // shallow copy
35784                 if (isClosed) nodes.pop();
35785
35786                 if (vertexID !== undefined) {
35787                     nodes = nodeSubset(nodes, vertexID, isClosed);
35788                     if (nodes.length !== 3) return graph;
35789                 }
35790
35791                 // note: all geometry functions here use the unclosed node/point/coord list
35792
35793                 var nodeCount = {};
35794                 var points = [];
35795                 var corner = { i: 0, dotp: 1 };
35796                 var node, point, loc, score, motions, i, j;
35797
35798                 for (i = 0; i < nodes.length; i++) {
35799                     node = nodes[i];
35800                     nodeCount[node.id] = (nodeCount[node.id] || 0) + 1;
35801                     points.push({ id: node.id, coord: projection(node.loc) });
35802                 }
35803
35804
35805                 if (points.length === 3) {   // move only one vertex for right triangle
35806                     for (i = 0; i < 1000; i++) {
35807                         motions = points.map(calcMotion);
35808
35809                         points[corner.i].coord = geoVecAdd(points[corner.i].coord, motions[corner.i]);
35810                         score = corner.dotp;
35811                         if (score < epsilon) {
35812                             break;
35813                         }
35814                     }
35815
35816                     node = graph.entity(nodes[corner.i].id);
35817                     loc = projection.invert(points[corner.i].coord);
35818                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35819
35820                 } else {
35821                     var straights = [];
35822                     var simplified = [];
35823
35824                     // Remove points from nearly straight sections..
35825                     // This produces a simplified shape to orthogonalize
35826                     for (i = 0; i < points.length; i++) {
35827                         point = points[i];
35828                         var dotp = 0;
35829                         if (isClosed || (i > 0 && i < points.length - 1)) {
35830                             var a = points[(i - 1 + points.length) % points.length];
35831                             var b = points[(i + 1) % points.length];
35832                             dotp = Math.abs(geoOrthoNormalizedDotProduct(a.coord, b.coord, point.coord));
35833                         }
35834
35835                         if (dotp > upperThreshold) {
35836                             straights.push(point);
35837                         } else {
35838                             simplified.push(point);
35839                         }
35840                     }
35841
35842                     // Orthogonalize the simplified shape
35843                     var bestPoints = clonePoints(simplified);
35844                     var originalPoints = clonePoints(simplified);
35845
35846                     score = Infinity;
35847                     for (i = 0; i < 1000; i++) {
35848                         motions = simplified.map(calcMotion);
35849
35850                         for (j = 0; j < motions.length; j++) {
35851                             simplified[j].coord = geoVecAdd(simplified[j].coord, motions[j]);
35852                         }
35853                         var newScore = geoOrthoCalcScore(simplified, isClosed, epsilon, threshold);
35854                         if (newScore < score) {
35855                             bestPoints = clonePoints(simplified);
35856                             score = newScore;
35857                         }
35858                         if (score < epsilon) {
35859                             break;
35860                         }
35861                     }
35862
35863                     var bestCoords = bestPoints.map(function(p) { return p.coord; });
35864                     if (isClosed) bestCoords.push(bestCoords[0]);
35865
35866                     // move the nodes that should move
35867                     for (i = 0; i < bestPoints.length; i++) {
35868                         point = bestPoints[i];
35869                         if (!geoVecEqual(originalPoints[i].coord, point.coord)) {
35870                             node = graph.entity(point.id);
35871                             loc = projection.invert(point.coord);
35872                             graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35873                         }
35874                     }
35875
35876                     // move the nodes along straight segments
35877                     for (i = 0; i < straights.length; i++) {
35878                         point = straights[i];
35879                         if (nodeCount[point.id] > 1) continue;   // skip self-intersections
35880
35881                         node = graph.entity(point.id);
35882
35883                         if (t === 1 &&
35884                             graph.parentWays(node).length === 1 &&
35885                             graph.parentRelations(node).length === 0 &&
35886                             !node.hasInterestingTags()
35887                         ) {
35888                             // remove uninteresting points..
35889                             graph = actionDeleteNode(node.id)(graph);
35890
35891                         } else {
35892                             // move interesting points to the nearest edge..
35893                             var choice = geoVecProject(point.coord, bestCoords);
35894                             if (choice) {
35895                                 loc = projection.invert(choice.target);
35896                                 graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
35897                             }
35898                         }
35899                     }
35900                 }
35901
35902                 return graph;
35903
35904
35905                 function clonePoints(array) {
35906                     return array.map(function(p) {
35907                         return { id: p.id, coord: [p.coord[0], p.coord[1]] };
35908                     });
35909                 }
35910
35911
35912                 function calcMotion(point, i, array) {
35913                     // don't try to move the endpoints of a non-closed way.
35914                     if (!isClosed && (i === 0 || i === array.length - 1)) return [0, 0];
35915                     // don't try to move a node that appears more than once (self intersection)
35916                     if (nodeCount[array[i].id] > 1) return [0, 0];
35917
35918                     var a = array[(i - 1 + array.length) % array.length].coord;
35919                     var origin = point.coord;
35920                     var b = array[(i + 1) % array.length].coord;
35921                     var p = geoVecSubtract(a, origin);
35922                     var q = geoVecSubtract(b, origin);
35923
35924                     var scale = 2 * Math.min(geoVecLength(p), geoVecLength(q));
35925                     p = geoVecNormalize(p);
35926                     q = geoVecNormalize(q);
35927
35928                     var dotp = (p[0] * q[0] + p[1] * q[1]);
35929                     var val = Math.abs(dotp);
35930
35931                     if (val < lowerThreshold) {  // nearly orthogonal
35932                         corner.i = i;
35933                         corner.dotp = val;
35934                         var vec = geoVecNormalize(geoVecAdd(p, q));
35935                         return geoVecScale(vec, 0.1 * dotp * scale);
35936                     }
35937
35938                     return [0, 0];   // do nothing
35939                 }
35940             };
35941
35942
35943             // if we are only orthogonalizing one vertex,
35944             // get that vertex and the previous and next
35945             function nodeSubset(nodes, vertexID, isClosed) {
35946                 var first = isClosed ? 0 : 1;
35947                 var last = isClosed ? nodes.length : nodes.length - 1;
35948
35949                 for (var i = first; i < last; i++) {
35950                     if (nodes[i].id === vertexID) {
35951                         return [
35952                             nodes[(i - 1 + nodes.length) % nodes.length],
35953                             nodes[i],
35954                             nodes[(i + 1) % nodes.length]
35955                         ];
35956                     }
35957                 }
35958
35959                 return [];
35960             }
35961
35962
35963             action.disabled = function(graph) {
35964                 var way = graph.entity(wayID);
35965                 way = way.removeNode('');  // sanity check - remove any consecutive duplicates
35966                 graph = graph.replace(way);
35967
35968                 var isClosed = way.isClosed();
35969                 var nodes = graph.childNodes(way).slice();  // shallow copy
35970                 if (isClosed) nodes.pop();
35971
35972                 var allowStraightAngles = false;
35973                 if (vertexID !== undefined) {
35974                     allowStraightAngles = true;
35975                     nodes = nodeSubset(nodes, vertexID, isClosed);
35976                     if (nodes.length !== 3) return 'end_vertex';
35977                 }
35978
35979                 var coords = nodes.map(function(n) { return projection(n.loc); });
35980                 var score = geoOrthoCanOrthogonalize(coords, isClosed, epsilon, threshold, allowStraightAngles);
35981
35982                 if (score === null) {
35983                     return 'not_squarish';
35984                 } else if (score === 0) {
35985                     return 'square_enough';
35986                 } else {
35987                     return false;
35988                 }
35989             };
35990
35991
35992             action.transitionable = true;
35993
35994             return action;
35995         }
35996
35997         // `actionRestrictTurn` creates a turn restriction relation.
35998         //
35999         // `turn` must be an `osmTurn` object
36000         // see osm/intersection.js, pathToTurn()
36001         //
36002         // This specifies a restriction of type `restriction` when traveling from
36003         // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
36004         // (The action does not check that these entities form a valid intersection.)
36005         //
36006         // From, to, and via ways should be split before calling this action.
36007         // (old versions of the code would split the ways here, but we no longer do it)
36008         //
36009         // For testing convenience, accepts a restrictionID to assign to the new
36010         // relation. Normally, this will be undefined and the relation will
36011         // automatically be assigned a new ID.
36012         //
36013         function actionRestrictTurn(turn, restrictionType, restrictionID) {
36014
36015             return function(graph) {
36016                 var fromWay = graph.entity(turn.from.way);
36017                 var toWay = graph.entity(turn.to.way);
36018                 var viaNode = turn.via.node && graph.entity(turn.via.node);
36019                 var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
36020                 var members = [];
36021
36022                 members.push({ id: fromWay.id, type: 'way',  role: 'from' });
36023
36024                 if (viaNode) {
36025                     members.push({ id: viaNode.id,  type: 'node', role: 'via' });
36026                 } else if (viaWays) {
36027                     viaWays.forEach(function(viaWay) {
36028                         members.push({ id: viaWay.id,  type: 'way', role: 'via' });
36029                     });
36030                 }
36031
36032                 members.push({ id: toWay.id, type: 'way',  role: 'to' });
36033
36034                 return graph.replace(osmRelation({
36035                     id: restrictionID,
36036                     tags: {
36037                         type: 'restriction',
36038                         restriction: restrictionType
36039                     },
36040                     members: members
36041                 }));
36042             };
36043         }
36044
36045         function actionRevert(id) {
36046             var action = function(graph) {
36047                 var entity = graph.hasEntity(id),
36048                     base = graph.base().entities[id];
36049
36050                 if (entity && !base) {    // entity will be removed..
36051                     if (entity.type === 'node') {
36052                         graph.parentWays(entity)
36053                             .forEach(function(parent) {
36054                                 parent = parent.removeNode(id);
36055                                 graph = graph.replace(parent);
36056
36057                                 if (parent.isDegenerate()) {
36058                                     graph = actionDeleteWay(parent.id)(graph);
36059                                 }
36060                             });
36061                     }
36062
36063                     graph.parentRelations(entity)
36064                         .forEach(function(parent) {
36065                             parent = parent.removeMembersWithID(id);
36066                             graph = graph.replace(parent);
36067
36068                             if (parent.isDegenerate()) {
36069                                 graph = actionDeleteRelation(parent.id)(graph);
36070                             }
36071                         });
36072                 }
36073
36074                 return graph.revert(id);
36075             };
36076
36077             return action;
36078         }
36079
36080         function actionRotate(rotateIds, pivot, angle, projection) {
36081
36082             var action = function(graph) {
36083                 return graph.update(function(graph) {
36084                     utilGetAllNodes(rotateIds, graph).forEach(function(node) {
36085                         var point = geoRotate([projection(node.loc)], angle, pivot)[0];
36086                         graph = graph.replace(node.move(projection.invert(point)));
36087                     });
36088                 });
36089             };
36090
36091             return action;
36092         }
36093
36094         /* Align nodes along their common axis */
36095         function actionStraightenNodes(nodeIDs, projection) {
36096
36097             function positionAlongWay(a, o, b) {
36098                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36099             }
36100
36101
36102             var action = function(graph, t) {
36103                 if (t === null || !isFinite(t)) t = 1;
36104                 t = Math.min(Math.max(+t, 0), 1);
36105
36106                 var nodes = nodeIDs.map(function(id) { return graph.entity(id); });
36107                 var points = nodes.map(function(n) { return projection(n.loc); });
36108                 var ssr = geoGetSmallestSurroundingRectangle(points);
36109
36110                 // Choose line pq = axis of symmetry.
36111                 // The shape's surrounding rectangle has 2 axes of symmetry.
36112                 // Snap points to the long axis
36113                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36114                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36115                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36116                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36117                 var p, q;
36118
36119                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36120                 if (isLong) {
36121                     p = p1;
36122                     q = q1;
36123                 } else {
36124                     p = p2;
36125                     q = q2;
36126                 }
36127
36128                 // Move points onto line pq
36129                 for (var i = 0; i < points.length; i++) {
36130                     var node = nodes[i];
36131                     var point = points[i];
36132                     var u = positionAlongWay(point, p, q);
36133                     var point2 = geoVecInterp(p, q, u);
36134                     var loc2 = projection.invert(point2);
36135                     graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36136                 }
36137
36138                 return graph;
36139             };
36140
36141
36142             action.disabled = function() {
36143                 return false;
36144             };
36145
36146
36147             action.transitionable = true;
36148
36149
36150             return action;
36151         }
36152
36153         /*
36154          * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
36155          */
36156         function actionStraightenWay(selectedIDs, projection) {
36157
36158             function positionAlongWay(a, o, b) {
36159                 return geoVecDot(a, b, o) / geoVecDot(b, b, o);
36160             }
36161
36162             // Return all selected ways as a continuous, ordered array of nodes
36163             function allNodes(graph) {
36164                 var nodes = [];
36165                 var startNodes = [];
36166                 var endNodes = [];
36167                 var remainingWays = [];
36168                 var selectedWays = selectedIDs.filter(function(w) {
36169                     return graph.entity(w).type === 'way';
36170                 });
36171                 var selectedNodes = selectedIDs.filter(function(n) {
36172                     return graph.entity(n).type === 'node';
36173                 });
36174
36175                 for (var i = 0; i < selectedWays.length; i++) {
36176                     var way = graph.entity(selectedWays[i]);
36177                     nodes = way.nodes.slice(0);
36178                     remainingWays.push(nodes);
36179                     startNodes.push(nodes[0]);
36180                     endNodes.push(nodes[nodes.length-1]);
36181                 }
36182
36183                 // Remove duplicate end/startNodes (duplicate nodes cannot be at the line end,
36184                 //   and need to be removed so currNode difference calculation below works)
36185                 // i.e. ["n-1", "n-1", "n-2"] => ["n-2"]
36186                 startNodes = startNodes.filter(function(n) {
36187                     return startNodes.indexOf(n) === startNodes.lastIndexOf(n);
36188                 });
36189                 endNodes = endNodes.filter(function(n) {
36190                     return endNodes.indexOf(n) === endNodes.lastIndexOf(n);
36191                 });
36192
36193                 // Choose the initial endpoint to start from
36194                 var currNode = utilArrayDifference(startNodes, endNodes)
36195                     .concat(utilArrayDifference(endNodes, startNodes))[0];
36196                 var nextWay = [];
36197                 nodes = [];
36198
36199                 // Create nested function outside of loop to avoid "function in loop" lint error
36200                 var getNextWay = function(currNode, remainingWays) {
36201                     return remainingWays.filter(function(way) {
36202                         return way[0] === currNode || way[way.length-1] === currNode;
36203                     })[0];
36204                 };
36205
36206                 // Add nodes to end of nodes array, until all ways are added
36207                 while (remainingWays.length) {
36208                     nextWay = getNextWay(currNode, remainingWays);
36209                     remainingWays = utilArrayDifference(remainingWays, [nextWay]);
36210
36211                     if (nextWay[0] !== currNode) {
36212                         nextWay.reverse();
36213                     }
36214                     nodes = nodes.concat(nextWay);
36215                     currNode = nodes[nodes.length-1];
36216                 }
36217
36218                 // If user selected 2 nodes to straighten between, then slice nodes array to those nodes
36219                 if (selectedNodes.length === 2) {
36220                     var startNodeIdx = nodes.indexOf(selectedNodes[0]);
36221                     var endNodeIdx = nodes.indexOf(selectedNodes[1]);
36222                     var sortedStartEnd = [startNodeIdx, endNodeIdx];
36223
36224                     sortedStartEnd.sort(function(a, b) { return a - b; });
36225                     nodes = nodes.slice(sortedStartEnd[0], sortedStartEnd[1]+1);
36226                 }
36227
36228                 return nodes.map(function(n) { return graph.entity(n); });
36229             }
36230
36231
36232             var action = function(graph, t) {
36233                 if (t === null || !isFinite(t)) t = 1;
36234                 t = Math.min(Math.max(+t, 0), 1);
36235
36236                 var nodes = allNodes(graph);
36237                 var points = nodes.map(function(n) { return projection(n.loc); });
36238                 var startPoint = points[0];
36239                 var endPoint = points[points.length-1];
36240                 var toDelete = [];
36241                 var i;
36242
36243                 for (i = 1; i < points.length-1; i++) {
36244                     var node = nodes[i];
36245                     var point = points[i];
36246
36247                     if (t < 1 || graph.parentWays(node).length > 1 ||
36248                         graph.parentRelations(node).length ||
36249                         node.hasInterestingTags()
36250                     ) {
36251                         var u = positionAlongWay(point, startPoint, endPoint);
36252                         var p = geoVecInterp(startPoint, endPoint, u);
36253                         var loc2 = projection.invert(p);
36254                         graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
36255
36256                     } else {
36257                         // safe to delete
36258                         if (toDelete.indexOf(node) === -1) {
36259                             toDelete.push(node);
36260                         }
36261                     }
36262                 }
36263
36264                 for (i = 0; i < toDelete.length; i++) {
36265                     graph = actionDeleteNode(toDelete[i].id)(graph);
36266                 }
36267
36268                 return graph;
36269             };
36270
36271
36272             action.disabled = function(graph) {
36273                 // check way isn't too bendy
36274                 var nodes = allNodes(graph);
36275                 var points = nodes.map(function(n) { return projection(n.loc); });
36276                 var startPoint = points[0];
36277                 var endPoint = points[points.length-1];
36278                 var threshold = 0.2 * geoVecLength(startPoint, endPoint);
36279                 var i;
36280
36281                 if (threshold === 0) {
36282                     return 'too_bendy';
36283                 }
36284
36285                 for (i = 1; i < points.length - 1; i++) {
36286                     var point = points[i];
36287                     var u = positionAlongWay(point, startPoint, endPoint);
36288                     var p = geoVecInterp(startPoint, endPoint, u);
36289                     var dist = geoVecLength(p, point);
36290
36291                     // to bendy if point is off by 20% of total start/end distance in projected space
36292                     if (isNaN(dist) || dist > threshold) {
36293                         return 'too_bendy';
36294                     }
36295                 }
36296             };
36297
36298             action.transitionable = true;
36299
36300
36301             return action;
36302         }
36303
36304         // `actionUnrestrictTurn` deletes a turn restriction relation.
36305         //
36306         // `turn` must be an `osmTurn` object with a `restrictionID` property.
36307         // see osm/intersection.js, pathToTurn()
36308         //
36309         function actionUnrestrictTurn(turn) {
36310             return function(graph) {
36311                 return actionDeleteRelation(turn.restrictionID)(graph);
36312             };
36313         }
36314
36315         /* Reflect the given area around its axis of symmetry */
36316         function actionReflect(reflectIds, projection) {
36317             var _useLongAxis = true;
36318
36319
36320             var action = function(graph, t) {
36321                 if (t === null || !isFinite(t)) t = 1;
36322                 t = Math.min(Math.max(+t, 0), 1);
36323
36324                 var nodes = utilGetAllNodes(reflectIds, graph);
36325                 var points = nodes.map(function(n) { return projection(n.loc); });
36326                 var ssr = geoGetSmallestSurroundingRectangle(points);
36327
36328                 // Choose line pq = axis of symmetry.
36329                 // The shape's surrounding rectangle has 2 axes of symmetry.
36330                 // Reflect across the longer axis by default.
36331                 var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ];
36332                 var q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ];
36333                 var p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ];
36334                 var q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ];
36335                 var p, q;
36336
36337                 var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
36338                 if ((_useLongAxis && isLong) || (!_useLongAxis && !isLong)) {
36339                     p = p1;
36340                     q = q1;
36341                 } else {
36342                     p = p2;
36343                     q = q2;
36344                 }
36345
36346                 // reflect c across pq
36347                 // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
36348                 var dx = q[0] - p[0];
36349                 var dy = q[1] - p[1];
36350                 var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
36351                 var b = 2 * dx * dy / (dx * dx + dy * dy);
36352                 for (var i = 0; i < nodes.length; i++) {
36353                     var node = nodes[i];
36354                     var c = projection(node.loc);
36355                     var c2 = [
36356                         a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
36357                         b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
36358                     ];
36359                     var loc2 = projection.invert(c2);
36360                     node = node.move(geoVecInterp(node.loc, loc2, t));
36361                     graph = graph.replace(node);
36362                 }
36363
36364                 return graph;
36365             };
36366
36367
36368             action.useLongAxis = function(val) {
36369                 if (!arguments.length) return _useLongAxis;
36370                 _useLongAxis = val;
36371                 return action;
36372             };
36373
36374
36375             action.transitionable = true;
36376
36377
36378             return action;
36379         }
36380
36381         function actionUpgradeTags(entityId, oldTags, replaceTags) {
36382
36383             return function(graph) {
36384                 var entity = graph.entity(entityId);
36385                 var tags = Object.assign({}, entity.tags);  // shallow copy
36386                 var transferValue;
36387                 var semiIndex;
36388
36389                 for (var oldTagKey in oldTags) {
36390                     if (oldTags[oldTagKey] === '*') {
36391                         transferValue = tags[oldTagKey];
36392                         delete tags[oldTagKey];
36393                     } else {
36394                         var vals = tags[oldTagKey].split(';').filter(Boolean);
36395                         var oldIndex = vals.indexOf(oldTags[oldTagKey]);
36396                         if (vals.length === 1 || oldIndex === -1) {
36397                             delete tags[oldTagKey];
36398                         } else {
36399                             if (replaceTags && replaceTags[oldTagKey]) {
36400                                 // replacing a value within a semicolon-delimited value, note the index
36401                                 semiIndex = oldIndex;
36402                             }
36403                             vals.splice(oldIndex, 1);
36404                             tags[oldTagKey] = vals.join(';');
36405                         }
36406                     }
36407                 }
36408
36409                 if (replaceTags) {
36410                     for (var replaceKey in replaceTags) {
36411                         var replaceValue = replaceTags[replaceKey];
36412                         if (replaceValue === '*') {
36413                             if (tags[replaceKey]) {
36414                                 // any value is okay and there already
36415                                 // is one, so don't update it
36416                                 continue;
36417                             } else {
36418                                 // otherwise assume `yes` is okay
36419                                 tags[replaceKey] = 'yes';
36420                             }
36421                         } else if (replaceValue === '$1') {
36422                             tags[replaceKey] = transferValue;
36423                         } else {
36424                             if (tags[replaceKey] && oldTags[replaceKey] && semiIndex !== undefined) {
36425                                 // don't override preexisting values
36426                                 var existingVals = tags[replaceKey].split(';').filter(Boolean);
36427                                 if (existingVals.indexOf(replaceValue) === -1) {
36428                                     existingVals.splice(semiIndex, 0, replaceValue);
36429                                     tags[replaceKey] = existingVals.join(';');
36430                                 }
36431                             } else {
36432                                 tags[replaceKey] = replaceValue;
36433                             }
36434                         }
36435                     }
36436                 }
36437
36438                 return graph.replace(entity.update({ tags: tags }));
36439             };
36440         }
36441
36442         function behaviorEdit(context) {
36443
36444             function behavior() {
36445                 context.map()
36446                     .minzoom(context.minEditableZoom());
36447             }
36448
36449
36450             behavior.off = function() {
36451                 context.map()
36452                     .minzoom(0);
36453             };
36454
36455             return behavior;
36456         }
36457
36458         /*
36459            The hover behavior adds the `.hover` class on mouseover to all elements to which
36460            the identical datum is bound, and removes it on mouseout.
36461
36462            The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
36463            representation may consist of several elements scattered throughout the DOM hierarchy.
36464            Only one of these elements can have the :hover pseudo-class, but all of them will
36465            have the .hover class.
36466          */
36467         function behaviorHover(context) {
36468             var dispatch$1 = dispatch('hover');
36469             var _selection = d3_select(null);
36470             var _newNodeId = null;
36471             var _initialNodeID = null;
36472             var _buttonDown;
36473             var _altDisables;
36474             var _ignoreVertex;
36475             var _target;
36476
36477
36478             function keydown() {
36479                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36480                     _selection.selectAll('.hover')
36481                         .classed('hover-suppressed', true)
36482                         .classed('hover', false);
36483
36484                     _selection
36485                         .classed('hover-disabled', true);
36486
36487                     dispatch$1.call('hover', this, null);
36488                 }
36489             }
36490
36491
36492             function keyup() {
36493                 if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
36494                     _selection.selectAll('.hover-suppressed')
36495                         .classed('hover-suppressed', false)
36496                         .classed('hover', true);
36497
36498                     _selection
36499                         .classed('hover-disabled', false);
36500
36501                     dispatch$1.call('hover', this, _target ? _target.id : null);
36502                 }
36503             }
36504
36505
36506             function behavior(selection) {
36507                 _selection = selection;
36508
36509                 if (_initialNodeID) {
36510                     _newNodeId = _initialNodeID;
36511                     _initialNodeID = null;
36512                 } else {
36513                     _newNodeId = null;
36514                 }
36515
36516                 _selection
36517                     .on('mouseover.hover', mouseover)
36518                     .on('mouseout.hover', mouseout)
36519                     .on('mousedown.hover', mousedown);
36520
36521                 d3_select(window)
36522                     .on('keydown.hover', keydown)
36523                     .on('keyup.hover', keyup);
36524
36525
36526                 function mouseover() {
36527                     if (_buttonDown) return;
36528                     var target = event.target;
36529                     enter(target ? target.__data__ : null);
36530                 }
36531
36532
36533                 function mouseout() {
36534                     if (_buttonDown) return;
36535                     var target = event.relatedTarget;
36536                     enter(target ? target.__data__ : null);
36537                 }
36538
36539
36540                 function mousedown() {
36541                     _buttonDown = true;
36542                     d3_select(window)
36543                         .on('mouseup.hover', mouseup, true);
36544                 }
36545
36546
36547                 function mouseup() {
36548                     _buttonDown = false;
36549                     d3_select(window)
36550                         .on('mouseup.hover', null, true);
36551                 }
36552
36553                 function allowsVertex(d) {
36554                     return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36555                 }
36556
36557                 function modeAllowsHover(target) {
36558                     var mode = context.mode();
36559                     if (mode.id === 'add-point') {
36560                         return mode.preset.matchGeometry('vertex') ||
36561                             (target.type !== 'way' && target.geometry(context.graph()) !== 'vertex');
36562                     }
36563                     return true;
36564                 }
36565
36566                 function enter(datum) {
36567                     if (datum === _target) return;
36568                     _target = datum;
36569
36570                     _selection.selectAll('.hover')
36571                         .classed('hover', false);
36572                     _selection.selectAll('.hover-suppressed')
36573                         .classed('hover-suppressed', false);
36574
36575                     // What are we hovering over?
36576                     var entity, selector;
36577                     if (datum && datum.__featurehash__) {
36578                         entity = datum;
36579                         selector = '.data' + datum.__featurehash__;
36580
36581                     } else if (datum instanceof qaError) {
36582                         entity = datum;
36583                         selector = '.' + datum.service + '.error_id-' + datum.id;
36584
36585                     } else if (datum instanceof osmNote) {
36586                         entity = datum;
36587                         selector = '.note-' + datum.id;
36588
36589                     } else if (datum instanceof osmEntity) {
36590                         entity = datum;
36591                         selector = '.' + entity.id;
36592                         if (entity.type === 'relation') {
36593                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36594                         }
36595                     } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity)) {
36596                         entity = datum.properties.entity;
36597                         selector = '.' + entity.id;
36598                         if (entity.type === 'relation') {
36599                             entity.members.forEach(function(member) { selector += ', .' + member.id; });
36600                         }
36601                     }
36602
36603                     var mode = context.mode();
36604
36605                     // Update hover state and dispatch event
36606                     if (entity && entity.id !== _newNodeId) {
36607                         // If drawing a way, don't hover on a node that was just placed. #3974
36608
36609                         if ((mode.id === 'draw-line' || mode.id === 'draw-area') && !_newNodeId && entity.type === 'node') {
36610                             _newNodeId = entity.id;
36611                             return;
36612                         }
36613
36614                         var suppressed = (_altDisables && event && event.altKey) ||
36615                             (entity.type === 'node' && _ignoreVertex && !allowsVertex(entity)) ||
36616                             !modeAllowsHover(entity);
36617                         _selection.selectAll(selector)
36618                             .classed(suppressed ? 'hover-suppressed' : 'hover', true);
36619
36620                         dispatch$1.call('hover', this, !suppressed && entity);
36621
36622                     } else {
36623                         dispatch$1.call('hover', this, null);
36624                     }
36625                 }
36626             }
36627
36628
36629             behavior.off = function(selection) {
36630                 selection.selectAll('.hover')
36631                     .classed('hover', false);
36632                 selection.selectAll('.hover-suppressed')
36633                     .classed('hover-suppressed', false);
36634                 selection
36635                     .classed('hover-disabled', false);
36636
36637                 selection
36638                     .on('mouseover.hover', null)
36639                     .on('mouseout.hover', null)
36640                     .on('mousedown.hover', null);
36641
36642                 d3_select(window)
36643                     .on('keydown.hover', null)
36644                     .on('keyup.hover', null);
36645             };
36646
36647
36648             behavior.altDisables = function(val) {
36649                 if (!arguments.length) return _altDisables;
36650                 _altDisables = val;
36651                 return behavior;
36652             };
36653
36654             behavior.ignoreVertex = function(val) {
36655                 if (!arguments.length) return _ignoreVertex;
36656                 _ignoreVertex = val;
36657                 return behavior;
36658             };
36659
36660             behavior.initialNodeID = function(nodeId) {
36661                 _initialNodeID = nodeId;
36662                 return behavior;
36663             };
36664
36665             return utilRebind(behavior, dispatch$1, 'on');
36666         }
36667
36668         function refresh(selection, node) {
36669             var cr = node.getBoundingClientRect();
36670             var prop = [cr.width, cr.height];
36671             selection.property('__dimensions__', prop);
36672             return prop;
36673         }
36674
36675         function utilGetDimensions(selection, force) {
36676             if (!selection || selection.empty()) {
36677                 return [0, 0];
36678             }
36679             var node = selection.node(),
36680                 cached = selection.property('__dimensions__');
36681             return (!cached || force) ? refresh(selection, node) : cached;
36682         }
36683
36684
36685         function utilSetDimensions(selection, dimensions) {
36686             if (!selection || selection.empty()) {
36687                 return selection;
36688             }
36689             var node = selection.node();
36690             if (dimensions === null) {
36691                 refresh(selection, node);
36692                 return selection;
36693             }
36694             return selection
36695                 .property('__dimensions__', [dimensions[0], dimensions[1]])
36696                 .attr('width', dimensions[0])
36697                 .attr('height', dimensions[1]);
36698         }
36699
36700         function behaviorTail() {
36701             var container;
36702             var xmargin = 25;
36703             var tooltipSize = [0, 0];
36704             var selectionSize = [0, 0];
36705             var _text;
36706
36707
36708             function behavior(selection) {
36709                 if (!_text) return;
36710
36711                 d3_select(window)
36712                     .on('resize.tail', function() { selectionSize = utilGetDimensions(selection); });
36713
36714                 container = d3_select(document.body)
36715                     .append('div')
36716                     .style('display', 'none')
36717                     .attr('class', 'tail tooltip-inner');
36718
36719                 container.append('div')
36720                     .text(_text);
36721
36722                 selection
36723                     .on('mousemove.tail', mousemove)
36724                     .on('mouseenter.tail', mouseenter)
36725                     .on('mouseleave.tail', mouseleave);
36726
36727                 container
36728                     .on('mousemove.tail', mousemove);
36729
36730                 tooltipSize = utilGetDimensions(container);
36731                 selectionSize = utilGetDimensions(selection);
36732
36733
36734                 function show() {
36735                     container.style('display', 'block');
36736                     tooltipSize = utilGetDimensions(container);
36737                 }
36738
36739
36740                 function mousemove() {
36741                     if (container.style('display') === 'none') show();
36742                     var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
36743                         -tooltipSize[0] - xmargin : xmargin;
36744                     container.classed('left', xoffset > 0);
36745                     utilSetTransform(container, event.clientX + xoffset, event.clientY);
36746                 }
36747
36748
36749                 function mouseleave() {
36750                     if (event.relatedTarget !== container.node()) {
36751                         container.style('display', 'none');
36752                     }
36753                 }
36754
36755
36756                 function mouseenter() {
36757                     if (event.relatedTarget !== container.node()) {
36758                         show();
36759                     }
36760                 }
36761             }
36762
36763
36764             behavior.off = function(selection) {
36765                 if (!_text) return;
36766
36767                 container
36768                     .on('mousemove.tail', null)
36769                     .remove();
36770
36771                 selection
36772                     .on('mousemove.tail', null)
36773                     .on('mouseenter.tail', null)
36774                     .on('mouseleave.tail', null);
36775
36776                 d3_select(window)
36777                     .on('resize.tail', null);
36778             };
36779
36780
36781             behavior.text = function(val) {
36782                 if (!arguments.length) return _text;
36783                 _text = val;
36784                 return behavior;
36785             };
36786
36787
36788             return behavior;
36789         }
36790
36791         var _usedTails = {};
36792         var _disableSpace = false;
36793         var _lastSpace = null;
36794
36795
36796         function behaviorDraw(context) {
36797             var dispatch$1 = dispatch(
36798                 'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
36799             );
36800
36801             var keybinding = utilKeybinding('draw');
36802
36803             var _hover = behaviorHover(context).altDisables(true).ignoreVertex(true)
36804                 .on('hover', context.ui().sidebar.hover);
36805             var tail = behaviorTail();
36806             var edit = behaviorEdit(context);
36807
36808             var closeTolerance = 4;
36809             var tolerance = 12;
36810             var _mouseLeave = false;
36811             var _lastMouse = null;
36812
36813
36814             // related code
36815             // - `mode/drag_node.js` `datum()`
36816             function datum() {
36817                 var mode = context.mode();
36818                 var isNote = mode && (mode.id.indexOf('note') !== -1);
36819                 if (event.altKey || isNote) return {};
36820
36821                 var element;
36822                 if (event.type === 'keydown') {
36823                     element = _lastMouse && _lastMouse.target;
36824                 } else {
36825                     element = event.target;
36826                 }
36827
36828                 // When drawing, snap only to touch targets..
36829                 // (this excludes area fills and active drawing elements)
36830                 var d = element.__data__;
36831                 return (d && d.properties && d.properties.target) ? d : {};
36832             }
36833
36834
36835             function mousedown() {
36836
36837                 function point() {
36838                     var p = context.container().node();
36839                     return touchId !== null ? d3_touches(p).filter(function(p) {
36840                         return p.identifier === touchId;
36841                     })[0] : d3_mouse(p);
36842                 }
36843
36844                 var element = d3_select(this);
36845                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
36846                 var t1 = +new Date();
36847                 var p1 = point();
36848
36849                 element.on('mousemove.draw', null);
36850
36851                 d3_select(window).on('mouseup.draw', function() {
36852                     var t2 = +new Date();
36853                     var p2 = point();
36854                     var dist = geoVecLength(p1, p2);
36855
36856                     element.on('mousemove.draw', mousemove);
36857                     d3_select(window).on('mouseup.draw', null);
36858
36859                     if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
36860                         // Prevent a quick second click
36861                         d3_select(window).on('click.draw-block', function() {
36862                             event.stopPropagation();
36863                         }, true);
36864
36865                         context.map().dblclickEnable(false);
36866
36867                         window.setTimeout(function() {
36868                             context.map().dblclickEnable(true);
36869                             d3_select(window).on('click.draw-block', null);
36870                         }, 500);
36871
36872                         click();
36873                     }
36874                 }, true);
36875             }
36876
36877
36878             function mousemove() {
36879                 _lastMouse = event;
36880                 dispatch$1.call('move', this, datum());
36881             }
36882
36883
36884             function mouseenter() {
36885                 _mouseLeave = false;
36886             }
36887
36888
36889             function mouseleave() {
36890                 _mouseLeave = true;
36891             }
36892
36893             function allowsVertex(d) {
36894                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
36895             }
36896
36897             // related code
36898             // - `mode/drag_node.js`     `doMode()`
36899             // - `behavior/draw.js`      `click()`
36900             // - `behavior/draw_way.js`  `move()`
36901             function click() {
36902                 var d = datum();
36903                 var target = d && d.properties && d.properties.entity;
36904
36905                 var mode = context.mode();
36906
36907                 if (target && target.type === 'node' && allowsVertex(target)) {   // Snap to a node
36908                     dispatch$1.call('clickNode', this, target, d);
36909                     return;
36910
36911                 } else if (target && target.type === 'way' && (mode.id !== 'add-point' || mode.preset.matchGeometry('vertex'))) {   // Snap to a way
36912                     var choice = geoChooseEdge(
36913                         context.childNodes(target), context.mouse(), context.projection, context.activeID()
36914                     );
36915                     if (choice) {
36916                         var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
36917                         dispatch$1.call('clickWay', this, choice.loc, edge, d);
36918                         return;
36919                     }
36920                 } else if (mode.id !== 'add-point' || mode.preset.matchGeometry('point')) {
36921                     dispatch$1.call('click', this, context.map().mouseCoordinates(), d);
36922                 }
36923
36924             }
36925
36926
36927             function space() {
36928                 event.preventDefault();
36929                 event.stopPropagation();
36930
36931                 var currSpace = context.mouse();
36932                 if (_disableSpace && _lastSpace) {
36933                     var dist = geoVecLength(_lastSpace, currSpace);
36934                     if (dist > tolerance) {
36935                         _disableSpace = false;
36936                     }
36937                 }
36938
36939                 if (_disableSpace || _mouseLeave || !_lastMouse) return;
36940
36941                 // user must move mouse or release space bar to allow another click
36942                 _lastSpace = currSpace;
36943                 _disableSpace = true;
36944
36945                 d3_select(window).on('keyup.space-block', function() {
36946                     event.preventDefault();
36947                     event.stopPropagation();
36948                     _disableSpace = false;
36949                     d3_select(window).on('keyup.space-block', null);
36950                 });
36951
36952                 click();
36953             }
36954
36955
36956             function backspace() {
36957                 event.preventDefault();
36958                 dispatch$1.call('undo');
36959             }
36960
36961
36962             function del() {
36963                 event.preventDefault();
36964                 dispatch$1.call('cancel');
36965             }
36966
36967
36968             function ret() {
36969                 event.preventDefault();
36970                 dispatch$1.call('finish');
36971             }
36972
36973
36974             function behavior(selection) {
36975                 context.install(_hover);
36976                 context.install(edit);
36977
36978                 if (!context.inIntro() && !_usedTails[tail.text()]) {
36979                     context.install(tail);
36980                 }
36981
36982                 keybinding
36983                     .on('⌫', backspace)
36984                     .on('⌦', del)
36985                     .on('⎋', ret)
36986                     .on('↩', ret)
36987                     .on('space', space)
36988                     .on('⌥space', space);
36989
36990                 selection
36991                     .on('mouseenter.draw', mouseenter)
36992                     .on('mouseleave.draw', mouseleave)
36993                     .on('mousedown.draw', mousedown)
36994                     .on('mousemove.draw', mousemove);
36995
36996                 d3_select(document)
36997                     .call(keybinding);
36998
36999                 return behavior;
37000             }
37001
37002
37003             behavior.off = function(selection) {
37004                 context.ui().sidebar.hover.cancel();
37005                 context.uninstall(_hover);
37006                 context.uninstall(edit);
37007
37008                 if (!context.inIntro() && !_usedTails[tail.text()]) {
37009                     context.uninstall(tail);
37010                     _usedTails[tail.text()] = true;
37011                 }
37012
37013                 selection
37014                     .on('mouseenter.draw', null)
37015                     .on('mouseleave.draw', null)
37016                     .on('mousedown.draw', null)
37017                     .on('mousemove.draw', null);
37018
37019                 d3_select(window)
37020                     .on('mouseup.draw', null);
37021                     // note: keyup.space-block, click.draw-block should remain
37022
37023                 d3_select(document)
37024                     .call(keybinding.unbind);
37025             };
37026
37027
37028             behavior.tail = function(_) {
37029                 tail.text(_);
37030                 return behavior;
37031             };
37032
37033             behavior.hover = function() {
37034                 return _hover;
37035             };
37036
37037
37038             return utilRebind(behavior, dispatch$1, 'on');
37039         }
37040
37041         function behaviorBreathe() {
37042             var duration = 800;
37043             var steps = 4;
37044             var selector = '.selected.shadow, .selected .shadow';
37045             var _selected = d3_select(null);
37046             var _classed = '';
37047             var _params = {};
37048             var _done = false;
37049             var _timer;
37050
37051
37052             function ratchetyInterpolator(a, b, steps, units) {
37053                 a = parseFloat(a);
37054                 b = parseFloat(b);
37055                 var sample = quantize()
37056                     .domain([0, 1])
37057                     .range(d3_quantize(d3_interpolateNumber(a, b), steps));
37058
37059                 return function(t) {
37060                     return String(sample(t)) + (units || '');
37061                 };
37062             }
37063
37064
37065             function reset(selection) {
37066                 selection
37067                     .style('stroke-opacity', null)
37068                     .style('stroke-width', null)
37069                     .style('fill-opacity', null)
37070                     .style('r', null);
37071             }
37072
37073
37074             function setAnimationParams(transition, fromTo) {
37075                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37076
37077                 transition
37078                     .styleTween('stroke-opacity', function(d) {
37079                         return ratchetyInterpolator(
37080                             _params[d.id][toFrom].opacity,
37081                             _params[d.id][fromTo].opacity,
37082                             steps
37083                         );
37084                     })
37085                     .styleTween('stroke-width', function(d) {
37086                         return ratchetyInterpolator(
37087                             _params[d.id][toFrom].width,
37088                             _params[d.id][fromTo].width,
37089                             steps,
37090                             'px'
37091                         );
37092                     })
37093                     .styleTween('fill-opacity', function(d) {
37094                         return ratchetyInterpolator(
37095                             _params[d.id][toFrom].opacity,
37096                             _params[d.id][fromTo].opacity,
37097                             steps
37098                         );
37099                     })
37100                     .styleTween('r', function(d) {
37101                         return ratchetyInterpolator(
37102                             _params[d.id][toFrom].width,
37103                             _params[d.id][fromTo].width,
37104                             steps,
37105                             'px'
37106                         );
37107                     });
37108             }
37109
37110
37111             function calcAnimationParams(selection) {
37112                 selection
37113                     .call(reset)
37114                     .each(function(d) {
37115                         var s = d3_select(this);
37116                         var tag = s.node().tagName;
37117                         var p = {'from': {}, 'to': {}};
37118                         var opacity;
37119                         var width;
37120
37121                         // determine base opacity and width
37122                         if (tag === 'circle') {
37123                             opacity = parseFloat(s.style('fill-opacity') || 0.5);
37124                             width = parseFloat(s.style('r') || 15.5);
37125                         } else {
37126                             opacity = parseFloat(s.style('stroke-opacity') || 0.7);
37127                             width = parseFloat(s.style('stroke-width') || 10);
37128                         }
37129
37130                         // calculate from/to interpolation params..
37131                         p.tag = tag;
37132                         p.from.opacity = opacity * 0.6;
37133                         p.to.opacity = opacity * 1.25;
37134                         p.from.width = width * 0.7;
37135                         p.to.width = width * (tag === 'circle' ? 1.5 : 1);
37136                         _params[d.id] = p;
37137                     });
37138             }
37139
37140
37141             function run(surface, fromTo) {
37142                 var toFrom = (fromTo === 'from' ? 'to' : 'from');
37143                 var currSelected = surface.selectAll(selector);
37144                 var currClassed = surface.attr('class');
37145
37146                 if (_done || currSelected.empty()) {
37147                     _selected.call(reset);
37148                     return;
37149                 }
37150
37151                 if (!fastDeepEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
37152                     _selected.call(reset);
37153                     _classed = currClassed;
37154                     _selected = currSelected.call(calcAnimationParams);
37155                 }
37156
37157                 _selected
37158                     .transition()
37159                     .duration(duration)
37160                     .call(setAnimationParams, fromTo)
37161                     .on('end', function() {
37162                         surface.call(run, toFrom);
37163                     });
37164             }
37165
37166
37167             function behavior(surface) {
37168                 _done = false;
37169                 _timer = timer(function() {
37170                     // wait for elements to actually become selected
37171                     if (surface.selectAll(selector).empty()) {
37172                         return false;
37173                     }
37174
37175                     surface.call(run, 'from');
37176                     _timer.stop();
37177                     return true;
37178                 }, 20);
37179             }
37180
37181
37182             behavior.off = function() {
37183                 _done = true;
37184                 if (_timer) {
37185                     _timer.stop();
37186                 }
37187                 _selected
37188                     .interrupt()
37189                     .call(reset);
37190             };
37191
37192
37193             return behavior;
37194         }
37195
37196         // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
37197         // For example, ⌘Z -> Ctrl+Z
37198         var uiCmd = function (code) {
37199             var detected = utilDetect();
37200
37201             if (detected.os === 'mac') {
37202                 return code;
37203             }
37204
37205             if (detected.os === 'win') {
37206                 if (code === '⌘⇧Z') return 'Ctrl+Y';
37207             }
37208
37209             var result = '',
37210                 replacements = {
37211                     '⌘': 'Ctrl',
37212                     '⇧': 'Shift',
37213                     '⌥': 'Alt',
37214                     '⌫': 'Backspace',
37215                     '⌦': 'Delete'
37216                 };
37217
37218             for (var i = 0; i < code.length; i++) {
37219                 if (code[i] in replacements) {
37220                     result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
37221                 } else {
37222                     result += code[i];
37223                 }
37224             }
37225
37226             return result;
37227         };
37228
37229
37230         // return a display-focused string for a given keyboard code
37231         uiCmd.display = function(code) {
37232             if (code.length !== 1) return code;
37233
37234             var detected = utilDetect();
37235             var mac = (detected.os === 'mac');
37236             var replacements = {
37237                 '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
37238                 '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
37239                 '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
37240                 '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
37241                 '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
37242                 '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
37243                 '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
37244                 '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
37245                 '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
37246                 '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
37247                 '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
37248                 '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
37249             };
37250
37251             return replacements[code] || code;
37252         };
37253
37254         function behaviorCopy(context) {
37255
37256             function groupEntities(ids, graph) {
37257                 var entities = ids.map(function (id) { return graph.entity(id); });
37258                 return Object.assign(
37259                     { relation: [], way: [], node: [] },
37260                     utilArrayGroupBy(entities, 'type')
37261                 );
37262             }
37263
37264
37265             function getDescendants(id, graph, descendants) {
37266                 var entity = graph.entity(id);
37267                 var children;
37268
37269                 descendants = descendants || {};
37270
37271                 if (entity.type === 'relation') {
37272                     children = entity.members.map(function(m) { return m.id; });
37273                 } else if (entity.type === 'way') {
37274                     children = entity.nodes;
37275                 } else {
37276                     children = [];
37277                 }
37278
37279                 for (var i = 0; i < children.length; i++) {
37280                     if (!descendants[children[i]]) {
37281                         descendants[children[i]] = true;
37282                         descendants = getDescendants(children[i], graph, descendants);
37283                     }
37284                 }
37285
37286                 return descendants;
37287             }
37288
37289
37290             function getSelectionText() {
37291                 return window.getSelection().toString();
37292             }
37293
37294
37295             function doCopy() {
37296                 if (!getSelectionText()) {
37297                     event.preventDefault();
37298                 }
37299
37300                 var graph = context.graph();
37301                 var selected = groupEntities(context.selectedIDs(), graph);
37302                 var canCopy = [];
37303                 var skip = {};
37304                 var entity;
37305                 var i;
37306
37307                 for (i = 0; i < selected.relation.length; i++) {
37308                     entity = selected.relation[i];
37309                     if (!skip[entity.id] && entity.isComplete(graph)) {
37310                         canCopy.push(entity.id);
37311                         skip = getDescendants(entity.id, graph, skip);
37312                     }
37313                 }
37314                 for (i = 0; i < selected.way.length; i++) {
37315                     entity = selected.way[i];
37316                     if (!skip[entity.id]) {
37317                         canCopy.push(entity.id);
37318                         skip = getDescendants(entity.id, graph, skip);
37319                     }
37320                 }
37321                 for (i = 0; i < selected.node.length; i++) {
37322                     entity = selected.node[i];
37323                     if (!skip[entity.id]) {
37324                         canCopy.push(entity.id);
37325                     }
37326                 }
37327
37328                 context.copyIDs(canCopy);
37329             }
37330
37331
37332             function behavior() {
37333                 context.keybinding().on(uiCmd('⌘C'), doCopy);
37334                 return behavior;
37335             }
37336
37337             behavior.off = function() {
37338                 context.keybinding().off(uiCmd('⌘C'));
37339             };
37340
37341
37342             return behavior;
37343         }
37344
37345         var _flashTimer;
37346
37347
37348         function uiFlash() {
37349             var _duration = 2000;
37350             var _iconName = '#iD-icon-no';
37351             var _iconClass = 'disabled';
37352             var _text = '';
37353             var _textClass;
37354
37355
37356             function flash() {
37357                 if (_flashTimer) {
37358                     _flashTimer.stop();
37359                 }
37360
37361                 d3_select('#footer-wrap')
37362                     .attr('class', 'footer-hide');
37363                 d3_select('#flash-wrap')
37364                     .attr('class', 'footer-show');
37365
37366                 var content = d3_select('#flash-wrap').selectAll('.flash-content')
37367                     .data([0]);
37368
37369                 // Enter
37370                 var contentEnter = content.enter()
37371                     .append('div')
37372                     .attr('class', 'flash-content');
37373
37374                 var iconEnter = contentEnter
37375                     .append('svg')
37376                     .attr('class', 'flash-icon')
37377                     .append('g')
37378                     .attr('transform', 'translate(10,10)');
37379
37380                 iconEnter
37381                     .append('circle')
37382                     .attr('r', 9);
37383
37384                 iconEnter
37385                     .append('use')
37386                     .attr('transform', 'translate(-7,-7)')
37387                     .attr('width', '14')
37388                     .attr('height', '14');
37389
37390                 contentEnter
37391                     .append('div')
37392                     .attr('class', 'flash-text');
37393
37394
37395                 // Update
37396                 content = content
37397                     .merge(contentEnter);
37398
37399                 content
37400                     .selectAll('.flash-icon')
37401                     .attr('class', 'flash-icon ' + (_iconClass || ''));
37402
37403                 content
37404                     .selectAll('.flash-icon use')
37405                     .attr('xlink:href', _iconName);
37406
37407                 content
37408                     .selectAll('.flash-text')
37409                     .attr('class', 'flash-text ' + (_textClass || ''))
37410                     .text(_text);
37411
37412
37413                 _flashTimer = d3_timeout(function() {
37414                     _flashTimer = null;
37415                     d3_select('#footer-wrap')
37416                         .attr('class', 'footer-show');
37417                     d3_select('#flash-wrap')
37418                         .attr('class', 'footer-hide');
37419                 }, _duration);
37420
37421                 return content;
37422             }
37423
37424
37425             flash.duration = function(_) {
37426                 if (!arguments.length) return _duration;
37427                 _duration = _;
37428                 return flash;
37429             };
37430
37431             flash.text = function(_) {
37432                 if (!arguments.length) return _text;
37433                 _text = _;
37434                 return flash;
37435             };
37436
37437             flash.textClass = function(_) {
37438                 if (!arguments.length) return _textClass;
37439                 _textClass = _;
37440                 return flash;
37441             };
37442
37443             flash.iconName = function(_) {
37444                 if (!arguments.length) return _iconName;
37445                 _iconName = _;
37446                 return flash;
37447             };
37448
37449             flash.iconClass = function(_) {
37450                 if (!arguments.length) return _iconClass;
37451                 _iconClass = _;
37452                 return flash;
37453             };
37454
37455             return flash;
37456         }
37457
37458         /* Creates a keybinding behavior for an operation */
37459         function behaviorOperation(context) {
37460             var _operation;
37461
37462             function keypress() {
37463                 event.preventDefault();
37464                 var disabled = _operation.disabled();
37465                 var flash;
37466
37467                 if (disabled) {
37468                     flash = uiFlash()
37469                         .duration(4000)
37470                         .iconName('#iD-operation-' + _operation.id)
37471                         .iconClass('operation disabled')
37472                         .text(_operation.tooltip);
37473
37474                     flash();
37475
37476                 } else {
37477                     flash = uiFlash()
37478                         .duration(2000)
37479                         .iconName('#iD-operation-' + _operation.id)
37480                         .iconClass('operation')
37481                         .text(_operation.annotation() || _operation.title);
37482
37483                     flash();
37484                     _operation();
37485                 }
37486             }
37487
37488
37489             function behavior() {
37490                 if (_operation && _operation.available()) {
37491                     context.keybinding()
37492                         .on(_operation.keys, keypress);
37493                 }
37494
37495                 return behavior;
37496             }
37497
37498
37499             behavior.off = function() {
37500                 context.keybinding()
37501                     .off(_operation.keys);
37502             };
37503
37504
37505             behavior.which = function (_) {
37506                 if (!arguments.length) return _operation;
37507                 _operation = _;
37508                 return behavior;
37509             };
37510
37511
37512             return behavior;
37513         }
37514
37515         function operationCircularize(selectedIDs, context) {
37516             var entityID = selectedIDs[0];
37517             var entity = context.entity(entityID);
37518             var extent = entity.extent(context.graph());
37519             var geometry = context.geometry(entityID);
37520             var action = actionCircularize(entityID, context.projection);
37521             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37522             var coords = nodes.map(function(n) { return n.loc; });
37523
37524             var operation = function() {
37525                 context.perform(action, operation.annotation());
37526
37527                 window.setTimeout(function() {
37528                     context.validator().validate();
37529                 }, 300);  // after any transition
37530             };
37531
37532
37533             operation.available = function() {
37534                 return selectedIDs.length === 1 &&
37535                     entity.type === 'way' &&
37536                     new Set(entity.nodes).size > 1;
37537             };
37538
37539
37540             // don't cache this because the visible extent could change
37541             operation.disabled = function() {
37542                 var actionDisabled = action.disabled(context.graph());
37543                 if (actionDisabled) {
37544                     return actionDisabled;
37545                 } else if (extent.percentContainedIn(context.extent()) < 0.8) {
37546                     return 'too_large';
37547                 } else if (someMissing()) {
37548                     return 'not_downloaded';
37549                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37550                     return 'connected_to_hidden';
37551                 }
37552
37553                 return false;
37554
37555
37556                 function someMissing() {
37557                     if (context.inIntro()) return false;
37558                     var osm = context.connection();
37559                     if (osm) {
37560                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37561                         if (missing.length) {
37562                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37563                             return true;
37564                         }
37565                     }
37566                     return false;
37567                 }
37568             };
37569
37570
37571             operation.tooltip = function() {
37572                 var disable = operation.disabled();
37573                 return disable ?
37574                     t('operations.circularize.' + disable) :
37575                     t('operations.circularize.description.' + geometry);
37576             };
37577
37578
37579             operation.annotation = function() {
37580                 return t('operations.circularize.annotation.' + geometry);
37581             };
37582
37583
37584             operation.id = 'circularize';
37585             operation.keys = [t('operations.circularize.key')];
37586             operation.title = t('operations.circularize.title');
37587             operation.behavior = behaviorOperation(context).which(operation);
37588
37589             return operation;
37590         }
37591
37592         function operationDelete(selectedIDs, context) {
37593             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37594             var action = actionDeleteMultiple(selectedIDs);
37595             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37596             var coords = nodes.map(function(n) { return n.loc; });
37597             var extent = nodes.reduce(function(extent, node) {
37598                 return extent.extend(node.extent(context.graph()));
37599             }, geoExtent());
37600
37601
37602             var operation = function() {
37603                 var nextSelectedID;
37604                 var nextSelectedLoc;
37605
37606                 if (selectedIDs.length === 1) {
37607                     var id = selectedIDs[0];
37608                     var entity = context.entity(id);
37609                     var geometry = context.geometry(id);
37610                     var parents = context.graph().parentWays(entity);
37611                     var parent = parents[0];
37612
37613                     // Select the next closest node in the way.
37614                     if (geometry === 'vertex') {
37615                         var nodes = parent.nodes;
37616                         var i = nodes.indexOf(id);
37617
37618                         if (i === 0) {
37619                             i++;
37620                         } else if (i === nodes.length - 1) {
37621                             i--;
37622                         } else {
37623                             var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc);
37624                             var b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
37625                             i = a < b ? i - 1 : i + 1;
37626                         }
37627
37628                         nextSelectedID = nodes[i];
37629                         nextSelectedLoc = context.entity(nextSelectedID).loc;
37630                     }
37631                 }
37632
37633                 context.perform(action, operation.annotation());
37634                 context.validator().validate();
37635
37636                 if (nextSelectedID && nextSelectedLoc) {
37637                     if (context.hasEntity(nextSelectedID)) {
37638                         context.enter(modeSelect(context, [nextSelectedID]).follow(true));
37639                     } else {
37640                         context.map().centerEase(nextSelectedLoc);
37641                         context.enter(modeBrowse(context));
37642                     }
37643                 } else {
37644                     context.enter(modeBrowse(context));
37645                 }
37646
37647             };
37648
37649
37650             operation.available = function() {
37651                 return true;
37652             };
37653
37654
37655             operation.disabled = function() {
37656                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37657                     return 'too_large';
37658                 } else if (someMissing()) {
37659                     return 'not_downloaded';
37660                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37661                     return 'connected_to_hidden';
37662                 } else if (selectedIDs.some(protectedMember)) {
37663                     return 'part_of_relation';
37664                 } else if (selectedIDs.some(incompleteRelation)) {
37665                     return 'incomplete_relation';
37666                 } else if (selectedIDs.some(hasWikidataTag)) {
37667                     return 'has_wikidata_tag';
37668                 }
37669
37670                 return false;
37671
37672
37673                 function someMissing() {
37674                     if (context.inIntro()) return false;
37675                     var osm = context.connection();
37676                     if (osm) {
37677                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37678                         if (missing.length) {
37679                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37680                             return true;
37681                         }
37682                     }
37683                     return false;
37684                 }
37685
37686                 function hasWikidataTag(id) {
37687                     var entity = context.entity(id);
37688                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
37689                 }
37690
37691                 function incompleteRelation(id) {
37692                     var entity = context.entity(id);
37693                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37694                 }
37695
37696                 function protectedMember(id) {
37697                     var entity = context.entity(id);
37698                     if (entity.type !== 'way') return false;
37699
37700                     var parents = context.graph().parentRelations(entity);
37701                     for (var i = 0; i < parents.length; i++) {
37702                         var parent = parents[i];
37703                         var type = parent.tags.type;
37704                         var role = parent.memberById(id).role || 'outer';
37705                         if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
37706                             return true;
37707                         }
37708                     }
37709                     return false;
37710                 }
37711             };
37712
37713
37714             operation.tooltip = function() {
37715                 var disable = operation.disabled();
37716                 return disable ?
37717                     t('operations.delete.' + disable + '.' + multi) :
37718                     t('operations.delete.description' + '.' + multi);
37719             };
37720
37721
37722             operation.annotation = function() {
37723                 return selectedIDs.length === 1 ?
37724                     t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
37725                     t('operations.delete.annotation.multiple', { n: selectedIDs.length });
37726             };
37727
37728
37729             operation.id = 'delete';
37730             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
37731             operation.title = t('operations.delete.title');
37732             operation.behavior = behaviorOperation(context).which(operation);
37733
37734             return operation;
37735         }
37736
37737         function operationOrthogonalize(selectedIDs, context) {
37738             var _entityID;
37739             var _entity;
37740             var _geometry;
37741             var action = chooseAction();
37742             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37743             var coords = nodes.map(function(n) { return n.loc; });
37744
37745
37746             function chooseAction() {
37747                 if (selectedIDs.length !== 1) return null;
37748
37749                 _entityID = selectedIDs[0];
37750                 _entity = context.entity(_entityID);
37751                 _geometry = context.geometry(_entityID);
37752
37753                 // square a line/area
37754                 if (_entity.type === 'way' && new Set(_entity.nodes).size > 2 ) {
37755                     return actionOrthogonalize(_entityID, context.projection);
37756
37757                 // square a single vertex
37758                 } else if (_geometry === 'vertex') {
37759                     var graph = context.graph();
37760                     var parents = graph.parentWays(_entity);
37761                     if (parents.length === 1) {
37762                         var way = parents[0];
37763                         if (way.nodes.indexOf(_entityID) !== -1) {
37764                             return actionOrthogonalize(way.id, context.projection, _entityID);
37765                         }
37766                     }
37767                 }
37768
37769                 return null;
37770             }
37771
37772
37773             var operation = function() {
37774                 if (!action) return;
37775
37776                 context.perform(action, operation.annotation());
37777
37778                 window.setTimeout(function() {
37779                     context.validator().validate();
37780                 }, 300);  // after any transition
37781             };
37782
37783
37784             operation.available = function() {
37785                 return Boolean(action);
37786             };
37787
37788
37789             // don't cache this because the visible extent could change
37790             operation.disabled = function() {
37791                 if (!action) return '';
37792
37793                 var actionDisabled = action.disabled(context.graph());
37794                 if (actionDisabled) {
37795                     return actionDisabled;
37796                 } else if (_geometry !== 'vertex' &&
37797                            _entity.extent(context.graph()).percentContainedIn(context.extent()) < 0.8) {
37798                     return 'too_large';
37799                 } else if (someMissing()) {
37800                     return 'not_downloaded';
37801                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37802                     return 'connected_to_hidden';
37803                 }
37804
37805                 return false;
37806
37807
37808                 function someMissing() {
37809                     if (context.inIntro()) return false;
37810                     var osm = context.connection();
37811                     if (osm) {
37812                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37813                         if (missing.length) {
37814                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37815                             return true;
37816                         }
37817                     }
37818                     return false;
37819                 }
37820             };
37821
37822
37823             operation.tooltip = function() {
37824                 var disable = operation.disabled();
37825                 return disable ?
37826                     t('operations.orthogonalize.' + disable) :
37827                     t('operations.orthogonalize.description.' + _geometry);
37828             };
37829
37830
37831             operation.annotation = function() {
37832                 return t('operations.orthogonalize.annotation.' + _geometry);
37833             };
37834
37835
37836             operation.id = 'orthogonalize';
37837             operation.keys = [t('operations.orthogonalize.key')];
37838             operation.title = t('operations.orthogonalize.title');
37839             operation.behavior = behaviorOperation(context).which(operation);
37840
37841             return operation;
37842         }
37843
37844         function operationReflectShort(selectedIDs, context) {
37845             return operationReflect(selectedIDs, context, 'short');
37846         }
37847
37848
37849         function operationReflectLong(selectedIDs, context) {
37850             return operationReflect(selectedIDs, context, 'long');
37851         }
37852
37853
37854         function operationReflect(selectedIDs, context, axis) {
37855             axis = axis || 'long';
37856             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37857             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37858             var coords = nodes.map(function(n) { return n.loc; });
37859             var extent = nodes.reduce(function(extent, node) {
37860                 return extent.extend(node.extent(context.graph()));
37861             }, geoExtent());
37862
37863
37864             var operation = function() {
37865                 var action = actionReflect(selectedIDs, context.projection)
37866                     .useLongAxis(Boolean(axis === 'long'));
37867
37868                 context.perform(action, operation.annotation());
37869
37870                 window.setTimeout(function() {
37871                     context.validator().validate();
37872                 }, 300);  // after any transition
37873             };
37874
37875
37876             operation.available = function() {
37877                 return nodes.length >= 3;
37878             };
37879
37880
37881             // don't cache this because the visible extent could change
37882             operation.disabled = function() {
37883                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37884                     return 'too_large';
37885                 } else if (someMissing()) {
37886                     return 'not_downloaded';
37887                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37888                     return 'connected_to_hidden';
37889                 } else if (selectedIDs.some(incompleteRelation)) {
37890                     return 'incomplete_relation';
37891                 }
37892
37893                 return false;
37894
37895
37896                 function someMissing() {
37897                     if (context.inIntro()) return false;
37898                     var osm = context.connection();
37899                     if (osm) {
37900                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37901                         if (missing.length) {
37902                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37903                             return true;
37904                         }
37905                     }
37906                     return false;
37907                 }
37908
37909                 function incompleteRelation(id) {
37910                     var entity = context.entity(id);
37911                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37912                 }
37913             };
37914
37915
37916             operation.tooltip = function() {
37917                 var disable = operation.disabled();
37918                 return disable ?
37919                     t('operations.reflect.' + disable + '.' + multi) :
37920                     t('operations.reflect.description.' + axis + '.' + multi);
37921             };
37922
37923
37924             operation.annotation = function() {
37925                 return t('operations.reflect.annotation.' + axis + '.' + multi);
37926             };
37927
37928
37929             operation.id = 'reflect-' + axis;
37930             operation.keys = [t('operations.reflect.key.' + axis)];
37931             operation.title = t('operations.reflect.title.' + axis);
37932             operation.behavior = behaviorOperation(context).which(operation);
37933
37934             return operation;
37935         }
37936
37937         function operationMove(selectedIDs, context) {
37938             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
37939             var nodes = utilGetAllNodes(selectedIDs, context.graph());
37940             var coords = nodes.map(function(n) { return n.loc; });
37941             var extent = nodes.reduce(function(extent, node) {
37942                 return extent.extend(node.extent(context.graph()));
37943             }, geoExtent());
37944
37945
37946             var operation = function() {
37947                 context.enter(modeMove(context, selectedIDs));
37948             };
37949
37950
37951             operation.available = function() {
37952                 return selectedIDs.length > 1 ||
37953                     context.entity(selectedIDs[0]).type !== 'node';
37954             };
37955
37956
37957             operation.disabled = function() {
37958                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
37959                     return 'too_large';
37960                 } else if (someMissing()) {
37961                     return 'not_downloaded';
37962                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
37963                     return 'connected_to_hidden';
37964                 } else if (selectedIDs.some(incompleteRelation)) {
37965                     return 'incomplete_relation';
37966                 }
37967
37968                 return false;
37969
37970
37971                 function someMissing() {
37972                     if (context.inIntro()) return false;
37973                     var osm = context.connection();
37974                     if (osm) {
37975                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
37976                         if (missing.length) {
37977                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
37978                             return true;
37979                         }
37980                     }
37981                     return false;
37982                 }
37983
37984                 function incompleteRelation(id) {
37985                     var entity = context.entity(id);
37986                     return entity.type === 'relation' && !entity.isComplete(context.graph());
37987                 }
37988             };
37989
37990
37991             operation.tooltip = function() {
37992                 var disable = operation.disabled();
37993                 return disable ?
37994                     t('operations.move.' + disable + '.' + multi) :
37995                     t('operations.move.description.' + multi);
37996             };
37997
37998
37999             operation.annotation = function() {
38000                 return selectedIDs.length === 1 ?
38001                     t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
38002                     t('operations.move.annotation.multiple');
38003             };
38004
38005
38006             operation.id = 'move';
38007             operation.keys = [t('operations.move.key')];
38008             operation.title = t('operations.move.title');
38009             operation.behavior = behaviorOperation(context).which(operation);
38010
38011             return operation;
38012         }
38013
38014         function modeRotate(context, entityIDs) {
38015             var mode = {
38016                 id: 'rotate',
38017                 button: 'browse'
38018             };
38019
38020             var keybinding = utilKeybinding('rotate');
38021             var behaviors = [
38022                 behaviorEdit(context),
38023                 operationCircularize(entityIDs, context).behavior,
38024                 operationDelete(entityIDs, context).behavior,
38025                 operationMove(entityIDs, context).behavior,
38026                 operationOrthogonalize(entityIDs, context).behavior,
38027                 operationReflectLong(entityIDs, context).behavior,
38028                 operationReflectShort(entityIDs, context).behavior
38029             ];
38030             var annotation = entityIDs.length === 1 ?
38031                 t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
38032                 t('operations.rotate.annotation.multiple');
38033
38034             var _prevGraph;
38035             var _prevAngle;
38036             var _prevTransform;
38037             var _pivot;
38038
38039
38040             function doRotate() {
38041                 var fn;
38042                 if (context.graph() !== _prevGraph) {
38043                     fn = context.perform;
38044                 } else {
38045                     fn = context.replace;
38046                 }
38047
38048                 // projection changed, recalculate _pivot
38049                 var projection = context.projection;
38050                 var currTransform = projection.transform();
38051                 if (!_prevTransform ||
38052                     currTransform.k !== _prevTransform.k ||
38053                     currTransform.x !== _prevTransform.x ||
38054                     currTransform.y !== _prevTransform.y) {
38055
38056                     var nodes = utilGetAllNodes(entityIDs, context.graph());
38057                     var points = nodes.map(function(n) { return projection(n.loc); });
38058
38059                     if (points.length === 1) {  // degenerate case
38060                         _pivot = points[0];
38061                     } else if (points.length === 2) {
38062                         _pivot = geoVecInterp(points[0], points[1], 0.5);
38063                     } else {
38064                         _pivot = d3_polygonCentroid(d3_polygonHull(points));
38065                     }
38066                     _prevAngle = undefined;
38067                 }
38068
38069
38070                 var currMouse = context.mouse();
38071                 var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
38072
38073                 if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
38074                 var delta = currAngle - _prevAngle;
38075
38076                 fn(actionRotate(entityIDs, _pivot, delta, projection));
38077
38078                 _prevTransform = currTransform;
38079                 _prevAngle = currAngle;
38080                 _prevGraph = context.graph();
38081             }
38082
38083
38084             function finish() {
38085                 event.stopPropagation();
38086                 context.replace(actionNoop(), annotation);
38087                 context.enter(modeSelect(context, entityIDs));
38088             }
38089
38090
38091             function cancel() {
38092                 context.pop();
38093                 context.enter(modeSelect(context, entityIDs));
38094             }
38095
38096
38097             function undone() {
38098                 context.enter(modeBrowse(context));
38099             }
38100
38101
38102             mode.enter = function() {
38103                 context.features().forceVisible(entityIDs);
38104
38105                 behaviors.forEach(context.install);
38106
38107                 context.surface()
38108                     .on('mousemove.rotate', doRotate)
38109                     .on('click.rotate', finish);
38110
38111                 context.history()
38112                     .on('undone.rotate', undone);
38113
38114                 keybinding
38115                     .on('⎋', cancel)
38116                     .on('↩', finish);
38117
38118                 d3_select(document)
38119                     .call(keybinding);
38120             };
38121
38122
38123             mode.exit = function() {
38124                 behaviors.forEach(context.uninstall);
38125
38126                 context.surface()
38127                     .on('mousemove.rotate', null)
38128                     .on('click.rotate', null);
38129
38130                 context.history()
38131                     .on('undone.rotate', null);
38132
38133                 d3_select(document)
38134                     .call(keybinding.unbind);
38135
38136                 context.features().forceVisible([]);
38137             };
38138
38139
38140             mode.selectedIDs = function() {
38141                 if (!arguments.length) return entityIDs;
38142                 // no assign
38143                 return mode;
38144             };
38145
38146
38147             return mode;
38148         }
38149
38150         function operationRotate(selectedIDs, context) {
38151             var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
38152             var nodes = utilGetAllNodes(selectedIDs, context.graph());
38153             var coords = nodes.map(function(n) { return n.loc; });
38154             var extent = nodes.reduce(function(extent, node) {
38155                 return extent.extend(node.extent(context.graph()));
38156             }, geoExtent());
38157
38158
38159             var operation = function() {
38160                 context.enter(modeRotate(context, selectedIDs));
38161             };
38162
38163
38164             operation.available = function() {
38165                 return nodes.length >= 2;
38166             };
38167
38168
38169             operation.disabled = function() {
38170
38171                 if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
38172                     return 'too_large';
38173                 } else if (someMissing()) {
38174                     return 'not_downloaded';
38175                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
38176                     return 'connected_to_hidden';
38177                 } else if (selectedIDs.some(incompleteRelation)) {
38178                     return 'incomplete_relation';
38179                 }
38180
38181                 return false;
38182
38183
38184                 function someMissing() {
38185                     if (context.inIntro()) return false;
38186                     var osm = context.connection();
38187                     if (osm) {
38188                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
38189                         if (missing.length) {
38190                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
38191                             return true;
38192                         }
38193                     }
38194                     return false;
38195                 }
38196
38197                 function incompleteRelation(id) {
38198                     var entity = context.entity(id);
38199                     return entity.type === 'relation' && !entity.isComplete(context.graph());
38200                 }
38201             };
38202
38203
38204             operation.tooltip = function() {
38205                 var disable = operation.disabled();
38206                 return disable ?
38207                     t('operations.rotate.' + disable + '.' + multi) :
38208                     t('operations.rotate.description.' + multi);
38209             };
38210
38211
38212             operation.annotation = function() {
38213                 return selectedIDs.length === 1 ?
38214                     t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
38215                     t('operations.rotate.annotation.multiple');
38216             };
38217
38218
38219             operation.id = 'rotate';
38220             operation.keys = [t('operations.rotate.key')];
38221             operation.title = t('operations.rotate.title');
38222             operation.behavior = behaviorOperation(context).which(operation);
38223
38224             return operation;
38225         }
38226
38227         function modeMove(context, entityIDs, baseGraph) {
38228             var mode = {
38229                 id: 'move',
38230                 button: 'browse'
38231             };
38232
38233             var keybinding = utilKeybinding('move');
38234             var behaviors = [
38235                 behaviorEdit(context),
38236                 operationCircularize(entityIDs, context).behavior,
38237                 operationDelete(entityIDs, context).behavior,
38238                 operationOrthogonalize(entityIDs, context).behavior,
38239                 operationReflectLong(entityIDs, context).behavior,
38240                 operationReflectShort(entityIDs, context).behavior,
38241                 operationRotate(entityIDs, context).behavior
38242             ];
38243             var annotation = entityIDs.length === 1 ?
38244                 t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
38245                 t('operations.move.annotation.multiple');
38246
38247             var _prevGraph;
38248             var _cache;
38249             var _origin;
38250             var _nudgeInterval;
38251
38252
38253             function doMove(nudge) {
38254                 nudge = nudge || [0, 0];
38255
38256                 var fn;
38257                 if (_prevGraph !== context.graph()) {
38258                     _cache = {};
38259                     _origin = context.map().mouseCoordinates();
38260                     fn = context.perform;
38261                 } else {
38262                     fn = context.overwrite;
38263                 }
38264
38265                 var currMouse = context.mouse();
38266                 var origMouse = context.projection(_origin);
38267                 var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
38268
38269                 fn(actionMove(entityIDs, delta, context.projection, _cache));
38270                 _prevGraph = context.graph();
38271             }
38272
38273
38274             function startNudge(nudge) {
38275                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38276                 _nudgeInterval = window.setInterval(function() {
38277                     context.pan(nudge);
38278                     doMove(nudge);
38279                 }, 50);
38280             }
38281
38282
38283             function stopNudge() {
38284                 if (_nudgeInterval) {
38285                     window.clearInterval(_nudgeInterval);
38286                     _nudgeInterval = null;
38287                 }
38288             }
38289
38290
38291             function move() {
38292                 doMove();
38293                 var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
38294                 if (nudge) {
38295                     startNudge(nudge);
38296                 } else {
38297                     stopNudge();
38298                 }
38299             }
38300
38301
38302             function finish() {
38303                 event.stopPropagation();
38304                 context.replace(actionNoop(), annotation);
38305                 context.enter(modeSelect(context, entityIDs));
38306                 stopNudge();
38307             }
38308
38309
38310             function cancel() {
38311                 if (baseGraph) {
38312                     while (context.graph() !== baseGraph) context.pop();
38313                     context.enter(modeBrowse(context));
38314                 } else {
38315                     context.pop();
38316                     context.enter(modeSelect(context, entityIDs));
38317                 }
38318                 stopNudge();
38319             }
38320
38321
38322             function undone() {
38323                 context.enter(modeBrowse(context));
38324             }
38325
38326
38327             mode.enter = function() {
38328                 _origin = context.map().mouseCoordinates();
38329                 _prevGraph = null;
38330                 _cache = {};
38331
38332                 context.features().forceVisible(entityIDs);
38333
38334                 behaviors.forEach(context.install);
38335
38336                 context.surface()
38337                     .on('mousemove.move', move)
38338                     .on('click.move', finish);
38339
38340                 context.history()
38341                     .on('undone.move', undone);
38342
38343                 keybinding
38344                     .on('⎋', cancel)
38345                     .on('↩', finish);
38346
38347                 d3_select(document)
38348                     .call(keybinding);
38349             };
38350
38351
38352             mode.exit = function() {
38353                 stopNudge();
38354
38355                 behaviors.forEach(function(behavior) {
38356                     context.uninstall(behavior);
38357                 });
38358
38359                 context.surface()
38360                     .on('mousemove.move', null)
38361                     .on('click.move', null);
38362
38363                 context.history()
38364                     .on('undone.move', null);
38365
38366                 d3_select(document)
38367                     .call(keybinding.unbind);
38368
38369                 context.features().forceVisible([]);
38370             };
38371
38372
38373             mode.selectedIDs = function() {
38374                 if (!arguments.length) return entityIDs;
38375                 // no assign
38376                 return mode;
38377             };
38378
38379
38380             return mode;
38381         }
38382
38383         function behaviorPaste(context) {
38384
38385             function doPaste() {
38386                 event.preventDefault();
38387
38388                 var baseGraph = context.graph();
38389                 var mouse = context.mouse();
38390                 var projection = context.projection;
38391                 var viewport = geoExtent(projection.clipExtent()).polygon();
38392
38393                 if (!geoPointInPolygon(mouse, viewport)) return;
38394
38395                 var extent = geoExtent();
38396                 var oldIDs = context.copyIDs();
38397                 var oldGraph = context.copyGraph();
38398                 var newIDs = [];
38399
38400                 if (!oldIDs.length) return;
38401
38402                 var action = actionCopyEntities(oldIDs, oldGraph);
38403                 context.perform(action);
38404
38405                 var copies = action.copies();
38406                 var originals = new Set();
38407                 Object.values(copies).forEach(function(entity) { originals.add(entity.id); });
38408
38409                 for (var id in copies) {
38410                     var oldEntity = oldGraph.entity(id);
38411                     var newEntity = copies[id];
38412
38413                     extent._extend(oldEntity.extent(oldGraph));
38414
38415                     // Exclude child nodes from newIDs if their parent way was also copied.
38416                     var parents = context.graph().parentWays(newEntity);
38417                     var parentCopied = parents.some(function(parent) {
38418                         return originals.has(parent.id);
38419                     });
38420
38421                     if (!parentCopied) {
38422                         newIDs.push(newEntity.id);
38423                     }
38424                 }
38425
38426                 // Put pasted objects where mouse pointer is..
38427                 var center = projection(extent.center());
38428                 var delta = geoVecSubtract(mouse, center);
38429
38430                 context.perform(actionMove(newIDs, delta, projection));
38431                 context.enter(modeMove(context, newIDs, baseGraph));
38432             }
38433
38434
38435             function behavior() {
38436                 context.keybinding().on(uiCmd('⌘V'), doPaste);
38437                 return behavior;
38438             }
38439
38440
38441             behavior.off = function() {
38442                 context.keybinding().off(uiCmd('⌘V'));
38443             };
38444
38445
38446             return behavior;
38447         }
38448
38449         /*
38450             `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
38451
38452             * The `origin` function is expected to return an [x, y] tuple rather than an
38453               {x, y} object.
38454             * The events are `start`, `move`, and `end`.
38455               (https://github.com/mbostock/d3/issues/563)
38456             * The `start` event is not dispatched until the first cursor movement occurs.
38457               (https://github.com/mbostock/d3/pull/368)
38458             * The `move` event has a `point` and `delta` [x, y] tuple properties rather
38459               than `x`, `y`, `dx`, and `dy` properties.
38460             * The `end` event is not dispatched if no movement occurs.
38461             * An `off` function is available that unbinds the drag's internal event handlers.
38462          */
38463
38464         function behaviorDrag() {
38465             var dispatch$1 = dispatch('start', 'move', 'end');
38466             var _origin = null;
38467             var _selector = '';
38468             var _event;
38469             var _target;
38470             var _surface;
38471
38472
38473             var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
38474             var d3_event_userSelectSuppress = function() {
38475                     var selection$1 = selection();
38476                     var select = selection$1.style(d3_event_userSelectProperty);
38477                     selection$1.style(d3_event_userSelectProperty, 'none');
38478                     return function() {
38479                         selection$1.style(d3_event_userSelectProperty, select);
38480                     };
38481                 };
38482
38483
38484             function d3_eventCancel() {
38485                 event.stopPropagation();
38486                 event.preventDefault();
38487             }
38488
38489
38490             function eventOf(thiz, argumentz) {
38491                 return function(e1) {
38492                     e1.target = behavior;
38493                     customEvent(e1, dispatch$1.apply, dispatch$1, [e1.type, thiz, argumentz]);
38494                 };
38495             }
38496
38497
38498             function dragstart() {
38499                 _target = this;
38500                 _event = eventOf(_target, arguments);
38501
38502                 var eventTarget = event.target;
38503                 var touchId = event.touches ? event.changedTouches[0].identifier : null;
38504                 var offset;
38505                 var startOrigin = point();
38506                 var started = false;
38507                 var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
38508
38509                 d3_select(window)
38510                     .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
38511                     .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
38512
38513                 if (_origin) {
38514                     offset = _origin.apply(_target, arguments);
38515                     offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
38516                 } else {
38517                     offset = [0, 0];
38518                 }
38519
38520                 if (touchId === null) {
38521                     event.stopPropagation();
38522                 }
38523
38524
38525                 function point() {
38526                     var p = _surface || _target.parentNode;
38527                     return touchId !== null ? d3_touches(p).filter(function(p) {
38528                         return p.identifier === touchId;
38529                     })[0] : d3_mouse(p);
38530                 }
38531
38532
38533                 function dragmove() {
38534                     var p = point();
38535                     var dx = p[0] - startOrigin[0];
38536                     var dy = p[1] - startOrigin[1];
38537
38538                     if (dx === 0 && dy === 0)
38539                         return;
38540
38541                     startOrigin = p;
38542                     d3_eventCancel();
38543
38544                     if (!started) {
38545                         started = true;
38546                         _event({ type: 'start' });
38547                     } else {
38548                         _event({
38549                             type: 'move',
38550                             point: [p[0] + offset[0],  p[1] + offset[1]],
38551                             delta: [dx, dy]
38552                         });
38553                     }
38554                 }
38555
38556
38557                 function dragend() {
38558                     if (started) {
38559                         _event({ type: 'end' });
38560
38561                         d3_eventCancel();
38562                         if (event.target === eventTarget) {
38563                             d3_select(window)
38564                                 .on('click.drag', click, true);
38565                         }
38566                     }
38567
38568                     d3_select(window)
38569                         .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
38570                         .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
38571
38572                     selectEnable();
38573                 }
38574
38575
38576                 function click() {
38577                     d3_eventCancel();
38578                     d3_select(window)
38579                         .on('click.drag', null);
38580                 }
38581             }
38582
38583
38584             function behavior(selection) {
38585                 var matchesSelector = utilPrefixDOMProperty('matchesSelector');
38586                 var delegate = dragstart;
38587
38588                 if (_selector) {
38589                     delegate = function() {
38590                         var root = this;
38591                         var target = event.target;
38592                         for (; target && target !== root; target = target.parentNode) {
38593                             var datum = target.__data__;
38594
38595                             var entity = datum instanceof osmNote ? datum
38596                                 : datum && datum.properties && datum.properties.entity;
38597
38598                             if (entity && target[matchesSelector](_selector)) {
38599                                 return dragstart.call(target, entity);
38600                             }
38601                         }
38602                     };
38603                 }
38604
38605                 selection
38606                     .on('mousedown.drag' + _selector, delegate)
38607                     .on('touchstart.drag' + _selector, delegate);
38608             }
38609
38610
38611             behavior.off = function(selection) {
38612                 selection
38613                     .on('mousedown.drag' + _selector, null)
38614                     .on('touchstart.drag' + _selector, null);
38615             };
38616
38617
38618             behavior.selector = function(_) {
38619                 if (!arguments.length) return _selector;
38620                 _selector = _;
38621                 return behavior;
38622             };
38623
38624
38625             behavior.origin = function(_) {
38626                 if (!arguments.length) return _origin;
38627                 _origin = _;
38628                 return behavior;
38629             };
38630
38631
38632             behavior.cancel = function() {
38633                 d3_select(window)
38634                     .on('mousemove.drag', null)
38635                     .on('mouseup.drag', null);
38636                 return behavior;
38637             };
38638
38639
38640             behavior.target = function() {
38641                 if (!arguments.length) return _target;
38642                 _target = arguments[0];
38643                 _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
38644                 return behavior;
38645             };
38646
38647
38648             behavior.surface = function() {
38649                 if (!arguments.length) return _surface;
38650                 _surface = arguments[0];
38651                 return behavior;
38652             };
38653
38654
38655             return utilRebind(behavior, dispatch$1, 'on');
38656         }
38657
38658         function modeDragNode(context) {
38659             var mode = {
38660                 id: 'drag-node',
38661                 button: 'browse'
38662             };
38663             var hover = behaviorHover(context).altDisables(true)
38664                 .on('hover', context.ui().sidebar.hover);
38665             var edit = behaviorEdit(context);
38666
38667             var _nudgeInterval;
38668             var _restoreSelectedIDs = [];
38669             var _wasMidpoint = false;
38670             var _isCancelled = false;
38671             var _activeEntity;
38672             var _startLoc;
38673             var _lastLoc;
38674
38675
38676             function startNudge(entity, nudge) {
38677                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
38678                 _nudgeInterval = window.setInterval(function() {
38679                     context.pan(nudge);
38680                     doMove(entity, nudge);
38681                 }, 50);
38682             }
38683
38684
38685             function stopNudge() {
38686                 if (_nudgeInterval) {
38687                     window.clearInterval(_nudgeInterval);
38688                     _nudgeInterval = null;
38689                 }
38690             }
38691
38692
38693             function moveAnnotation(entity) {
38694                 return t('operations.move.annotation.' + entity.geometry(context.graph()));
38695             }
38696
38697
38698             function connectAnnotation(nodeEntity, targetEntity) {
38699                 var nodeGeometry = nodeEntity.geometry(context.graph());
38700                 var targetGeometry = targetEntity.geometry(context.graph());
38701                 if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
38702                     var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
38703                     var targetParentWayIDs = context.graph().parentWays(targetEntity);
38704                     var sharedParentWays = utilArrayIntersection(nodeParentWayIDs, targetParentWayIDs);
38705                     // if both vertices are part of the same way
38706                     if (sharedParentWays.length !== 0) {
38707                         // if the nodes are next to each other, they are merged
38708                         if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
38709                             return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
38710                         }
38711                         return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
38712                     }
38713                 }
38714                 return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
38715             }
38716
38717
38718             function shouldSnapToNode(target) {
38719                 if (!_activeEntity) return false;
38720                 return _activeEntity.geometry(context.graph()) !== 'vertex' ||
38721                     (target.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(target, context.graph()));
38722             }
38723
38724
38725             function origin(entity) {
38726                 return context.projection(entity.loc);
38727             }
38728
38729
38730             function keydown() {
38731                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38732                     if (context.surface().classed('nope')) {
38733                         context.surface()
38734                             .classed('nope-suppressed', true);
38735                     }
38736                     context.surface()
38737                         .classed('nope', false)
38738                         .classed('nope-disabled', true);
38739                 }
38740             }
38741
38742
38743             function keyup() {
38744                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
38745                     if (context.surface().classed('nope-suppressed')) {
38746                         context.surface()
38747                             .classed('nope', true);
38748                     }
38749                     context.surface()
38750                         .classed('nope-suppressed', false)
38751                         .classed('nope-disabled', false);
38752                 }
38753             }
38754
38755
38756             function start(entity) {
38757                 _wasMidpoint = entity.type === 'midpoint';
38758                 var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
38759                 _isCancelled = event.sourceEvent.shiftKey || hasHidden;
38760
38761
38762                 if (_isCancelled) {
38763                     if (hasHidden) {
38764                         uiFlash()
38765                             .duration(4000)
38766                             .text(t('modes.drag_node.connected_to_hidden'))();
38767                     }
38768                     return drag.cancel();
38769                 }
38770
38771                 if (_wasMidpoint) {
38772                     var midpoint = entity;
38773                     entity = osmNode();
38774                     context.perform(actionAddMidpoint(midpoint, entity));
38775                     entity = context.entity(entity.id);   // get post-action entity
38776
38777                     var vertex = context.surface().selectAll('.' + entity.id);
38778                     drag.target(vertex.node(), entity);
38779
38780                 } else {
38781                     context.perform(actionNoop());
38782                 }
38783
38784                 _activeEntity = entity;
38785                 _startLoc = entity.loc;
38786
38787                 hover.ignoreVertex(entity.geometry(context.graph()) === 'vertex');
38788
38789                 context.surface().selectAll('.' + _activeEntity.id)
38790                     .classed('active', true);
38791
38792                 context.enter(mode);
38793             }
38794
38795
38796             // related code
38797             // - `behavior/draw.js` `datum()`
38798             function datum() {
38799                 var event$1 = event && event.sourceEvent;
38800                 if (!event$1 || event$1.altKey) {
38801                     return {};
38802                 } else {
38803                     // When dragging, snap only to touch targets..
38804                     // (this excludes area fills and active drawing elements)
38805                     var d = event$1.target.__data__;
38806                     return (d && d.properties && d.properties.target) ? d : {};
38807                 }
38808             }
38809
38810
38811             function doMove(entity, nudge) {
38812                 nudge = nudge || [0, 0];
38813
38814                 var currPoint = (event && event.point) || context.projection(_lastLoc);
38815                 var currMouse = geoVecSubtract(currPoint, nudge);
38816                 var loc = context.projection.invert(currMouse);
38817
38818                 if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
38819                     // related code
38820                     // - `mode/drag_node.js`     `doMode()`
38821                     // - `behavior/draw.js`      `click()`
38822                     // - `behavior/draw_way.js`  `move()`
38823                     var d = datum();
38824                     var target = d && d.properties && d.properties.entity;
38825                     var targetLoc = target && target.loc;
38826                     var targetNodes = d && d.properties && d.properties.nodes;
38827                     var edge;
38828
38829                     if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
38830                         if (shouldSnapToNode(target)) {
38831                             loc = targetLoc;
38832                         }
38833
38834                     } else if (targetNodes) {   // snap to way - a line target with `.nodes`
38835                         edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
38836                         if (edge) {
38837                             loc = edge.loc;
38838                         }
38839                     }
38840                 }
38841
38842                 context.replace(
38843                     actionMoveNode(entity.id, loc)
38844                 );
38845
38846                 // Below here: validations
38847                 var isInvalid = false;
38848
38849                 // Check if this connection to `target` could cause relations to break..
38850                 if (target) {
38851                     isInvalid = hasRelationConflict(entity, target, edge, context.graph());
38852                 }
38853
38854                 // Check if this drag causes the geometry to break..
38855                 if (!isInvalid) {
38856                     isInvalid = hasInvalidGeometry(entity, context.graph());
38857                 }
38858
38859
38860                 var nope = context.surface().classed('nope');
38861                 if (isInvalid === 'relation' || isInvalid === 'restriction') {
38862                     if (!nope) {   // about to nope - show hint
38863                         uiFlash()
38864                             .duration(4000)
38865                             .text(t('operations.connect.' + isInvalid,
38866                                 { relation: context.presets().item('type/restriction').name() }
38867                             ))();
38868                     }
38869                 } else {
38870                     if (nope) {   // about to un-nope, remove hint
38871                         uiFlash()
38872                             .duration(1)
38873                             .text('')();
38874                     }
38875                 }
38876
38877
38878                 var nopeDisabled = context.surface().classed('nope-disabled');
38879                 if (nopeDisabled) {
38880                     context.surface()
38881                         .classed('nope', false)
38882                         .classed('nope-suppressed', isInvalid);
38883                 } else {
38884                     context.surface()
38885                         .classed('nope', isInvalid)
38886                         .classed('nope-suppressed', false);
38887                 }
38888
38889                 _lastLoc = loc;
38890             }
38891
38892
38893             // Uses `actionConnect.disabled()` to know whether this connection is ok..
38894             function hasRelationConflict(entity, target, edge, graph) {
38895                 var testGraph = graph.update();  // copy
38896
38897                 // if snapping to way - add midpoint there and consider that the target..
38898                 if (edge) {
38899                     var midpoint = osmNode();
38900                     var action = actionAddMidpoint({
38901                         loc: edge.loc,
38902                         edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
38903                     }, midpoint);
38904
38905                     testGraph = action(testGraph);
38906                     target = midpoint;
38907                 }
38908
38909                 // can we connect to it?
38910                 var ids = [entity.id, target.id];
38911                 return actionConnect(ids).disabled(testGraph);
38912             }
38913
38914
38915             function hasInvalidGeometry(entity, graph) {
38916                 var parents = graph.parentWays(entity);
38917                 var i, j, k;
38918
38919                 for (i = 0; i < parents.length; i++) {
38920                     var parent = parents[i];
38921                     var nodes = [];
38922                     var activeIndex = null;    // which multipolygon ring contains node being dragged
38923
38924                     // test any parent multipolygons for valid geometry
38925                     var relations = graph.parentRelations(parent);
38926                     for (j = 0; j < relations.length; j++) {
38927                         if (!relations[j].isMultipolygon()) continue;
38928
38929                         var rings = osmJoinWays(relations[j].members, graph);
38930
38931                         // find active ring and test it for self intersections
38932                         for (k = 0; k < rings.length; k++) {
38933                             nodes = rings[k].nodes;
38934                             if (nodes.find(function(n) { return n.id === entity.id; })) {
38935                                 activeIndex = k;
38936                                 if (geoHasSelfIntersections(nodes, entity.id)) {
38937                                     return true;
38938                                 }
38939                             }
38940                             rings[k].coords = nodes.map(function(n) { return n.loc; });
38941                         }
38942
38943                         // test active ring for intersections with other rings in the multipolygon
38944                         for (k = 0; k < rings.length; k++) {
38945                             if (k === activeIndex) continue;
38946
38947                             // make sure active ring doesnt cross passive rings
38948                             if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
38949                                 return true;
38950                             }
38951                         }
38952                     }
38953
38954
38955                     // If we still haven't tested this node's parent way for self-intersections.
38956                     // (because it's not a member of a multipolygon), test it now.
38957                     if (activeIndex === null) {
38958                         nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
38959                         if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
38960                             return true;
38961                         }
38962                     }
38963
38964                 }
38965
38966                 return false;
38967             }
38968
38969
38970             function move(entity) {
38971                 if (_isCancelled) return;
38972                 event.sourceEvent.stopPropagation();
38973
38974                 context.surface().classed('nope-disabled', event.sourceEvent.altKey);
38975
38976                 _lastLoc = context.projection.invert(event.point);
38977
38978                 doMove(entity);
38979                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
38980                 if (nudge) {
38981                     startNudge(entity, nudge);
38982                 } else {
38983                     stopNudge();
38984                 }
38985             }
38986
38987             function end(entity) {
38988                 if (_isCancelled) return;
38989
38990                 var d = datum();
38991                 var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
38992                 var target = d && d.properties && d.properties.entity;   // entity to snap to
38993
38994                 if (nope) {   // bounce back
38995                     context.perform(
38996                         _actionBounceBack(entity.id, _startLoc)
38997                     );
38998
38999                 } else if (target && target.type === 'way') {
39000                     var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
39001                     context.replace(
39002                         actionAddMidpoint({
39003                             loc: choice.loc,
39004                             edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
39005                         }, entity),
39006                         connectAnnotation(entity, target)
39007                     );
39008
39009                 } else if (target && target.type === 'node' && shouldSnapToNode(target)) {
39010                     context.replace(
39011                         actionConnect([target.id, entity.id]),
39012                         connectAnnotation(entity, target)
39013                     );
39014
39015                 } else if (_wasMidpoint) {
39016                     context.replace(
39017                         actionNoop(),
39018                         t('operations.add.annotation.vertex')
39019                     );
39020
39021                 } else {
39022                     context.replace(
39023                         actionNoop(),
39024                         moveAnnotation(entity)
39025                     );
39026                 }
39027
39028                 var reselection = _restoreSelectedIDs.filter(function(id) {
39029                     return context.graph().hasEntity(id);
39030                 });
39031
39032                 if (reselection.length) {
39033                     context.enter(modeSelect(context, reselection));
39034                 } else {
39035                     context.enter(modeBrowse(context));
39036                 }
39037             }
39038
39039
39040             function _actionBounceBack(nodeID, toLoc) {
39041                 var moveNode = actionMoveNode(nodeID, toLoc);
39042                 var action = function(graph, t) {
39043                     // last time through, pop off the bounceback perform.
39044                     // it will then overwrite the initial perform with a moveNode that does nothing
39045                     if (t === 1) context.pop();
39046                     return moveNode(graph, t);
39047                 };
39048                 action.transitionable = true;
39049                 return action;
39050             }
39051
39052
39053             function cancel() {
39054                 drag.cancel();
39055                 context.enter(modeBrowse(context));
39056             }
39057
39058
39059             var drag = behaviorDrag()
39060                 .selector('.layer-touch.points .target')
39061                 .surface(d3_select('#map').node())
39062                 .origin(origin)
39063                 .on('start', start)
39064                 .on('move', move)
39065                 .on('end', end);
39066
39067
39068             mode.enter = function() {
39069                 context.install(hover);
39070                 context.install(edit);
39071
39072                 d3_select(window)
39073                     .on('keydown.drawWay', keydown)
39074                     .on('keyup.drawWay', keyup);
39075
39076                 context.history()
39077                     .on('undone.drag-node', cancel);
39078             };
39079
39080
39081             mode.exit = function() {
39082                 context.ui().sidebar.hover.cancel();
39083                 context.uninstall(hover);
39084                 context.uninstall(edit);
39085
39086                 d3_select(window)
39087                     .on('keydown.hover', null)
39088                     .on('keyup.hover', null);
39089
39090                 context.history()
39091                     .on('undone.drag-node', null);
39092
39093                 _activeEntity = null;
39094
39095                 context.surface()
39096                     .classed('nope', false)
39097                     .classed('nope-suppressed', false)
39098                     .classed('nope-disabled', false)
39099                     .selectAll('.active')
39100                     .classed('active', false);
39101
39102                 stopNudge();
39103             };
39104
39105
39106             mode.selectedIDs = function() {
39107                 if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
39108                 // no assign
39109                 return mode;
39110             };
39111
39112
39113             mode.activeID = function() {
39114                 if (!arguments.length) return _activeEntity && _activeEntity.id;
39115                 // no assign
39116                 return mode;
39117             };
39118
39119
39120             mode.restoreSelectedIDs = function(_) {
39121                 if (!arguments.length) return _restoreSelectedIDs;
39122                 _restoreSelectedIDs = _;
39123                 return mode;
39124             };
39125
39126
39127             mode.behavior = drag;
39128
39129
39130             return mode;
39131         }
39132
39133         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"};
39134         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: \\((.+)\\)"}};
39135
39136         var tiler = utilTiler();
39137         var dispatch$1 = dispatch('loaded');
39138
39139         var _krCache;
39140         var _krZoom = 14;
39141         var _krUrlRoot = 'https://www.keepright.at/';
39142
39143         var _krRuleset = [
39144             // no 20 - multiple node on same spot - these are mostly boundaries overlapping roads
39145             30, 40, 50, 60, 70, 90, 100, 110, 120, 130, 150, 160, 170, 180,
39146             190, 191, 192, 193, 194, 195, 196, 197, 198,
39147             200, 201, 202, 203, 204, 205, 206, 207, 208, 210, 220,
39148             230, 231, 232, 270, 280, 281, 282, 283, 284, 285,
39149             290, 291, 292, 293, 294, 295, 296, 297, 298, 300, 310, 311, 312, 313,
39150             320, 350, 360, 370, 380, 390, 400, 401, 402, 410, 411, 412, 413
39151         ];
39152
39153
39154         function abortRequest(controller) {
39155             if (controller) {
39156                 controller.abort();
39157             }
39158         }
39159
39160         function abortUnwantedRequests(cache, tiles) {
39161             Object.keys(cache.inflightTile).forEach(function(k) {
39162                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39163                 if (!wanted) {
39164                     abortRequest(cache.inflightTile[k]);
39165                     delete cache.inflightTile[k];
39166                 }
39167             });
39168         }
39169
39170
39171         function encodeErrorRtree(d) {
39172             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39173         }
39174
39175
39176         // replace or remove error from rtree
39177         function updateRtree(item, replace) {
39178             _krCache.rtree.remove(item, function isEql(a, b) {
39179                 return a.data.id === b.data.id;
39180             });
39181
39182             if (replace) {
39183                 _krCache.rtree.insert(item);
39184             }
39185         }
39186
39187
39188         function tokenReplacements(d) {
39189             if (!(d instanceof qaError)) return;
39190
39191             var htmlRegex = new RegExp(/<\/[a-z][\s\S]*>/);
39192             var replacements = {};
39193
39194             var errorTemplate = errorTypes[d.which_type];
39195             if (!errorTemplate) {
39196                 /* eslint-disable no-console */
39197                 console.log('No Template: ', d.which_type);
39198                 console.log('  ', d.description);
39199                 /* eslint-enable no-console */
39200                 return;
39201             }
39202
39203             // some descriptions are just fixed text
39204             if (!errorTemplate.regex) return;
39205
39206             // regex pattern should match description with variable details captured
39207             var errorRegex = new RegExp(errorTemplate.regex, 'i');
39208             var errorMatch = errorRegex.exec(d.description);
39209             if (!errorMatch) {
39210                 /* eslint-disable no-console */
39211                 console.log('Unmatched: ', d.which_type);
39212                 console.log('  ', d.description);
39213                 console.log('  ', errorRegex);
39214                 /* eslint-enable no-console */
39215                 return;
39216             }
39217
39218             for (var i = 1; i < errorMatch.length; i++) {   // skip first
39219                 var capture = errorMatch[i];
39220                 var idType;
39221
39222                 idType = 'IDs' in errorTemplate ? errorTemplate.IDs[i-1] : '';
39223                 if (idType && capture) {   // link IDs if present in the capture
39224                     capture = parseError(capture, idType);
39225                 } else if (htmlRegex.test(capture)) {   // escape any html in non-IDs
39226                     capture = '\\' +  capture + '\\';
39227                 } else {
39228                     var compare = capture.toLowerCase();
39229                     if (localizeStrings[compare]) {   // some replacement strings can be localized
39230                         capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39231                     }
39232                 }
39233
39234                 replacements['var' + i] = capture;
39235             }
39236
39237             return replacements;
39238         }
39239
39240
39241         function parseError(capture, idType) {
39242             var compare = capture.toLowerCase();
39243             if (localizeStrings[compare]) {   // some replacement strings can be localized
39244                 capture = t('QA.keepRight.error_parts.' + localizeStrings[compare]);
39245             }
39246
39247             switch (idType) {
39248                 // link a string like "this node"
39249                 case 'this':
39250                     capture = linkErrorObject(capture);
39251                     break;
39252
39253                 case 'url':
39254                     capture = linkURL(capture);
39255                     break;
39256
39257                 // link an entity ID
39258                 case 'n':
39259                 case 'w':
39260                 case 'r':
39261                     capture = linkEntity(idType + capture);
39262                     break;
39263
39264                 // some errors have more complex ID lists/variance
39265                 case '20':
39266                     capture = parse20(capture);
39267                     break;
39268                 case '211':
39269                     capture = parse211(capture);
39270                     break;
39271                 case '231':
39272                     capture = parse231(capture);
39273                     break;
39274                 case '294':
39275                     capture = parse294(capture);
39276                     break;
39277                 case '370':
39278                     capture = parse370(capture);
39279                     break;
39280             }
39281
39282             return capture;
39283
39284
39285             function linkErrorObject(d) {
39286                 return '<a class="error_object_link">' + d + '</a>';
39287             }
39288
39289             function linkEntity(d) {
39290                 return '<a class="error_entity_link">' + d + '</a>';
39291             }
39292
39293             function linkURL(d) {
39294                 return '<a class="kr_external_link" target="_blank" href="' + d + '">' + d + '</a>';
39295             }
39296
39297             // arbitrary node list of form: #ID, #ID, #ID...
39298             function parse211(capture) {
39299                 var newList = [];
39300                 var items = capture.split(', ');
39301
39302                 items.forEach(function(item) {
39303                     // ID has # at the front
39304                     var id = linkEntity('n' + item.slice(1));
39305                     newList.push(id);
39306                 });
39307
39308                 return newList.join(', ');
39309             }
39310
39311             // arbitrary way list of form: #ID(layer),#ID(layer),#ID(layer)...
39312             function parse231(capture) {
39313                 var newList = [];
39314                 // unfortunately 'layer' can itself contain commas, so we split on '),'
39315                 var items = capture.split('),');
39316
39317                 items.forEach(function(item) {
39318                     var match = item.match(/\#(\d+)\((.+)\)?/);
39319                     if (match !== null && match.length > 2) {
39320                         newList.push(linkEntity('w' + match[1]) + ' ' +
39321                             t('QA.keepRight.errorTypes.231.layer', { layer: match[2] })
39322                         );
39323                     }
39324                 });
39325
39326                 return newList.join(', ');
39327             }
39328
39329             // arbitrary node/relation list of form: from node #ID,to relation #ID,to node #ID...
39330             function parse294(capture) {
39331                 var newList = [];
39332                 var items = capture.split(',');
39333
39334                 items.forEach(function(item) {
39335                     var role;
39336                     var idType;
39337                     var id;
39338
39339                     // item of form "from/to node/relation #ID"
39340                     item = item.split(' ');
39341
39342                     // to/from role is more clear in quotes
39343                     role = '"' + item[0] + '"';
39344
39345                     // first letter of node/relation provides the type
39346                     idType = item[1].slice(0,1);
39347
39348                     // ID has # at the front
39349                     id = item[2].slice(1);
39350                     id = linkEntity(idType + id);
39351
39352                     item = [role, item[1], id].join(' ');
39353                     newList.push(item);
39354                 });
39355
39356                 return newList.join(', ');
39357             }
39358
39359             // may or may not include the string "(including the name 'name')"
39360             function parse370(capture) {
39361                 if (!capture) return '';
39362
39363                 var match = capture.match(/\(including the name (\'.+\')\)/);
39364                 if (match !== null && match.length) {
39365                     return t('QA.keepRight.errorTypes.370.including_the_name', { name: match[1] });
39366                 }
39367                 return '';
39368             }
39369
39370             // arbitrary node list of form: #ID,#ID,#ID...
39371             function parse20(capture) {
39372                 var newList = [];
39373                 var items = capture.split(',');
39374
39375                 items.forEach(function(item) {
39376                     // ID has # at the front
39377                     var id = linkEntity('n' + item.slice(1));
39378                     newList.push(id);
39379                 });
39380
39381                 return newList.join(', ');
39382             }
39383         }
39384
39385
39386         var serviceKeepRight = {
39387             init: function() {
39388                 if (!_krCache) {
39389                     this.reset();
39390                 }
39391
39392                 this.event = utilRebind(this, dispatch$1, 'on');
39393             },
39394
39395             reset: function() {
39396                 if (_krCache) {
39397                     Object.values(_krCache.inflightTile).forEach(abortRequest);
39398                 }
39399
39400                 _krCache = {
39401                     data: {},
39402                     loadedTile: {},
39403                     inflightTile: {},
39404                     inflightPost: {},
39405                     closed: {},
39406                     rtree: rbush_1()
39407                 };
39408             },
39409
39410
39411             // KeepRight API:  http://osm.mueschelsoft.de/keepright/interfacing.php
39412             loadErrors: function(projection) {
39413                 var options = { format: 'geojson' };
39414                 var rules = _krRuleset.join();
39415
39416                 // determine the needed tiles to cover the view
39417                 var tiles = tiler
39418                     .zoomExtent([_krZoom, _krZoom])
39419                     .getTiles(projection);
39420
39421                 // abort inflight requests that are no longer needed
39422                 abortUnwantedRequests(_krCache, tiles);
39423
39424                 // issue new requests..
39425                 tiles.forEach(function(tile) {
39426                     if (_krCache.loadedTile[tile.id] || _krCache.inflightTile[tile.id]) return;
39427
39428                     var rect = tile.extent.rectangle();
39429                     var params = Object.assign({}, options, { left: rect[0], bottom: rect[3], right: rect[2], top: rect[1] });
39430                     var url = _krUrlRoot + 'export.php?' + utilQsString(params) + '&ch=' + rules;
39431
39432                     var controller = new AbortController();
39433                     _krCache.inflightTile[tile.id] = controller;
39434
39435                     d3_json(url, { signal: controller.signal })
39436                         .then(function(data) {
39437                             delete _krCache.inflightTile[tile.id];
39438                             _krCache.loadedTile[tile.id] = true;
39439                             if (!data || !data.features || !data.features.length) {
39440                                 throw new Error('No Data');
39441                             }
39442
39443                             data.features.forEach(function(feature) {
39444                                 var loc = feature.geometry.coordinates;
39445                                 var props = feature.properties;
39446
39447                                 // if there is a parent, save its error type e.g.:
39448                                 //  Error 191 = "highway-highway"
39449                                 //  Error 190 = "intersections without junctions"  (parent)
39450                                 var errorType = props.error_type;
39451                                 var errorTemplate = errorTypes[errorType];
39452                                 var parentErrorType = (Math.floor(errorType / 10) * 10).toString();
39453
39454                                 // try to handle error type directly, fallback to parent error type.
39455                                 var whichType = errorTemplate ? errorType : parentErrorType;
39456                                 var whichTemplate = errorTypes[whichType];
39457
39458                                 // Rewrite a few of the errors at this point..
39459                                 // This is done to make them easier to linkify and translate.
39460                                 switch (whichType) {
39461                                     case '170':
39462                                         props.description = 'This feature has a FIXME tag: ' + props.description;
39463                                         break;
39464                                     case '292':
39465                                     case '293':
39466                                         props.description = props.description.replace('A turn-', 'This turn-');
39467                                         break;
39468                                     case '294':
39469                                     case '295':
39470                                     case '296':
39471                                     case '297':
39472                                     case '298':
39473                                         props.description = 'This turn-restriction~' + props.description;
39474                                         break;
39475                                     case '300':
39476                                         props.description = 'This highway is missing a maxspeed tag';
39477                                         break;
39478                                     case '411':
39479                                     case '412':
39480                                     case '413':
39481                                         props.description = 'This feature~' + props.description;
39482                                         break;
39483                                 }
39484
39485                                 // - move markers slightly so it doesn't obscure the geometry,
39486                                 // - then move markers away from other coincident markers
39487                                 var coincident = false;
39488                                 do {
39489                                     // first time, move marker up. after that, move marker right.
39490                                     var delta = coincident ? [0.00001, 0] : [0, 0.00001];
39491                                     loc = geoVecAdd(loc, delta);
39492                                     var bbox = geoExtent(loc).bbox();
39493                                     coincident = _krCache.rtree.search(bbox).length;
39494                                 } while (coincident);
39495
39496                                 var d = new qaError({
39497                                     // Required values
39498                                     loc: loc,
39499                                     service: 'keepRight',
39500                                     error_type: errorType,
39501                                     // Extra values for this service
39502                                     id: props.error_id,
39503                                     comment: props.comment || null,
39504                                     description: props.description || '',
39505                                     error_id: props.error_id,
39506                                     which_type: whichType,
39507                                     parent_error_type: parentErrorType,
39508                                     severity: whichTemplate.severity || 'error',
39509                                     object_id: props.object_id,
39510                                     object_type: props.object_type,
39511                                     schema: props.schema,
39512                                     title: props.title
39513                                 });
39514
39515                                 d.replacements = tokenReplacements(d);
39516
39517                                 _krCache.data[d.id] = d;
39518                                 _krCache.rtree.insert(encodeErrorRtree(d));
39519                             });
39520
39521                             dispatch$1.call('loaded');
39522                         })
39523                         .catch(function() {
39524                             delete _krCache.inflightTile[tile.id];
39525                             _krCache.loadedTile[tile.id] = true;
39526                         });
39527
39528                 });
39529             },
39530
39531
39532             postKeepRightUpdate: function(d, callback) {
39533                 if (_krCache.inflightPost[d.id]) {
39534                     return callback({ message: 'Error update already inflight', status: -2 }, d);
39535                 }
39536
39537                 var that = this;
39538                 var params = { schema: d.schema, id: d.error_id };
39539
39540                 if (d.state) {
39541                     params.st = d.state;
39542                 }
39543                 if (d.newComment !== undefined) {
39544                     params.co = d.newComment;
39545                 }
39546
39547                 // NOTE: This throws a CORS err, but it seems successful.
39548                 // We don't care too much about the response, so this is fine.
39549                 var url = _krUrlRoot + 'comment.php?' + utilQsString(params);
39550
39551                 var controller = new AbortController();
39552                 _krCache.inflightPost[d.id] = controller;
39553
39554                 fetch(url, { method: 'POST', signal: controller.signal })
39555                     .then(function(response) {
39556                         delete _krCache.inflightPost[d.id];
39557                         if (!response.ok) {
39558                             throw new Error(response.status + ' ' + response.statusText);
39559                         }
39560
39561                         if (d.state === 'ignore') {   // ignore permanently (false positive)
39562                             that.removeError(d);
39563
39564                         } else if (d.state === 'ignore_t') {  // ignore temporarily (error fixed)
39565                             that.removeError(d);
39566                             _krCache.closed[d.schema + ':' + d.error_id] = true;
39567
39568                         } else {
39569                             d = that.replaceError(d.update({
39570                                 comment: d.newComment,
39571                                 newComment: undefined,
39572                                 state: undefined
39573                             }));
39574                         }
39575
39576                         if (callback) callback(null, d);
39577                     })
39578                     .catch(function(err) {
39579                         delete _krCache.inflightPost[d.id];
39580                         if (callback) callback(err.message);
39581                     });
39582             },
39583
39584
39585             // get all cached errors covering the viewport
39586             getErrors: function(projection) {
39587                 var viewport = projection.clipExtent();
39588                 var min = [viewport[0][0], viewport[1][1]];
39589                 var max = [viewport[1][0], viewport[0][1]];
39590                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
39591
39592                 return _krCache.rtree.search(bbox).map(function(d) {
39593                     return d.data;
39594                 });
39595             },
39596
39597
39598             // get a single error from the cache
39599             getError: function(id) {
39600                 return _krCache.data[id];
39601             },
39602
39603
39604             // replace a single error in the cache
39605             replaceError: function(error) {
39606                 if (!(error instanceof qaError) || !error.id) return;
39607
39608                 _krCache.data[error.id] = error;
39609                 updateRtree(encodeErrorRtree(error), true); // true = replace
39610                 return error;
39611             },
39612
39613
39614             // remove a single error from the cache
39615             removeError: function(error) {
39616                 if (!(error instanceof qaError) || !error.id) return;
39617
39618                 delete _krCache.data[error.id];
39619                 updateRtree(encodeErrorRtree(error), false); // false = remove
39620             },
39621
39622
39623             errorURL: function(error) {
39624                 return _krUrlRoot + 'report_map.php?schema=' + error.schema + '&error=' + error.id;
39625             },
39626
39627
39628             // Get an array of errors closed during this session.
39629             // Used to populate `closed:keepright` changeset tag
39630             getClosedIDs: function() {
39631                 return Object.keys(_krCache.closed).sort();
39632             }
39633
39634         };
39635
39636         var tiler$1 = utilTiler();
39637         var dispatch$2 = dispatch('loaded');
39638
39639         var _erCache;
39640         var _erZoom = 14;
39641
39642         var _impOsmUrls = {
39643             ow: 'https://directionofflow.skobbler.net/directionOfFlowService',
39644             mr: 'https://missingroads.skobbler.net/missingGeoService',
39645             tr: 'https://turnrestrictionservice.skobbler.net/turnRestrictionService'
39646         };
39647
39648         function abortRequest$1(i) {
39649             Object.values(i).forEach(function(controller) {
39650                 if (controller) {
39651                     controller.abort();
39652                 }
39653             });
39654         }
39655
39656         function abortUnwantedRequests$1(cache, tiles) {
39657             Object.keys(cache.inflightTile).forEach(function(k) {
39658                 var wanted = tiles.find(function(tile) { return k === tile.id; });
39659                 if (!wanted) {
39660                     abortRequest$1(cache.inflightTile[k]);
39661                     delete cache.inflightTile[k];
39662                 }
39663             });
39664         }
39665
39666
39667         function encodeErrorRtree$1(d) {
39668             return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d };
39669         }
39670
39671
39672         // replace or remove error from rtree
39673         function updateRtree$1(item, replace) {
39674             _erCache.rtree.remove(item, function isEql(a, b) {
39675                 return a.data.id === b.data.id;
39676             });
39677
39678             if (replace) {
39679                 _erCache.rtree.insert(item);
39680             }
39681         }
39682
39683         function linkErrorObject(d) {
39684             return '<a class="error_object_link">' + d + '</a>';
39685         }
39686
39687         function linkEntity(d) {
39688             return '<a class="error_entity_link">' + d + '</a>';
39689         }
39690
39691         function pointAverage(points) {
39692             if (points.length) {
39693                 var sum = points.reduce(function(acc, point) {
39694                     return geoVecAdd(acc, [point.lon, point.lat]);
39695                 }, [0,0]);
39696                 return geoVecScale(sum, 1 / points.length);
39697             } else {
39698                 return [0,0];
39699             }
39700         }
39701
39702         function relativeBearing(p1, p2) {
39703             var angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat);
39704             if (angle < 0) {
39705                 angle += 2 * Math.PI;
39706             }
39707
39708             // Return degrees
39709             return angle * 180 / Math.PI;
39710         }
39711
39712         // Assuming range [0,360)
39713         function cardinalDirection(bearing) {
39714             var dir = 45 * Math.round(bearing / 45);
39715             var compass = {
39716                 0: 'north',
39717                 45: 'northeast',
39718                 90: 'east',
39719                 135: 'southeast',
39720                 180: 'south',
39721                 225: 'southwest',
39722                 270: 'west',
39723                 315: 'northwest',
39724                 360: 'north'
39725             };
39726
39727             return t('QA.improveOSM.directions.' + compass[dir]);
39728         }
39729
39730         // Errors shouldn't obscure eachother
39731         function preventCoincident(loc, bumpUp) {
39732             var coincident = false;
39733             do {
39734                 // first time, move marker up. after that, move marker right.
39735                 var delta = coincident ? [0.00001, 0] : (bumpUp ? [0, 0.00001] : [0, 0]);
39736                 loc = geoVecAdd(loc, delta);
39737                 var bbox = geoExtent(loc).bbox();
39738                 coincident = _erCache.rtree.search(bbox).length;
39739             } while (coincident);
39740
39741             return loc;
39742         }
39743
39744         var serviceImproveOSM = {
39745             init: function() {
39746                 if (!_erCache) {
39747                     this.reset();
39748                 }
39749
39750                 this.event = utilRebind(this, dispatch$2, 'on');
39751             },
39752
39753             reset: function() {
39754                 if (_erCache) {
39755                     Object.values(_erCache.inflightTile).forEach(abortRequest$1);
39756                 }
39757                 _erCache = {
39758                     data: {},
39759                     loadedTile: {},
39760                     inflightTile: {},
39761                     inflightPost: {},
39762                     closed: {},
39763                     rtree: rbush_1()
39764                 };
39765             },
39766
39767             loadErrors: function(projection) {
39768                 var options = {
39769                     client: 'iD',
39770                     status: 'OPEN',
39771                     zoom: '19' // Use a high zoom so that clusters aren't returned
39772                 };
39773
39774                 // determine the needed tiles to cover the view
39775                 var tiles = tiler$1
39776                     .zoomExtent([_erZoom, _erZoom])
39777                     .getTiles(projection);
39778
39779                 // abort inflight requests that are no longer needed
39780                 abortUnwantedRequests$1(_erCache, tiles);
39781
39782                 // issue new requests..
39783                 tiles.forEach(function(tile) {
39784                     if (_erCache.loadedTile[tile.id] || _erCache.inflightTile[tile.id]) return;
39785
39786                     var rect = tile.extent.rectangle();
39787                     var params = Object.assign({}, options, { east: rect[0], south: rect[3], west: rect[2], north: rect[1] });
39788
39789                     // 3 separate requests to store for each tile
39790                     var requests = {};
39791
39792                     Object.keys(_impOsmUrls).forEach(function(k) {
39793                         var v = _impOsmUrls[k];
39794                         // We exclude WATER from missing geometry as it doesn't seem useful
39795                         // We use most confident one-way and turn restrictions only, still have false positives
39796                         var kParams = Object.assign({},
39797                             params,
39798                             (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' }
39799                         );
39800                         var url = v + '/search?' + utilQsString(kParams);
39801
39802                         var controller = new AbortController();
39803                         requests[k] = controller;
39804
39805                         d3_json(url, { signal: controller.signal })
39806                             .then(function(data) {
39807                                 delete _erCache.inflightTile[tile.id][k];
39808                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39809                                     delete _erCache.inflightTile[tile.id];
39810                                     _erCache.loadedTile[tile.id] = true;
39811                                 }
39812
39813                                 // Road segments at high zoom == oneways
39814                                 if (data.roadSegments) {
39815                                     data.roadSegments.forEach(function(feature) {
39816                                         // Position error at the approximate middle of the segment
39817                                         var points = feature.points;
39818                                         var mid = points.length / 2;
39819                                         var loc;
39820
39821                                         // Even number of points, find midpoint of the middle two
39822                                         // Odd number of points, use position of very middle point
39823                                         if (mid % 1 === 0) {
39824                                             loc = pointAverage([points[mid - 1], points[mid]]);
39825                                         } else {
39826                                             mid = points[Math.floor(mid)];
39827                                             loc = [mid.lon, mid.lat];
39828                                         }
39829
39830                                         // One-ways can land on same segment in opposite direction
39831                                         loc = preventCoincident(loc, false);
39832
39833                                         var d = new qaError({
39834                                             // Info required for every error
39835                                             loc: loc,
39836                                             service: 'improveOSM',
39837                                             error_type: k,
39838                                             // Extra details needed for this service
39839                                             error_key: k,
39840                                             identifier: { // this is used to post changes to the error
39841                                                 wayId: feature.wayId,
39842                                                 fromNodeId: feature.fromNodeId,
39843                                                 toNodeId: feature.toNodeId
39844                                             },
39845                                             object_id: feature.wayId,
39846                                             object_type: 'way',
39847                                             status: feature.status
39848                                         });
39849
39850                                         // Variables used in the description
39851                                         d.replacements = {
39852                                             percentage: feature.percentOfTrips,
39853                                             num_trips: feature.numberOfTrips,
39854                                             highway: linkErrorObject(t('QA.keepRight.error_parts.highway')),
39855                                             from_node: linkEntity('n' + feature.fromNodeId),
39856                                             to_node: linkEntity('n' + feature.toNodeId)
39857                                         };
39858
39859                                         _erCache.data[d.id] = d;
39860                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39861                                     });
39862                                 }
39863
39864                                 // Tiles at high zoom == missing roads
39865                                 if (data.tiles) {
39866                                     data.tiles.forEach(function(feature) {
39867                                         var geoType = feature.type.toLowerCase();
39868
39869                                         // Average of recorded points should land on the missing geometry
39870                                         // Missing geometry could happen to land on another error
39871                                         var loc = pointAverage(feature.points);
39872                                         loc = preventCoincident(loc, false);
39873
39874                                         var d = new qaError({
39875                                             // Info required for every error
39876                                             loc: loc,
39877                                             service: 'improveOSM',
39878                                             error_type: k + '-' + geoType,
39879                                             // Extra details needed for this service
39880                                             error_key: k,
39881                                             identifier: { x: feature.x, y: feature.y },
39882                                             status: feature.status
39883                                         });
39884
39885                                         d.replacements = {
39886                                             num_trips: feature.numberOfTrips,
39887                                             geometry_type: t('QA.improveOSM.geometry_types.' + geoType)
39888                                         };
39889
39890                                         // -1 trips indicates data came from a 3rd party
39891                                         if (feature.numberOfTrips === -1) {
39892                                             d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements);
39893                                         }
39894
39895                                         _erCache.data[d.id] = d;
39896                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39897                                     });
39898                                 }
39899
39900                                 // Entities at high zoom == turn restrictions
39901                                 if (data.entities) {
39902                                     data.entities.forEach(function(feature) {
39903                                         // Turn restrictions could be missing at same junction
39904                                         // We also want to bump the error up so node is accessible
39905                                         var loc = feature.point;
39906                                         loc = preventCoincident([loc.lon, loc.lat], true);
39907
39908                                         // Elements are presented in a strange way
39909                                         var ids = feature.id.split(',');
39910                                         var from_way = ids[0];
39911                                         var via_node = ids[3];
39912                                         var to_way = ids[2].split(':')[1];
39913
39914                                         var d = new qaError({
39915                                             // Info required for every error
39916                                             loc: loc,
39917                                             service: 'improveOSM',
39918                                             error_type: k,
39919                                             // Extra details needed for this service
39920                                             error_key: k,
39921                                             identifier: feature.id,
39922                                             object_id: via_node,
39923                                             object_type: 'node',
39924                                             status: feature.status
39925                                         });
39926
39927                                         // Travel direction along from_way clarifies the turn restriction
39928                                         var p1 = feature.segments[0].points[0];
39929                                         var p2 = feature.segments[0].points[1];
39930
39931                                         var dir_of_travel = cardinalDirection(relativeBearing(p1, p2));
39932
39933                                         // Variables used in the description
39934                                         d.replacements = {
39935                                             num_passed: feature.numberOfPasses,
39936                                             num_trips: feature.segments[0].numberOfTrips,
39937                                             turn_restriction: feature.turnType.toLowerCase(),
39938                                             from_way: linkEntity('w' + from_way),
39939                                             to_way: linkEntity('w' + to_way),
39940                                             travel_direction: dir_of_travel,
39941                                             junction: linkErrorObject(t('QA.keepRight.error_parts.this_node'))
39942                                         };
39943
39944                                         _erCache.data[d.id] = d;
39945                                         _erCache.rtree.insert(encodeErrorRtree$1(d));
39946                                         dispatch$2.call('loaded');
39947                                     });
39948                                 }
39949                             })
39950                             .catch(function() {
39951                                 delete _erCache.inflightTile[tile.id][k];
39952                                 if (!Object.keys(_erCache.inflightTile[tile.id]).length) {
39953                                     delete _erCache.inflightTile[tile.id];
39954                                     _erCache.loadedTile[tile.id] = true;
39955                                 }
39956                             });
39957                     });
39958
39959                     _erCache.inflightTile[tile.id] = requests;
39960                 });
39961             },
39962
39963             getComments: function(d, callback) {
39964                 // If comments already retrieved no need to do so again
39965                 if (d.comments !== undefined) {
39966                     if (callback) callback({}, d);
39967                     return;
39968                 }
39969
39970                 var key = d.error_key;
39971                 var qParams = {};
39972
39973                 if (key === 'ow') {
39974                     qParams = d.identifier;
39975                 } else if (key === 'mr') {
39976                     qParams.tileX = d.identifier.x;
39977                     qParams.tileY = d.identifier.y;
39978                 } else if (key === 'tr') {
39979                     qParams.targetId = d.identifier;
39980                 }
39981
39982                 var url = _impOsmUrls[key] + '/retrieveComments?' + utilQsString(qParams);
39983
39984                 var that = this;
39985                 d3_json(url)
39986                     .then(function(data) {
39987                         // comments are served newest to oldest
39988                         var comments = data.comments ? data.comments.reverse() : [];
39989                         that.replaceError(d.update({ comments: comments }));
39990                         if (callback) callback(null, d);
39991                     })
39992                     .catch(function(err) {
39993                         if (callback) callback(err.message);
39994                     });
39995             },
39996
39997             postUpdate: function(d, callback) {
39998                 if (!serviceOsm.authenticated()) { // Username required in payload
39999                     return callback({ message: 'Not Authenticated', status: -3}, d);
40000                 }
40001                 if (_erCache.inflightPost[d.id]) {
40002                     return callback({ message: 'Error update already inflight', status: -2 }, d);
40003                 }
40004
40005                 var that = this;
40006
40007                 // Payload can only be sent once username is established
40008                 serviceOsm.userDetails(sendPayload);
40009
40010                 function sendPayload(err, user) {
40011                     if (err) { return callback(err, d); }
40012
40013                     var key = d.error_key;
40014                     var url = _impOsmUrls[key] + '/comment';
40015                     var payload = {
40016                         username: user.display_name
40017                     };
40018
40019                     // Each error type has different data for identification
40020                     if (key === 'ow') {
40021                         payload.roadSegments = [ d.identifier ];
40022                     } else if (key === 'mr') {
40023                         payload.tiles = [ d.identifier ];
40024                     } else if (key === 'tr') {
40025                         payload.targetIds = [ d.identifier ];
40026                     }
40027
40028                     if (d.newStatus !== undefined) {
40029                         payload.status = d.newStatus;
40030                         payload.text = 'status changed';
40031                     }
40032
40033                     // Comment take place of default text
40034                     if (d.newComment !== undefined) {
40035                         payload.text = d.newComment;
40036                     }
40037
40038                     var controller = new AbortController();
40039                     _erCache.inflightPost[d.id] = controller;
40040
40041                     var options = {
40042                         method: 'POST',
40043                         signal: controller.signal,
40044                         body: JSON.stringify(payload)
40045                     };
40046
40047                      d3_json(url, options)
40048                         .then(function() {
40049                             delete _erCache.inflightPost[d.id];
40050
40051                             // Just a comment, update error in cache
40052                             if (d.newStatus === undefined) {
40053                                 var now = new Date();
40054                                 var comments = d.comments ? d.comments : [];
40055
40056                                 comments.push({
40057                                     username: payload.username,
40058                                     text: payload.text,
40059                                     timestamp: now.getTime() / 1000
40060                                 });
40061
40062                                 that.replaceError(d.update({
40063                                     comments: comments,
40064                                     newComment: undefined
40065                                 }));
40066                             } else {
40067                                 that.removeError(d);
40068                                 if (d.newStatus === 'SOLVED') {
40069                                     // No pretty identifier, so we just use coordinates
40070                                     var closedID = d.loc[1].toFixed(5) + '/' + d.loc[0].toFixed(5);
40071                                     _erCache.closed[key + ':' + closedID] = true;
40072                                 }
40073                             }
40074                             if (callback) callback(null, d);
40075                         })
40076                         .catch(function(err) {
40077                             delete _erCache.inflightPost[d.id];
40078                             if (callback) callback(err.message);
40079                         });
40080                 }
40081             },
40082
40083
40084             // get all cached errors covering the viewport
40085             getErrors: function(projection) {
40086                 var viewport = projection.clipExtent();
40087                 var min = [viewport[0][0], viewport[1][1]];
40088                 var max = [viewport[1][0], viewport[0][1]];
40089                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40090
40091                 return _erCache.rtree.search(bbox).map(function(d) {
40092                     return d.data;
40093                 });
40094             },
40095
40096             // get a single error from the cache
40097             getError: function(id) {
40098                 return _erCache.data[id];
40099             },
40100
40101             // replace a single error in the cache
40102             replaceError: function(error) {
40103                 if (!(error instanceof qaError) || !error.id) return;
40104
40105                 _erCache.data[error.id] = error;
40106                 updateRtree$1(encodeErrorRtree$1(error), true); // true = replace
40107                 return error;
40108             },
40109
40110             // remove a single error from the cache
40111             removeError: function(error) {
40112                 if (!(error instanceof qaError) || !error.id) return;
40113
40114                 delete _erCache.data[error.id];
40115                 updateRtree$1(encodeErrorRtree$1(error), false); // false = remove
40116             },
40117
40118             // Used to populate `closed:improveosm` changeset tag
40119             getClosedIDs: function() {
40120                 return Object.keys(_erCache.closed).sort();
40121             }
40122         };
40123
40124         /*
40125             A standalone SVG element that contains only a `defs` sub-element. To be
40126             used once globally, since defs IDs must be unique within a document.
40127         */
40128         function svgDefs(context) {
40129
40130             function drawDefs(selection) {
40131                 var defs = selection.append('defs');
40132
40133                 // add markers
40134                 defs
40135                     .append('marker')
40136                     .attr('id', 'oneway-marker')
40137                     .attr('viewBox', '0 0 10 5')
40138                     .attr('refX', 2.5)
40139                     .attr('refY', 2.5)
40140                     .attr('markerWidth', 2)
40141                     .attr('markerHeight', 2)
40142                     .attr('markerUnits', 'strokeWidth')
40143                     .attr('orient', 'auto')
40144                     .append('path')
40145                     .attr('class', 'oneway-marker-path')
40146                     .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')
40147                     .attr('stroke', 'none')
40148                     .attr('fill', '#000')
40149                     .attr('opacity', '0.75');
40150
40151                 // SVG markers have to be given a colour where they're defined
40152                 // (they can't inherit it from the line they're attached to),
40153                 // so we need to manually define markers for each color of tag
40154                 // (also, it's slightly nicer if we can control the
40155                 // positioning for different tags)
40156                 function addSidedMarker(name, color, offset) {
40157                     defs
40158                         .append('marker')
40159                         .attr('id', 'sided-marker-' + name)
40160                         .attr('viewBox', '0 0 2 2')
40161                         .attr('refX', 1)
40162                         .attr('refY', -offset)
40163                         .attr('markerWidth', 1.5)
40164                         .attr('markerHeight', 1.5)
40165                         .attr('markerUnits', 'strokeWidth')
40166                         .attr('orient', 'auto')
40167                         .append('path')
40168                         .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
40169                         .attr('d', 'M 0,0 L 1,1 L 2,0 z')
40170                         .attr('stroke', 'none')
40171                         .attr('fill', color);
40172                 }
40173                 addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
40174                 // for a coastline, the arrows are (somewhat unintuitively) on
40175                 // the water side, so let's color them blue (with a gap) to
40176                 // give a stronger indication
40177                 addSidedMarker('coastline', '#77dede', 1);
40178                 // barriers have a dashed line, and separating the triangle
40179                 // from the line visually suits that
40180                 addSidedMarker('barrier', '#ddd', 1);
40181                 addSidedMarker('man_made', '#fff', 0);
40182
40183                 defs
40184                     .append('marker')
40185                     .attr('id', 'viewfield-marker')
40186                     .attr('viewBox', '0 0 16 16')
40187                     .attr('refX', 8)
40188                     .attr('refY', 16)
40189                     .attr('markerWidth', 4)
40190                     .attr('markerHeight', 4)
40191                     .attr('markerUnits', 'strokeWidth')
40192                     .attr('orient', 'auto')
40193                     .append('path')
40194                     .attr('class', 'viewfield-marker-path')
40195                     .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')
40196                     .attr('fill', '#333')
40197                     .attr('fill-opacity', '0.75')
40198                     .attr('stroke', '#fff')
40199                     .attr('stroke-width', '0.5px')
40200                     .attr('stroke-opacity', '0.75');
40201
40202                 defs
40203                     .append('marker')
40204                     .attr('id', 'viewfield-marker-wireframe')
40205                     .attr('viewBox', '0 0 16 16')
40206                     .attr('refX', 8)
40207                     .attr('refY', 16)
40208                     .attr('markerWidth', 4)
40209                     .attr('markerHeight', 4)
40210                     .attr('markerUnits', 'strokeWidth')
40211                     .attr('orient', 'auto')
40212                     .append('path')
40213                     .attr('class', 'viewfield-marker-path')
40214                     .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')
40215                     .attr('fill', 'none')
40216                     .attr('stroke', '#fff')
40217                     .attr('stroke-width', '0.5px')
40218                     .attr('stroke-opacity', '0.75');
40219
40220                 // add patterns
40221                 var patterns = defs.selectAll('pattern')
40222                     .data([
40223                         // pattern name, pattern image name
40224                         ['beach', 'dots'],
40225                         ['construction', 'construction'],
40226                         ['cemetery', 'cemetery'],
40227                         ['cemetery_christian', 'cemetery_christian'],
40228                         ['cemetery_buddhist', 'cemetery_buddhist'],
40229                         ['cemetery_muslim', 'cemetery_muslim'],
40230                         ['cemetery_jewish', 'cemetery_jewish'],
40231                         ['farmland', 'farmland'],
40232                         ['farmyard', 'farmyard'],
40233                         ['forest', 'forest'],
40234                         ['forest_broadleaved', 'forest_broadleaved'],
40235                         ['forest_needleleaved', 'forest_needleleaved'],
40236                         ['forest_leafless', 'forest_leafless'],
40237                         ['grass', 'grass'],
40238                         ['landfill', 'landfill'],
40239                         ['meadow', 'grass'],
40240                         ['orchard', 'orchard'],
40241                         ['pond', 'pond'],
40242                         ['quarry', 'quarry'],
40243                         ['scrub', 'bushes'],
40244                         ['vineyard', 'vineyard'],
40245                         ['water_standing', 'lines'],
40246                         ['waves', 'waves'],
40247                         ['wetland', 'wetland'],
40248                         ['wetland_marsh', 'wetland_marsh'],
40249                         ['wetland_swamp', 'wetland_swamp'],
40250                         ['wetland_bog', 'wetland_bog'],
40251                         ['wetland_reedbed', 'wetland_reedbed']
40252                     ])
40253                     .enter()
40254                     .append('pattern')
40255                     .attr('id', function (d) { return 'pattern-' + d[0]; })
40256                     .attr('width', 32)
40257                     .attr('height', 32)
40258                     .attr('patternUnits', 'userSpaceOnUse');
40259
40260                 patterns
40261                     .append('rect')
40262                     .attr('x', 0)
40263                     .attr('y', 0)
40264                     .attr('width', 32)
40265                     .attr('height', 32)
40266                     .attr('class', function (d) { return 'pattern-color-' + d[0]; });
40267
40268                 patterns
40269                     .append('image')
40270                     .attr('x', 0)
40271                     .attr('y', 0)
40272                     .attr('width', 32)
40273                     .attr('height', 32)
40274                     .attr('xlink:href', function (d) {
40275                         return context.imagePath('pattern/' + d[1] + '.png');
40276                     });
40277
40278                 // add clip paths
40279                 defs.selectAll('clipPath')
40280                     .data([12, 18, 20, 32, 45])
40281                     .enter()
40282                     .append('clipPath')
40283                     .attr('id', function (d) { return 'clip-square-' + d; })
40284                     .append('rect')
40285                     .attr('x', 0)
40286                     .attr('y', 0)
40287                     .attr('width', function (d) { return d; })
40288                     .attr('height', function (d) { return d; });
40289
40290                 // add symbol spritesheets
40291                 defs
40292                     .call(drawDefs.addSprites, [
40293                         'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'tnp-sprite', 'community-sprite'
40294                     ], true);
40295             }
40296
40297
40298             drawDefs.addSprites = function(selection, ids, overrideColors) {
40299                 var spritesheets = selection.selectAll('.spritesheet');
40300                 var currData = spritesheets.data();
40301                 var data = utilArrayUniq(currData.concat(ids));
40302
40303                 spritesheets
40304                     .data(data)
40305                     .enter()
40306                     .append('g')
40307                     .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
40308                     .each(function(d) {
40309                         var url = context.imagePath(d + '.svg');
40310                         var node = d3_select(this).node();
40311
40312                         svg(url)
40313                             .then(function(svg) {
40314                                 node.appendChild(
40315                                     d3_select(svg.documentElement).attr('id', d).node()
40316                                 );
40317                                 if (overrideColors && d !== 'iD-sprite') {   // allow icon colors to be overridden..
40318                                     d3_select(node).selectAll('path')
40319                                         .attr('fill', 'currentColor');
40320                                 }
40321                             })
40322                             .catch(function() {
40323                                 /* ignore */
40324                             });
40325                     });
40326             };
40327
40328
40329             return drawDefs;
40330         }
40331
40332         /* global Mapillary:false */
40333
40334
40335         var apibase = 'https://a.mapillary.com/v3/';
40336         var viewercss = 'mapillary-js/mapillary.min.css';
40337         var viewerjs = 'mapillary-js/mapillary.min.js';
40338         var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
40339         var maxResults = 1000;
40340         var tileZoom = 14;
40341         var tiler$2 = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
40342         var dispatch$3 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
40343         var _mlyFallback = false;
40344         var _mlyCache;
40345         var _mlyClicks;
40346         var _mlySelectedImage;
40347         var _mlyViewer;
40348
40349
40350         function abortRequest$2(controller) {
40351             controller.abort();
40352         }
40353
40354
40355         function maxPageAtZoom(z) {
40356             if (z < 15)   return 2;
40357             if (z === 15) return 5;
40358             if (z === 16) return 10;
40359             if (z === 17) return 20;
40360             if (z === 18) return 40;
40361             if (z > 18)   return 80;
40362         }
40363
40364
40365         function loadTiles(which, url, projection) {
40366             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
40367             var tiles = tiler$2.getTiles(projection);
40368
40369             // abort inflight requests that are no longer needed
40370             var cache = _mlyCache[which];
40371             Object.keys(cache.inflight).forEach(function(k) {
40372                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
40373                 if (!wanted) {
40374                     abortRequest$2(cache.inflight[k]);
40375                     delete cache.inflight[k];
40376                 }
40377             });
40378
40379             tiles.forEach(function(tile) {
40380                 loadNextTilePage(which, currZoom, url, tile);
40381             });
40382         }
40383
40384
40385         function loadNextTilePage(which, currZoom, url, tile) {
40386             var cache = _mlyCache[which];
40387             var rect = tile.extent.rectangle();
40388             var maxPages = maxPageAtZoom(currZoom);
40389             var nextPage = cache.nextPage[tile.id] || 0;
40390             var nextURL = cache.nextURL[tile.id] || url +
40391                 utilQsString({
40392                     per_page: maxResults,
40393                     page: nextPage,
40394                     client_id: clientId,
40395                     bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
40396                 });
40397
40398             if (nextPage > maxPages) return;
40399
40400             var id = tile.id + ',' + String(nextPage);
40401             if (cache.loaded[id] || cache.inflight[id]) return;
40402
40403             var controller = new AbortController();
40404             cache.inflight[id] = controller;
40405
40406             var options = {
40407                 method: 'GET',
40408                 signal: controller.signal,
40409                 headers: { 'Content-Type': 'application/json' }
40410             };
40411
40412             fetch(nextURL, options)
40413                 .then(function(response) {
40414                     if (!response.ok) {
40415                         throw new Error(response.status + ' ' + response.statusText);
40416                     }
40417                     var linkHeader = response.headers.get('Link');
40418                     if (linkHeader) {
40419                         var pagination = parsePagination(linkHeader);
40420                         if (pagination.next) {
40421                             cache.nextURL[tile.id] = pagination.next;
40422                         }
40423                     }
40424                     return response.json();
40425                 })
40426                 .then(function(data) {
40427                     cache.loaded[id] = true;
40428                     delete cache.inflight[id];
40429                     if (!data || !data.features || !data.features.length) {
40430                         throw new Error('No Data');
40431                     }
40432
40433                     var features = data.features.map(function(feature) {
40434                         var loc = feature.geometry.coordinates;
40435                         var d;
40436
40437                         // An image (shown as a green dot on the map) is a single street photo with extra
40438                         // information such as location, camera angle (CA), camera model, and so on.
40439                         // Each image feature is a GeoJSON Point
40440                         if (which === 'images') {
40441                             d = {
40442                                 loc: loc,
40443                                 key: feature.properties.key,
40444                                 ca: feature.properties.ca,
40445                                 captured_at: feature.properties.captured_at,
40446                                 captured_by: feature.properties.username,
40447                                 pano: feature.properties.pano
40448                             };
40449
40450                             cache.forImageKey[d.key] = d;     // cache imageKey -> image
40451
40452                         // Mapillary organizes images as sequences. A sequence of images are continuously captured
40453                         // by a user at a give time. Sequences are shown on the map as green lines.
40454                         // Each sequence feature is a GeoJSON LineString
40455                         } else if (which === 'sequences') {
40456                             var sequenceKey = feature.properties.key;
40457                             cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
40458                             feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
40459                                 cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
40460                             });
40461                             return false;    // because no `d` data worth loading into an rbush
40462
40463                         // An image detection is a semantic pixel area on an image. The area could indicate
40464                         // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
40465                         // Each image_detection feature is a GeoJSON Point (located where the image was taken)
40466                         } else if (which === 'image_detections') {
40467                             d = {
40468                                 key: feature.properties.key,
40469                                 image_key: feature.properties.image_key,
40470                                 value: feature.properties.value,
40471                                 package: feature.properties.package,
40472                                 shape: feature.properties.shape
40473                             };
40474
40475                             // cache imageKey -> image_detections
40476                             if (!cache.forImageKey[d.image_key]) {
40477                                 cache.forImageKey[d.image_key] = [];
40478                             }
40479                             cache.forImageKey[d.image_key].push(d);
40480                             return false;    // because no `d` data worth loading into an rbush
40481
40482
40483                         // A map feature is a real world object that can be shown on a map. It could be any object
40484                         // recognized from images, manually added in images, or added on the map.
40485                         // Each map feature is a GeoJSON Point (located where the feature is)
40486                         } else if (which === 'map_features') {
40487                             d = {
40488                                 loc: loc,
40489                                 key: feature.properties.key,
40490                                 value: feature.properties.value,
40491                                 package: feature.properties.package,
40492                                 detections: feature.properties.detections
40493                             };
40494                         }
40495
40496                         return {
40497                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
40498                         };
40499
40500                     }).filter(Boolean);
40501
40502                     if (cache.rtree && features) {
40503                         cache.rtree.load(features);
40504                     }
40505
40506                     if (data.features.length === maxResults) {  // more pages to load
40507                         cache.nextPage[tile.id] = nextPage + 1;
40508                         loadNextTilePage(which, currZoom, url, tile);
40509                     } else {
40510                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
40511                     }
40512
40513                     if (which === 'images' || which === 'sequences') {
40514                         dispatch$3.call('loadedImages');
40515                     } else if (which === 'map_features') {
40516                         dispatch$3.call('loadedSigns');
40517                     }
40518                 })
40519                 .catch(function() {
40520                     cache.loaded[id] = true;
40521                     delete cache.inflight[id];
40522                 });
40523         }
40524
40525         // extract links to pages of API results
40526         function parsePagination(links) {
40527             return links.split(',').map(function(rel) {
40528                 var elements = rel.split(';');
40529                 if (elements.length === 2) {
40530                     return [
40531                         /<(.+)>/.exec(elements[0])[1],
40532                         /rel="(.+)"/.exec(elements[1])[1]
40533                     ];
40534                 } else {
40535                     return ['',''];
40536                 }
40537             }).reduce(function(pagination, val) {
40538                 pagination[val[1]] = val[0];
40539                 return pagination;
40540             }, {});
40541         }
40542
40543
40544         // partition viewport into higher zoom tiles
40545         function partitionViewport(projection) {
40546             var z = geoScaleToZoom(projection.scale());
40547             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
40548             var tiler = utilTiler().zoomExtent([z2, z2]);
40549
40550             return tiler.getTiles(projection)
40551                 .map(function(tile) { return tile.extent; });
40552         }
40553
40554
40555         // no more than `limit` results per partition.
40556         function searchLimited(limit, projection, rtree) {
40557             limit = limit || 5;
40558
40559             return partitionViewport(projection)
40560                 .reduce(function(result, extent) {
40561                     var found = rtree.search(extent.bbox())
40562                         .slice(0, limit)
40563                         .map(function(d) { return d.data; });
40564
40565                     return (found.length ? result.concat(found) : result);
40566                 }, []);
40567         }
40568
40569
40570
40571         var serviceMapillary = {
40572
40573             init: function() {
40574                 if (!_mlyCache) {
40575                     this.reset();
40576                 }
40577
40578                 this.event = utilRebind(this, dispatch$3, 'on');
40579             },
40580
40581             reset: function() {
40582                 if (_mlyCache) {
40583                     Object.values(_mlyCache.images.inflight).forEach(abortRequest$2);
40584                     Object.values(_mlyCache.image_detections.inflight).forEach(abortRequest$2);
40585                     Object.values(_mlyCache.map_features.inflight).forEach(abortRequest$2);
40586                     Object.values(_mlyCache.sequences.inflight).forEach(abortRequest$2);
40587                 }
40588
40589                 _mlyCache = {
40590                     images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
40591                     image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
40592                     map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
40593                     sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
40594                 };
40595
40596                 _mlySelectedImage = null;
40597                 _mlyClicks = [];
40598             },
40599
40600
40601             images: function(projection) {
40602                 var limit = 5;
40603                 return searchLimited(limit, projection, _mlyCache.images.rtree);
40604             },
40605
40606
40607             signs: function(projection) {
40608                 var limit = 5;
40609                 return searchLimited(limit, projection, _mlyCache.map_features.rtree);
40610             },
40611
40612
40613             cachedImage: function(imageKey) {
40614                 return _mlyCache.images.forImageKey[imageKey];
40615             },
40616
40617
40618             sequences: function(projection) {
40619                 var viewport = projection.clipExtent();
40620                 var min = [viewport[0][0], viewport[1][1]];
40621                 var max = [viewport[1][0], viewport[0][1]];
40622                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
40623                 var sequenceKeys = {};
40624
40625                 // all sequences for images in viewport
40626                 _mlyCache.images.rtree.search(bbox)
40627                     .forEach(function(d) {
40628                         var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
40629                         if (sequenceKey) {
40630                             sequenceKeys[sequenceKey] = true;
40631                         }
40632                     });
40633
40634                 // Return lineStrings for the sequences
40635                 return Object.keys(sequenceKeys).map(function(sequenceKey) {
40636                     return _mlyCache.sequences.lineString[sequenceKey];
40637                 });
40638             },
40639
40640
40641             signsSupported: function() {
40642                 return true;
40643             },
40644
40645
40646             loadImages: function(projection) {
40647                 loadTiles('images', apibase + 'images?', projection);
40648                 loadTiles('sequences', apibase + 'sequences?', projection);
40649             },
40650
40651
40652             loadSigns: function(projection) {
40653                 // if we are looking at signs, we'll actually need to fetch images too
40654                 loadTiles('images', apibase + 'images?', projection);
40655                 loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
40656                 loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
40657             },
40658
40659
40660             loadViewer: function(context) {
40661                 // add mly-wrapper
40662                 var wrap = d3_select('#photoviewer').selectAll('.mly-wrapper')
40663                     .data([0]);
40664
40665                 wrap.enter()
40666                     .append('div')
40667                     .attr('id', 'mly')
40668                     .attr('class', 'photo-wrapper mly-wrapper')
40669                     .classed('hide', true);
40670
40671                 // load mapillary-viewercss
40672                 d3_select('head').selectAll('#mapillary-viewercss')
40673                     .data([0])
40674                     .enter()
40675                     .append('link')
40676                     .attr('id', 'mapillary-viewercss')
40677                     .attr('rel', 'stylesheet')
40678                     .attr('href', context.asset(viewercss));
40679
40680                 // load mapillary-viewerjs
40681                 d3_select('head').selectAll('#mapillary-viewerjs')
40682                     .data([0])
40683                     .enter()
40684                     .append('script')
40685                     .attr('id', 'mapillary-viewerjs')
40686                     .attr('src', context.asset(viewerjs));
40687
40688                 // load mapillary signs sprite
40689                 var defs = context.container().select('defs');
40690                 defs.call(svgDefs(context).addSprites, ['mapillary-sprite'], false /* don't override colors */ );
40691
40692                 // Register viewer resize handler
40693                 context.ui().photoviewer.on('resize', function() {
40694                     if (_mlyViewer) {
40695                         _mlyViewer.resize();
40696                     }
40697                 });
40698             },
40699
40700
40701             showViewer: function() {
40702                 var wrap = d3_select('#photoviewer')
40703                     .classed('hide', false);
40704
40705                 var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
40706
40707                 if (isHidden && _mlyViewer) {
40708                     wrap
40709                         .selectAll('.photo-wrapper:not(.mly-wrapper)')
40710                         .classed('hide', true);
40711
40712                     wrap
40713                         .selectAll('.photo-wrapper.mly-wrapper')
40714                         .classed('hide', false);
40715
40716                     _mlyViewer.resize();
40717                 }
40718
40719                 return this;
40720             },
40721
40722
40723             hideViewer: function() {
40724                 _mlySelectedImage = null;
40725
40726                 if (!_mlyFallback && _mlyViewer) {
40727                     _mlyViewer.getComponent('sequence').stop();
40728                 }
40729
40730                 var viewer = d3_select('#photoviewer');
40731                 if (!viewer.empty()) viewer.datum(null);
40732
40733                 viewer
40734                     .classed('hide', true)
40735                     .selectAll('.photo-wrapper')
40736                     .classed('hide', true);
40737
40738                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
40739                     .classed('currentView', false);
40740
40741                 return this.setStyles(null, true);
40742             },
40743
40744
40745             parsePagination: parsePagination,
40746
40747
40748             updateViewer: function(imageKey, context) {
40749                 if (!imageKey) return this;
40750
40751                 if (!_mlyViewer) {
40752                     this.initViewer(imageKey, context);
40753                 } else {
40754                     _mlyViewer.moveToKey(imageKey)
40755                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40756                 }
40757
40758                 return this;
40759             },
40760
40761
40762             initViewer: function(imageKey, context) {
40763                 var that = this;
40764                 if (window.Mapillary && imageKey) {
40765                     var opts = {
40766                         baseImageSize: 320,
40767                         component: {
40768                             cover: false,
40769                             keyboard: false,
40770                             tag: true
40771                         }
40772                     };
40773
40774                     // Disable components requiring WebGL support
40775                     if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
40776                         _mlyFallback = true;
40777                         opts.component = {
40778                             cover: false,
40779                             direction: false,
40780                             imagePlane: false,
40781                             keyboard: false,
40782                             mouse: false,
40783                             sequence: false,
40784                             tag: false,
40785                             image: true,        // fallback
40786                             navigation: true    // fallback
40787                         };
40788                     }
40789
40790                     _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
40791                     _mlyViewer.on('nodechanged', nodeChanged);
40792                     _mlyViewer.on('bearingchanged', bearingChanged);
40793                     _mlyViewer.moveToKey(imageKey)
40794                         .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
40795                 }
40796
40797                 // nodeChanged: called after the viewer has changed images and is ready.
40798                 //
40799                 // There is some logic here to batch up clicks into a _mlyClicks array
40800                 // because the user might click on a lot of markers quickly and nodechanged
40801                 // may be called out of order asychronously.
40802                 //
40803                 // Clicks are added to the array in `selectedImage` and removed here.
40804                 //
40805                 function nodeChanged(node) {
40806                     if (!_mlyFallback) {
40807                         _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
40808                     }
40809
40810                     var clicks = _mlyClicks;
40811                     var index = clicks.indexOf(node.key);
40812                     var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
40813
40814                     if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
40815                         clicks.splice(index, 1);   // remove the click
40816                         // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
40817                         // one more time to update the detections and attribution..
40818                         if (node.key === selectedKey) {
40819                             that.selectImage(_mlySelectedImage, node.key, true);
40820                         }
40821                     } else {             // `nodechanged` initiated from the Mapillary viewer controls..
40822                         var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
40823                         context.map().centerEase(loc);
40824                         that.selectImage(undefined, node.key, true);
40825                     }
40826                 }
40827
40828                 function bearingChanged(e) {
40829                     dispatch$3.call('bearingChanged', undefined, e);
40830                 }
40831             },
40832
40833
40834             // Pass the image datum itself in `d` or the `imageKey` string.
40835             // This allows images to be selected from places that dont have access
40836             // to the full image datum (like the street signs layer or the js viewer)
40837             selectImage: function(d, imageKey, fromViewer) {
40838                 if (!d && imageKey) {
40839                     // If the user clicked on something that's not an image marker, we
40840                     // might get in here.. Cache lookup can fail, e.g. if the user
40841                     // clicked a streetsign, but images are loading slowly asynchronously.
40842                     // We'll try to carry on anyway if there is no datum.  There just
40843                     // might be a delay before user sees detections, captured_at, etc.
40844                     d = _mlyCache.images.forImageKey[imageKey];
40845                 }
40846
40847                 _mlySelectedImage = d;
40848                 var viewer = d3_select('#photoviewer');
40849                 if (!viewer.empty()) viewer.datum(d);
40850
40851                 imageKey = (d && d.key) || imageKey;
40852                 if (!fromViewer && imageKey) {
40853                     _mlyClicks.push(imageKey);
40854                 }
40855
40856                 this.setStyles(null, true);
40857
40858                 // if signs signs are shown, highlight the ones that appear in this image
40859                 d3_selectAll('.layer-mapillary-signs .icon-sign')
40860                     .classed('currentView', function(d) {
40861                         return d.detections.some(function(detection) {
40862                             return detection.image_key === imageKey;
40863                         });
40864                     });
40865
40866                 if (d) {
40867                     this.updateDetections(d);
40868                 }
40869
40870                 return this;
40871             },
40872
40873
40874             getSelectedImage: function() {
40875                 return _mlySelectedImage;
40876             },
40877
40878
40879             getSequenceKeyForImage: function(d) {
40880                 var imageKey = d && d.key;
40881                 return imageKey && _mlyCache.sequences.forImageKey[imageKey];
40882             },
40883
40884
40885             // Updates the currently highlighted sequence and selected bubble.
40886             // Reset is only necessary when interacting with the viewport because
40887             // this implicitly changes the currently selected bubble/sequence
40888             setStyles: function(hovered, reset) {
40889                 if (reset) {  // reset all layers
40890                     d3_selectAll('.viewfield-group')
40891                         .classed('highlighted', false)
40892                         .classed('hovered', false)
40893                         .classed('currentView', false);
40894
40895                     d3_selectAll('.sequence')
40896                         .classed('highlighted', false)
40897                         .classed('currentView', false);
40898                 }
40899
40900                 var hoveredImageKey = hovered && hovered.key;
40901                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
40902                 var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
40903                 var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
40904
40905                 var viewer = d3_select('#photoviewer');
40906                 var selected = viewer.empty() ? undefined : viewer.datum();
40907                 var selectedImageKey = selected && selected.key;
40908                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
40909                 var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
40910                 var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
40911
40912                 // highlight sibling viewfields on either the selected or the hovered sequences
40913                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
40914
40915                 d3_selectAll('.layer-mapillary .viewfield-group')
40916                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
40917                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
40918                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
40919
40920                 d3_selectAll('.layer-mapillary .sequence')
40921                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
40922                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
40923
40924                 // update viewfields if needed
40925                 d3_selectAll('.viewfield-group .viewfield')
40926                     .attr('d', viewfieldPath);
40927
40928                 function viewfieldPath() {
40929                     var d = this.parentNode.__data__;
40930                     if (d.pano && d.key !== selectedImageKey) {
40931                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
40932                     } else {
40933                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
40934                     }
40935                 }
40936
40937                 return this;
40938             },
40939
40940
40941             updateDetections: function(d) {
40942                 if (!_mlyViewer || _mlyFallback) return;
40943
40944                 var imageKey = d && d.key;
40945                 if (!imageKey) return;
40946
40947                 var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
40948                 detections.forEach(function(data) {
40949                     var tag = makeTag(data);
40950                     if (tag) {
40951                         var tagComponent = _mlyViewer.getComponent('tag');
40952                         tagComponent.add([tag]);
40953                     }
40954                 });
40955
40956                 function makeTag(data) {
40957                     var valueParts = data.value.split('--');
40958                     if (valueParts.length !== 3) return;
40959
40960                     var text = valueParts[1].replace(/-/g, ' ');
40961                     var tag;
40962
40963                     // Currently only two shapes <Polygon|Point>
40964                     if (data.shape.type === 'Polygon') {
40965                         var polygonGeometry = new Mapillary
40966                             .TagComponent
40967                             .PolygonGeometry(data.shape.coordinates[0]);
40968
40969                         tag = new Mapillary.TagComponent.OutlineTag(
40970                             data.key,
40971                             polygonGeometry,
40972                             {
40973                                 text: text,
40974                                 textColor: 0xffff00,
40975                                 lineColor: 0xffff00,
40976                                 lineWidth: 2,
40977                                 fillColor: 0xffff00,
40978                                 fillOpacity: 0.3,
40979                             }
40980                         );
40981
40982                     } else if (data.shape.type === 'Point') {
40983                         var pointGeometry = new Mapillary
40984                             .TagComponent
40985                             .PointGeometry(data.shape.coordinates[0]);
40986
40987                         tag = new Mapillary.TagComponent.SpotTag(
40988                             data.key,
40989                             pointGeometry,
40990                             {
40991                                 text: text,
40992                                 color: 0xffff00,
40993                                 textColor: 0xffff00
40994                             }
40995                         );
40996                     }
40997
40998                     return tag;
40999                 }
41000             },
41001
41002
41003             cache: function() {
41004                 return _mlyCache;
41005             }
41006
41007         };
41008
41009         function validationIssue(attrs) {
41010             this.type = attrs.type;                // required - name of rule that created the issue (e.g. 'missing_tag')
41011             this.subtype = attrs.subtype;          // optional - category of the issue within the type (e.g. 'relation_type' under 'missing_tag')
41012             this.severity = attrs.severity;        // required - 'warning' or 'error'
41013             this.message = attrs.message;          // required - function returning localized string
41014             this.reference = attrs.reference;      // optional - function(selection) to render reference information
41015             this.entityIds = attrs.entityIds;      // optional - array of IDs of entities involved in the issue
41016             this.loc = attrs.loc;                  // optional - [lon, lat] to zoom in on to see the issue
41017             this.data = attrs.data;                // optional - object containing extra data for the fixes
41018             this.fixes = attrs.fixes || [];              // optional - array of validationIssueFix objects
41019             this.hash = attrs.hash;                // optional - string to further differentiate the issue
41020
41021             this.id = generateID.apply(this);      // generated - see below
41022             this.autoFix = null;                   // generated - if autofix exists, will be set below
41023
41024             // A unique, deterministic string hash.
41025             // Issues with identical id values are considered identical.
41026             function generateID() {
41027                 var parts = [this.type];
41028
41029                 if (this.hash) {   // subclasses can pass in their own differentiator
41030                     parts.push(this.hash);
41031                 }
41032
41033                 if (this.subtype) {
41034                     parts.push(this.subtype);
41035                 }
41036
41037                 // include the entities this issue is for
41038                 // (sort them so the id is deterministic)
41039                 if (this.entityIds) {
41040                     var entityKeys = this.entityIds.slice().sort();
41041                     parts.push.apply(parts, entityKeys);
41042                 }
41043
41044                 return parts.join(':');
41045             }
41046
41047             this.extent = function(resolver) {
41048                 if (this.loc) {
41049                     return geoExtent(this.loc);
41050                 }
41051                 if (this.entityIds && this.entityIds.length) {
41052                     return this.entityIds.reduce(function(extent, entityId) {
41053                         return extent.extend(resolver.entity(entityId).extent(resolver));
41054                     }, geoExtent());
41055                 }
41056                 return null;
41057             };
41058
41059
41060             if (this.fixes) {   // add a reference in the fixes to the issue for use in fix actions
41061                 for (var i = 0; i < this.fixes.length; i++) {
41062                     var fix = this.fixes[i];
41063                     fix.issue = this;
41064                     if (fix.autoArgs) {
41065                         this.autoFix = fix;
41066                     }
41067                 }
41068             }
41069         }
41070
41071
41072         function validationIssueFix(attrs) {
41073             this.title = attrs.title;                 // Required
41074             this.onClick = attrs.onClick;             // Required
41075             this.icon = attrs.icon;                   // Optional - shows 'iD-icon-wrench' if not set
41076             this.entityIds = attrs.entityIds || [];   // Optional - Used for hover-higlighting.
41077             this.autoArgs = attrs.autoArgs;           // Optional - pass [actions, annotation] arglist if this fix can automatically run
41078
41079             this.issue = null;    // Generated link - added by ValidationIssue constructor
41080         }
41081
41082         var buildRuleChecks = function() {
41083             return {
41084                 equals: function (equals) {
41085                     return function(tags) {
41086                         return Object.keys(equals).every(function(k) {
41087                             return equals[k] === tags[k];
41088                         });
41089                     };
41090                 },
41091                 notEquals: function (notEquals) {
41092                     return function(tags) {
41093                         return Object.keys(notEquals).some(function(k) {
41094                             return notEquals[k] !== tags[k];
41095                         });
41096                     };
41097                 },
41098                 absence: function(absence) {
41099                     return function(tags) {
41100                         return Object.keys(tags).indexOf(absence) === -1;
41101                     };
41102                 },
41103                 presence: function(presence) {
41104                     return function(tags) {
41105                         return Object.keys(tags).indexOf(presence) > -1;
41106                     };
41107                 },
41108                 greaterThan: function(greaterThan) {
41109                     var key = Object.keys(greaterThan)[0];
41110                     var value = greaterThan[key];
41111
41112                     return function(tags) {
41113                         return tags[key] > value;
41114                     };
41115                 },
41116                 greaterThanEqual: function(greaterThanEqual) {
41117                     var key = Object.keys(greaterThanEqual)[0];
41118                     var value = greaterThanEqual[key];
41119
41120                     return function(tags) {
41121                         return tags[key] >= value;
41122                     };
41123                 },
41124                 lessThan: function(lessThan) {
41125                     var key = Object.keys(lessThan)[0];
41126                     var value = lessThan[key];
41127
41128                     return function(tags) {
41129                         return tags[key] < value;
41130                     };
41131                 },
41132                 lessThanEqual: function(lessThanEqual) {
41133                     var key = Object.keys(lessThanEqual)[0];
41134                     var value = lessThanEqual[key];
41135
41136                     return function(tags) {
41137                         return tags[key] <= value;
41138                     };
41139                 },
41140                 positiveRegex: function(positiveRegex) {
41141                     var tagKey = Object.keys(positiveRegex)[0];
41142                     var expression = positiveRegex[tagKey].join('|');
41143                     var regex = new RegExp(expression);
41144
41145                     return function(tags) {
41146                         return regex.test(tags[tagKey]);
41147                     };
41148                 },
41149                 negativeRegex: function(negativeRegex) {
41150                     var tagKey = Object.keys(negativeRegex)[0];
41151                     var expression = negativeRegex[tagKey].join('|');
41152                     var regex = new RegExp(expression);
41153
41154                     return function(tags) {
41155                         return !regex.test(tags[tagKey]);
41156                     };
41157                 }
41158             };
41159         };
41160
41161         var buildLineKeys = function() {
41162             return {
41163                 highway: {
41164                     rest_area: true,
41165                     services: true
41166                 },
41167                 railway: {
41168                     roundhouse: true,
41169                     station: true,
41170                     traverser: true,
41171                     turntable: true,
41172                     wash: true
41173                 }
41174             };
41175         };
41176
41177         var serviceMapRules = {
41178             init: function() {
41179                 this._ruleChecks  = buildRuleChecks();
41180                 this._validationRules = [];
41181                 this._areaKeys = osmAreaKeys;
41182                 this._lineKeys = buildLineKeys();
41183             },
41184
41185             // list of rules only relevant to tag checks...
41186             filterRuleChecks: function(selector) {
41187                 var _ruleChecks = this._ruleChecks;
41188                 return Object.keys(selector).reduce(function(rules, key) {
41189                     if (['geometry', 'error', 'warning'].indexOf(key) === -1) {
41190                         rules.push(_ruleChecks[key](selector[key]));
41191                     }
41192                     return rules;
41193                 }, []);
41194             },
41195
41196             // builds tagMap from mapcss-parse selector object...
41197             buildTagMap: function(selector) {
41198                 var getRegexValues = function(regexes) {
41199                     return regexes.map(function(regex) {
41200                         return regex.replace(/\$|\^/g, '');
41201                     });
41202                 };
41203
41204                 var tagMap = Object.keys(selector).reduce(function (expectedTags, key) {
41205                     var values;
41206                     var isRegex = /regex/gi.test(key);
41207                     var isEqual = /equals/gi.test(key);
41208
41209                     if (isRegex || isEqual) {
41210                         Object.keys(selector[key]).forEach(function(selectorKey) {
41211                             values = isEqual ? [selector[key][selectorKey]] : getRegexValues(selector[key][selectorKey]);
41212
41213                             if (expectedTags.hasOwnProperty(selectorKey)) {
41214                                 values = values.concat(expectedTags[selectorKey]);
41215                             }
41216
41217                             expectedTags[selectorKey] = values;
41218                         });
41219
41220                     } else if (/(greater|less)Than(Equal)?|presence/g.test(key)) {
41221                         var tagKey = /presence/.test(key) ? selector[key] : Object.keys(selector[key])[0];
41222
41223                         values = [selector[key][tagKey]];
41224
41225                         if (expectedTags.hasOwnProperty(tagKey)) {
41226                             values = values.concat(expectedTags[tagKey]);
41227                         }
41228
41229                         expectedTags[tagKey] = values;
41230                     }
41231
41232                     return expectedTags;
41233                 }, {});
41234
41235                 return tagMap;
41236             },
41237
41238             // inspired by osmWay#isArea()
41239             inferGeometry: function(tagMap) {
41240                 var _lineKeys = this._lineKeys;
41241                 var _areaKeys = this._areaKeys;
41242
41243                 var isAreaKeyBlackList = function(key) {
41244                     return utilArrayIntersection(tagMap[key], Object.keys(_areaKeys[key])).length > 0;
41245                 };
41246                 var isLineKeysWhiteList = function(key) {
41247                     return utilArrayIntersection(tagMap[key], Object.keys(_lineKeys[key])).length > 0;
41248                 };
41249
41250                 if (tagMap.hasOwnProperty('area')) {
41251                     if (tagMap.area.indexOf('yes') > -1) {
41252                         return 'area';
41253                     }
41254                     if (tagMap.area.indexOf('no') > -1) {
41255                         return 'line';
41256                     }
41257                 }
41258
41259                 for (var key in tagMap) {
41260                     if (key in _areaKeys && !isAreaKeyBlackList(key)) {
41261                         return 'area';
41262                     }
41263                     if (key in _lineKeys && isLineKeysWhiteList(key)) {
41264                         return 'area';
41265                     }
41266                 }
41267
41268                 return 'line';
41269             },
41270
41271             // adds from mapcss-parse selector check...
41272             addRule: function(selector) {
41273                 var rule = {
41274                     // checks relevant to mapcss-selector
41275                     checks: this.filterRuleChecks(selector),
41276                     // true if all conditions for a tag error are true..
41277                     matches: function(entity) {
41278                         return this.checks.every(function(check) {
41279                             return check(entity.tags);
41280                         });
41281                     },
41282                     // borrowed from Way#isArea()
41283                     inferredGeometry: this.inferGeometry(this.buildTagMap(selector), this._areaKeys),
41284                     geometryMatches: function(entity, graph) {
41285                         if (entity.type === 'node' || entity.type === 'relation') {
41286                             return selector.geometry === entity.type;
41287                         } else if (entity.type === 'way') {
41288                             return this.inferredGeometry === entity.geometry(graph);
41289                         }
41290                     },
41291                     // when geometries match and tag matches are present, return a warning...
41292                     findIssues: function (entity, graph, issues) {
41293                         if (this.geometryMatches(entity, graph) && this.matches(entity)) {
41294                             var severity = Object.keys(selector).indexOf('error') > -1
41295                                     ? 'error'
41296                                     : 'warning';
41297                             var message = selector[severity];
41298                             issues.push(new validationIssue({
41299                                 type: 'maprules',
41300                                 severity: severity,
41301                                 message: function() {
41302                                     return message;
41303                                 },
41304                                 entityIds: [entity.id]
41305                             }));
41306                         }
41307                     }
41308                 };
41309                 this._validationRules.push(rule);
41310             },
41311
41312             clearRules: function() { this._validationRules = []; },
41313
41314             // returns validationRules...
41315             validationRules: function() { return this._validationRules; },
41316
41317             // returns ruleChecks
41318             ruleChecks: function() { return this._ruleChecks; }
41319         };
41320
41321         var apibase$1 = 'https://nominatim.openstreetmap.org/';
41322         var _inflight = {};
41323         var _nominatimCache;
41324
41325
41326         var serviceNominatim = {
41327
41328             init: function() {
41329                 _inflight = {};
41330                 _nominatimCache = rbush_1();
41331             },
41332
41333             reset: function() {
41334                 Object.values(_inflight).forEach(function(controller) { controller.abort(); });
41335                 _inflight = {};
41336                 _nominatimCache = rbush_1();
41337             },
41338
41339
41340             countryCode: function (location, callback) {
41341                 this.reverse(location, function(err, result) {
41342                     if (err) {
41343                         return callback(err);
41344                     } else if (result.address) {
41345                         return callback(null, result.address.country_code);
41346                     } else {
41347                         return callback('Unable to geocode', null);
41348                     }
41349                 });
41350             },
41351
41352
41353             reverse: function (loc, callback) {
41354                 var cached = _nominatimCache.search(
41355                     { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] }
41356                 );
41357
41358                 if (cached.length > 0) {
41359                     if (callback) callback(null, cached[0].data);
41360                     return;
41361                 }
41362
41363                 var params = { zoom: 13, format: 'json', addressdetails: 1, lat: loc[1], lon: loc[0] };
41364                 var url = apibase$1 + 'reverse?' + utilQsString(params);
41365
41366                 if (_inflight[url]) return;
41367                 var controller = new AbortController();
41368                 _inflight[url] = controller;
41369
41370                 d3_json(url, { signal: controller.signal })
41371                     .then(function(result) {
41372                         delete _inflight[url];
41373                         if (result && result.error) {
41374                             throw new Error(result.error);
41375                         }
41376                         var extent = geoExtent(loc).padByMeters(200);
41377                         _nominatimCache.insert(Object.assign(extent.bbox(), {data: result}));
41378                         if (callback) callback(null, result);
41379                     })
41380                     .catch(function(err) {
41381                         delete _inflight[url];
41382                         if (err.name === 'AbortError') return;
41383                         if (callback) callback(err.message);
41384                     });
41385             },
41386
41387
41388             search: function (val, callback) {
41389                 var searchVal = encodeURIComponent(val);
41390                 var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
41391
41392                 if (_inflight[url]) return;
41393                 var controller = new AbortController();
41394                 _inflight[url] = controller;
41395
41396                 d3_json(url, { signal: controller.signal })
41397                     .then(function(result) {
41398                         delete _inflight[url];
41399                         if (result && result.error) {
41400                             throw new Error(result.error);
41401                         }
41402                         if (callback) callback(null, result);
41403                     })
41404                     .catch(function(err) {
41405                         delete _inflight[url];
41406                         if (err.name === 'AbortError') return;
41407                         if (callback) callback(err.message);
41408                     });
41409             }
41410
41411         };
41412
41413         var apibase$2 = 'https://openstreetcam.org';
41414         var maxResults$1 = 1000;
41415         var tileZoom$1 = 14;
41416         var tiler$3 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
41417         var dispatch$4 = dispatch('loadedImages');
41418         var imgZoom = d3_zoom()
41419             .extent([[0, 0], [320, 240]])
41420             .translateExtent([[0, 0], [320, 240]])
41421             .scaleExtent([1, 15])
41422             .on('zoom', zoomPan);
41423         var _oscCache;
41424         var _oscSelectedImage;
41425
41426
41427         function abortRequest$3(controller) {
41428             controller.abort();
41429         }
41430
41431
41432         function maxPageAtZoom$1(z) {
41433             if (z < 15)   return 2;
41434             if (z === 15) return 5;
41435             if (z === 16) return 10;
41436             if (z === 17) return 20;
41437             if (z === 18) return 40;
41438             if (z > 18)   return 80;
41439         }
41440
41441
41442         function loadTiles$1(which, url, projection) {
41443             var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
41444             var tiles = tiler$3.getTiles(projection);
41445
41446             // abort inflight requests that are no longer needed
41447             var cache = _oscCache[which];
41448             Object.keys(cache.inflight).forEach(function(k) {
41449                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
41450                 if (!wanted) {
41451                     abortRequest$3(cache.inflight[k]);
41452                     delete cache.inflight[k];
41453                 }
41454             });
41455
41456             tiles.forEach(function(tile) {
41457                 loadNextTilePage$1(which, currZoom, url, tile);
41458             });
41459         }
41460
41461
41462         function loadNextTilePage$1(which, currZoom, url, tile) {
41463             var cache = _oscCache[which];
41464             var bbox = tile.extent.bbox();
41465             var maxPages = maxPageAtZoom$1(currZoom);
41466             var nextPage = cache.nextPage[tile.id] || 1;
41467             var params = utilQsString({
41468                 ipp: maxResults$1,
41469                 page: nextPage,
41470                 // client_id: clientId,
41471                 bbTopLeft: [bbox.maxY, bbox.minX].join(','),
41472                 bbBottomRight: [bbox.minY, bbox.maxX].join(',')
41473             }, true);
41474
41475             if (nextPage > maxPages) return;
41476
41477             var id = tile.id + ',' + String(nextPage);
41478             if (cache.loaded[id] || cache.inflight[id]) return;
41479
41480             var controller = new AbortController();
41481             cache.inflight[id] = controller;
41482
41483             var options = {
41484                 method: 'POST',
41485                 signal: controller.signal,
41486                 body: params,
41487                 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
41488             };
41489
41490             d3_json(url, options)
41491                 .then(function(data) {
41492                     cache.loaded[id] = true;
41493                     delete cache.inflight[id];
41494                     if (!data || !data.currentPageItems || !data.currentPageItems.length) {
41495                         throw new Error('No Data');
41496                     }
41497
41498                     var features = data.currentPageItems.map(function(item) {
41499                         var loc = [+item.lng, +item.lat];
41500                         var d;
41501
41502                         if (which === 'images') {
41503                             d = {
41504                                 loc: loc,
41505                                 key: item.id,
41506                                 ca: +item.heading,
41507                                 captured_at: (item.shot_date || item.date_added),
41508                                 captured_by: item.username,
41509                                 imagePath: item.lth_name,
41510                                 sequence_id: item.sequence_id,
41511                                 sequence_index: +item.sequence_index
41512                             };
41513
41514                             // cache sequence info
41515                             var seq = _oscCache.sequences[d.sequence_id];
41516                             if (!seq) {
41517                                 seq = { rotation: 0, images: [] };
41518                                 _oscCache.sequences[d.sequence_id] = seq;
41519                             }
41520                             seq.images[d.sequence_index] = d;
41521                         }
41522
41523                         return {
41524                             minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
41525                         };
41526                     });
41527
41528                     cache.rtree.load(features);
41529
41530                     if (data.currentPageItems.length === maxResults$1) {  // more pages to load
41531                         cache.nextPage[tile.id] = nextPage + 1;
41532                         loadNextTilePage$1(which, currZoom, url, tile);
41533                     } else {
41534                         cache.nextPage[tile.id] = Infinity;     // no more pages to load
41535                     }
41536
41537                     if (which === 'images') {
41538                         dispatch$4.call('loadedImages');
41539                     }
41540                 })
41541                 .catch(function() {
41542                     cache.loaded[id] = true;
41543                     delete cache.inflight[id];
41544                 });
41545         }
41546
41547
41548         // partition viewport into higher zoom tiles
41549         function partitionViewport$1(projection) {
41550             var z = geoScaleToZoom(projection.scale());
41551             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
41552             var tiler = utilTiler().zoomExtent([z2, z2]);
41553
41554             return tiler.getTiles(projection)
41555                 .map(function(tile) { return tile.extent; });
41556         }
41557
41558
41559         // no more than `limit` results per partition.
41560         function searchLimited$1(limit, projection, rtree) {
41561             limit = limit || 5;
41562
41563             return partitionViewport$1(projection)
41564                 .reduce(function(result, extent) {
41565                     var found = rtree.search(extent.bbox())
41566                         .slice(0, limit)
41567                         .map(function(d) { return d.data; });
41568
41569                     return (found.length ? result.concat(found) : result);
41570                 }, []);
41571         }
41572
41573
41574         function zoomPan() {
41575             var t = event.transform;
41576             d3_select('#photoviewer .osc-image-wrap')
41577                 .call(utilSetTransform, t.x, t.y, t.k);
41578         }
41579
41580
41581         var serviceOpenstreetcam = {
41582
41583             init: function() {
41584                 if (!_oscCache) {
41585                     this.reset();
41586                 }
41587
41588                 this.event = utilRebind(this, dispatch$4, 'on');
41589             },
41590
41591             reset: function() {
41592                 if (_oscCache) {
41593                     Object.values(_oscCache.images.inflight).forEach(abortRequest$3);
41594                 }
41595
41596                 _oscCache = {
41597                     images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
41598                     sequences: {}
41599                 };
41600
41601                 _oscSelectedImage = null;
41602             },
41603
41604
41605             images: function(projection) {
41606                 var limit = 5;
41607                 return searchLimited$1(limit, projection, _oscCache.images.rtree);
41608             },
41609
41610
41611             sequences: function(projection) {
41612                 var viewport = projection.clipExtent();
41613                 var min = [viewport[0][0], viewport[1][1]];
41614                 var max = [viewport[1][0], viewport[0][1]];
41615                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
41616                 var sequenceKeys = {};
41617
41618                 // all sequences for images in viewport
41619                 _oscCache.images.rtree.search(bbox)
41620                     .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
41621
41622                 // make linestrings from those sequences
41623                 var lineStrings = [];
41624                 Object.keys(sequenceKeys)
41625                     .forEach(function(sequenceKey) {
41626                         var seq = _oscCache.sequences[sequenceKey];
41627                         var images = seq && seq.images;
41628                         if (images) {
41629                             lineStrings.push({
41630                                 type: 'LineString',
41631                                 coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
41632                                 properties: { key: sequenceKey }
41633                             });
41634                         }
41635                     });
41636                 return lineStrings;
41637             },
41638
41639
41640             loadImages: function(projection) {
41641                 var url = apibase$2 + '/1.0/list/nearby-photos/';
41642                 loadTiles$1('images', url, projection);
41643             },
41644
41645
41646             loadViewer: function(context) {
41647                 var that = this;
41648
41649                 // add osc-wrapper
41650                 var wrap = d3_select('#photoviewer').selectAll('.osc-wrapper')
41651                     .data([0]);
41652
41653                 var wrapEnter = wrap.enter()
41654                     .append('div')
41655                     .attr('class', 'photo-wrapper osc-wrapper')
41656                     .classed('hide', true)
41657                     .call(imgZoom)
41658                     .on('dblclick.zoom', null);
41659
41660                 wrapEnter
41661                     .append('div')
41662                     .attr('class', 'photo-attribution fillD');
41663
41664                 var controlsEnter = wrapEnter
41665                     .append('div')
41666                     .attr('class', 'photo-controls-wrap')
41667                     .append('div')
41668                     .attr('class', 'photo-controls');
41669
41670                 controlsEnter
41671                     .append('button')
41672                     .on('click.back', step(-1))
41673                     .text('◄');
41674
41675                 controlsEnter
41676                     .append('button')
41677                     .on('click.rotate-ccw', rotate(-90))
41678                     .text('⤿');
41679
41680                 controlsEnter
41681                     .append('button')
41682                     .on('click.rotate-cw', rotate(90))
41683                     .text('⤾');
41684
41685                 controlsEnter
41686                     .append('button')
41687                     .on('click.forward', step(1))
41688                     .text('►');
41689
41690                 wrapEnter
41691                     .append('div')
41692                     .attr('class', 'osc-image-wrap');
41693
41694
41695                 // Register viewer resize handler
41696                 context.ui().photoviewer.on('resize', function(dimensions) {
41697                     imgZoom = d3_zoom()
41698                         .extent([[0, 0], dimensions])
41699                         .translateExtent([[0, 0], dimensions])
41700                         .scaleExtent([1, 15])
41701                         .on('zoom', zoomPan);
41702                 });
41703
41704
41705                 function rotate(deg) {
41706                     return function() {
41707                         if (!_oscSelectedImage) return;
41708                         var sequenceKey = _oscSelectedImage.sequence_id;
41709                         var sequence = _oscCache.sequences[sequenceKey];
41710                         if (!sequence) return;
41711
41712                         var r = sequence.rotation || 0;
41713                         r += deg;
41714
41715                         if (r > 180) r -= 360;
41716                         if (r < -180) r += 360;
41717                         sequence.rotation = r;
41718
41719                         var wrap = d3_select('#photoviewer .osc-wrapper');
41720
41721                         wrap
41722                             .transition()
41723                             .duration(100)
41724                             .call(imgZoom.transform, identity$8);
41725
41726                         wrap.selectAll('.osc-image')
41727                             .transition()
41728                             .duration(100)
41729                             .style('transform', 'rotate(' + r + 'deg)');
41730                     };
41731                 }
41732
41733                 function step(stepBy) {
41734                     return function() {
41735                         if (!_oscSelectedImage) return;
41736                         var sequenceKey = _oscSelectedImage.sequence_id;
41737                         var sequence = _oscCache.sequences[sequenceKey];
41738                         if (!sequence) return;
41739
41740                         var nextIndex = _oscSelectedImage.sequence_index + stepBy;
41741                         var nextImage = sequence.images[nextIndex];
41742                         if (!nextImage) return;
41743
41744                         context.map().centerEase(nextImage.loc);
41745
41746                         that
41747                             .selectImage(nextImage)
41748                             .updateViewer(nextImage);
41749                     };
41750                 }
41751             },
41752
41753
41754             showViewer: function() {
41755                 var viewer = d3_select('#photoviewer')
41756                     .classed('hide', false);
41757
41758                 var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
41759
41760                 if (isHidden) {
41761                     viewer
41762                         .selectAll('.photo-wrapper:not(.osc-wrapper)')
41763                         .classed('hide', true);
41764
41765                     viewer
41766                         .selectAll('.photo-wrapper.osc-wrapper')
41767                         .classed('hide', false);
41768                 }
41769
41770                 return this;
41771             },
41772
41773
41774             hideViewer: function() {
41775                 _oscSelectedImage = null;
41776
41777                 var viewer = d3_select('#photoviewer');
41778                 if (!viewer.empty()) viewer.datum(null);
41779
41780                 viewer
41781                     .classed('hide', true)
41782                     .selectAll('.photo-wrapper')
41783                     .classed('hide', true);
41784
41785                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
41786                     .classed('currentView', false);
41787
41788                 return this.setStyles(null, true);
41789             },
41790
41791
41792             updateViewer: function(d) {
41793                 var wrap = d3_select('#photoviewer .osc-wrapper');
41794                 var imageWrap = wrap.selectAll('.osc-image-wrap');
41795                 var attribution = wrap.selectAll('.photo-attribution').html('');
41796
41797                 wrap
41798                     .transition()
41799                     .duration(100)
41800                     .call(imgZoom.transform, identity$8);
41801
41802                 imageWrap
41803                     .selectAll('.osc-image')
41804                     .remove();
41805
41806                 if (d) {
41807                     var sequence = _oscCache.sequences[d.sequence_id];
41808                     var r = (sequence && sequence.rotation) || 0;
41809
41810                     imageWrap
41811                         .append('img')
41812                         .attr('class', 'osc-image')
41813                         .attr('src', apibase$2 + '/' + d.imagePath)
41814                         .style('transform', 'rotate(' + r + 'deg)');
41815
41816                     if (d.captured_by) {
41817                         attribution
41818                             .append('a')
41819                             .attr('class', 'captured_by')
41820                             .attr('target', '_blank')
41821                             .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
41822                             .text('@' + d.captured_by);
41823
41824                         attribution
41825                             .append('span')
41826                             .text('|');
41827                     }
41828
41829                     if (d.captured_at) {
41830                         attribution
41831                             .append('span')
41832                             .attr('class', 'captured_at')
41833                             .text(localeDateString(d.captured_at));
41834
41835                         attribution
41836                             .append('span')
41837                             .text('|');
41838                     }
41839
41840                     attribution
41841                         .append('a')
41842                         .attr('class', 'image-link')
41843                         .attr('target', '_blank')
41844                         .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
41845                         .text('openstreetcam.org');
41846                 }
41847
41848                 return this;
41849
41850
41851                 function localeDateString(s) {
41852                     if (!s) return null;
41853                     var detected = utilDetect();
41854                     var options = { day: 'numeric', month: 'short', year: 'numeric' };
41855                     var d = new Date(s);
41856                     if (isNaN(d.getTime())) return null;
41857                     return d.toLocaleDateString(detected.locale, options);
41858                 }
41859             },
41860
41861
41862             selectImage: function(d) {
41863                 _oscSelectedImage = d;
41864                 var viewer = d3_select('#photoviewer');
41865                 if (!viewer.empty()) viewer.datum(d);
41866
41867                 this.setStyles(null, true);
41868
41869                 d3_selectAll('.icon-sign')
41870                     .classed('currentView', false);
41871
41872                 return this;
41873             },
41874
41875
41876             getSelectedImage: function() {
41877                 return _oscSelectedImage;
41878             },
41879
41880
41881             getSequenceKeyForImage: function(d) {
41882                 return d && d.sequence_id;
41883             },
41884
41885
41886             // Updates the currently highlighted sequence and selected bubble.
41887             // Reset is only necessary when interacting with the viewport because
41888             // this implicitly changes the currently selected bubble/sequence
41889             setStyles: function(hovered, reset) {
41890                 if (reset) {  // reset all layers
41891                     d3_selectAll('.viewfield-group')
41892                         .classed('highlighted', false)
41893                         .classed('hovered', false)
41894                         .classed('currentView', false);
41895
41896                     d3_selectAll('.sequence')
41897                         .classed('highlighted', false)
41898                         .classed('currentView', false);
41899                 }
41900
41901                 var hoveredImageKey = hovered && hovered.key;
41902                 var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
41903                 var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
41904                 var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
41905
41906                 var viewer = d3_select('#photoviewer');
41907                 var selected = viewer.empty() ? undefined : viewer.datum();
41908                 var selectedImageKey = selected && selected.key;
41909                 var selectedSequenceKey = this.getSequenceKeyForImage(selected);
41910                 var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
41911                 var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
41912
41913                 // highlight sibling viewfields on either the selected or the hovered sequences
41914                 var highlightedImageKeys = utilArrayUnion(hoveredImageKeys, selectedImageKeys);
41915
41916                 d3_selectAll('.layer-openstreetcam .viewfield-group')
41917                     .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
41918                     .classed('hovered', function(d) { return d.key === hoveredImageKey; })
41919                     .classed('currentView', function(d) { return d.key === selectedImageKey; });
41920
41921                 d3_selectAll('.layer-openstreetcam .sequence')
41922                     .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
41923                     .classed('currentView', function(d) { return d.properties.key === selectedSequenceKey; });
41924
41925                 // update viewfields if needed
41926                 d3_selectAll('.viewfield-group .viewfield')
41927                     .attr('d', viewfieldPath);
41928
41929                 function viewfieldPath() {
41930                     var d = this.parentNode.__data__;
41931                     if (d.pano && d.key !== selectedImageKey) {
41932                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
41933                     } else {
41934                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
41935                     }
41936                 }
41937
41938                 return this;
41939             },
41940
41941
41942             cache: function() {
41943                 return _oscCache;
41944             }
41945
41946         };
41947
41948         /**
41949          * Checks if `value` is the
41950          * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
41951          * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
41952          *
41953          * @static
41954          * @memberOf _
41955          * @since 0.1.0
41956          * @category Lang
41957          * @param {*} value The value to check.
41958          * @returns {boolean} Returns `true` if `value` is an object, else `false`.
41959          * @example
41960          *
41961          * _.isObject({});
41962          * // => true
41963          *
41964          * _.isObject([1, 2, 3]);
41965          * // => true
41966          *
41967          * _.isObject(_.noop);
41968          * // => true
41969          *
41970          * _.isObject(null);
41971          * // => false
41972          */
41973         function isObject$1(value) {
41974           var type = typeof value;
41975           return value != null && (type == 'object' || type == 'function');
41976         }
41977
41978         /** Detect free variable `global` from Node.js. */
41979         var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
41980
41981         /** Detect free variable `self`. */
41982         var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
41983
41984         /** Used as a reference to the global object. */
41985         var root$3 = freeGlobal || freeSelf || Function('return this')();
41986
41987         /**
41988          * Gets the timestamp of the number of milliseconds that have elapsed since
41989          * the Unix epoch (1 January 1970 00:00:00 UTC).
41990          *
41991          * @static
41992          * @memberOf _
41993          * @since 2.4.0
41994          * @category Date
41995          * @returns {number} Returns the timestamp.
41996          * @example
41997          *
41998          * _.defer(function(stamp) {
41999          *   console.log(_.now() - stamp);
42000          * }, _.now());
42001          * // => Logs the number of milliseconds it took for the deferred invocation.
42002          */
42003         var now$1 = function() {
42004           return root$3.Date.now();
42005         };
42006
42007         /** Built-in value references. */
42008         var Symbol$1 = root$3.Symbol;
42009
42010         /** Used for built-in method references. */
42011         var objectProto = Object.prototype;
42012
42013         /** Used to check objects for own properties. */
42014         var hasOwnProperty$1 = objectProto.hasOwnProperty;
42015
42016         /**
42017          * Used to resolve the
42018          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42019          * of values.
42020          */
42021         var nativeObjectToString = objectProto.toString;
42022
42023         /** Built-in value references. */
42024         var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;
42025
42026         /**
42027          * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
42028          *
42029          * @private
42030          * @param {*} value The value to query.
42031          * @returns {string} Returns the raw `toStringTag`.
42032          */
42033         function getRawTag(value) {
42034           var isOwn = hasOwnProperty$1.call(value, symToStringTag),
42035               tag = value[symToStringTag];
42036
42037           try {
42038             value[symToStringTag] = undefined;
42039             var unmasked = true;
42040           } catch (e) {}
42041
42042           var result = nativeObjectToString.call(value);
42043           if (unmasked) {
42044             if (isOwn) {
42045               value[symToStringTag] = tag;
42046             } else {
42047               delete value[symToStringTag];
42048             }
42049           }
42050           return result;
42051         }
42052
42053         /** Used for built-in method references. */
42054         var objectProto$1 = Object.prototype;
42055
42056         /**
42057          * Used to resolve the
42058          * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
42059          * of values.
42060          */
42061         var nativeObjectToString$1 = objectProto$1.toString;
42062
42063         /**
42064          * Converts `value` to a string using `Object.prototype.toString`.
42065          *
42066          * @private
42067          * @param {*} value The value to convert.
42068          * @returns {string} Returns the converted string.
42069          */
42070         function objectToString(value) {
42071           return nativeObjectToString$1.call(value);
42072         }
42073
42074         /** `Object#toString` result references. */
42075         var nullTag = '[object Null]',
42076             undefinedTag = '[object Undefined]';
42077
42078         /** Built-in value references. */
42079         var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;
42080
42081         /**
42082          * The base implementation of `getTag` without fallbacks for buggy environments.
42083          *
42084          * @private
42085          * @param {*} value The value to query.
42086          * @returns {string} Returns the `toStringTag`.
42087          */
42088         function baseGetTag(value) {
42089           if (value == null) {
42090             return value === undefined ? undefinedTag : nullTag;
42091           }
42092           return (symToStringTag$1 && symToStringTag$1 in Object(value))
42093             ? getRawTag(value)
42094             : objectToString(value);
42095         }
42096
42097         /**
42098          * Checks if `value` is object-like. A value is object-like if it's not `null`
42099          * and has a `typeof` result of "object".
42100          *
42101          * @static
42102          * @memberOf _
42103          * @since 4.0.0
42104          * @category Lang
42105          * @param {*} value The value to check.
42106          * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
42107          * @example
42108          *
42109          * _.isObjectLike({});
42110          * // => true
42111          *
42112          * _.isObjectLike([1, 2, 3]);
42113          * // => true
42114          *
42115          * _.isObjectLike(_.noop);
42116          * // => false
42117          *
42118          * _.isObjectLike(null);
42119          * // => false
42120          */
42121         function isObjectLike(value) {
42122           return value != null && typeof value == 'object';
42123         }
42124
42125         /** `Object#toString` result references. */
42126         var symbolTag = '[object Symbol]';
42127
42128         /**
42129          * Checks if `value` is classified as a `Symbol` primitive or object.
42130          *
42131          * @static
42132          * @memberOf _
42133          * @since 4.0.0
42134          * @category Lang
42135          * @param {*} value The value to check.
42136          * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
42137          * @example
42138          *
42139          * _.isSymbol(Symbol.iterator);
42140          * // => true
42141          *
42142          * _.isSymbol('abc');
42143          * // => false
42144          */
42145         function isSymbol$2(value) {
42146           return typeof value == 'symbol' ||
42147             (isObjectLike(value) && baseGetTag(value) == symbolTag);
42148         }
42149
42150         /** Used as references for various `Number` constants. */
42151         var NAN = 0 / 0;
42152
42153         /** Used to match leading and trailing whitespace. */
42154         var reTrim = /^\s+|\s+$/g;
42155
42156         /** Used to detect bad signed hexadecimal string values. */
42157         var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
42158
42159         /** Used to detect binary string values. */
42160         var reIsBinary = /^0b[01]+$/i;
42161
42162         /** Used to detect octal string values. */
42163         var reIsOctal = /^0o[0-7]+$/i;
42164
42165         /** Built-in method references without a dependency on `root`. */
42166         var freeParseInt = parseInt;
42167
42168         /**
42169          * Converts `value` to a number.
42170          *
42171          * @static
42172          * @memberOf _
42173          * @since 4.0.0
42174          * @category Lang
42175          * @param {*} value The value to process.
42176          * @returns {number} Returns the number.
42177          * @example
42178          *
42179          * _.toNumber(3.2);
42180          * // => 3.2
42181          *
42182          * _.toNumber(Number.MIN_VALUE);
42183          * // => 5e-324
42184          *
42185          * _.toNumber(Infinity);
42186          * // => Infinity
42187          *
42188          * _.toNumber('3.2');
42189          * // => 3.2
42190          */
42191         function toNumber(value) {
42192           if (typeof value == 'number') {
42193             return value;
42194           }
42195           if (isSymbol$2(value)) {
42196             return NAN;
42197           }
42198           if (isObject$1(value)) {
42199             var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
42200             value = isObject$1(other) ? (other + '') : other;
42201           }
42202           if (typeof value != 'string') {
42203             return value === 0 ? value : +value;
42204           }
42205           value = value.replace(reTrim, '');
42206           var isBinary = reIsBinary.test(value);
42207           return (isBinary || reIsOctal.test(value))
42208             ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
42209             : (reIsBadHex.test(value) ? NAN : +value);
42210         }
42211
42212         /** Error message constants. */
42213         var FUNC_ERROR_TEXT = 'Expected a function';
42214
42215         /* Built-in method references for those with the same name as other `lodash` methods. */
42216         var nativeMax = Math.max,
42217             nativeMin = Math.min;
42218
42219         /**
42220          * Creates a debounced function that delays invoking `func` until after `wait`
42221          * milliseconds have elapsed since the last time the debounced function was
42222          * invoked. The debounced function comes with a `cancel` method to cancel
42223          * delayed `func` invocations and a `flush` method to immediately invoke them.
42224          * Provide `options` to indicate whether `func` should be invoked on the
42225          * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
42226          * with the last arguments provided to the debounced function. Subsequent
42227          * calls to the debounced function return the result of the last `func`
42228          * invocation.
42229          *
42230          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42231          * invoked on the trailing edge of the timeout only if the debounced function
42232          * is invoked more than once during the `wait` timeout.
42233          *
42234          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42235          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42236          *
42237          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42238          * for details over the differences between `_.debounce` and `_.throttle`.
42239          *
42240          * @static
42241          * @memberOf _
42242          * @since 0.1.0
42243          * @category Function
42244          * @param {Function} func The function to debounce.
42245          * @param {number} [wait=0] The number of milliseconds to delay.
42246          * @param {Object} [options={}] The options object.
42247          * @param {boolean} [options.leading=false]
42248          *  Specify invoking on the leading edge of the timeout.
42249          * @param {number} [options.maxWait]
42250          *  The maximum time `func` is allowed to be delayed before it's invoked.
42251          * @param {boolean} [options.trailing=true]
42252          *  Specify invoking on the trailing edge of the timeout.
42253          * @returns {Function} Returns the new debounced function.
42254          * @example
42255          *
42256          * // Avoid costly calculations while the window size is in flux.
42257          * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
42258          *
42259          * // Invoke `sendMail` when clicked, debouncing subsequent calls.
42260          * jQuery(element).on('click', _.debounce(sendMail, 300, {
42261          *   'leading': true,
42262          *   'trailing': false
42263          * }));
42264          *
42265          * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
42266          * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
42267          * var source = new EventSource('/stream');
42268          * jQuery(source).on('message', debounced);
42269          *
42270          * // Cancel the trailing debounced invocation.
42271          * jQuery(window).on('popstate', debounced.cancel);
42272          */
42273         function debounce(func, wait, options) {
42274           var lastArgs,
42275               lastThis,
42276               maxWait,
42277               result,
42278               timerId,
42279               lastCallTime,
42280               lastInvokeTime = 0,
42281               leading = false,
42282               maxing = false,
42283               trailing = true;
42284
42285           if (typeof func != 'function') {
42286             throw new TypeError(FUNC_ERROR_TEXT);
42287           }
42288           wait = toNumber(wait) || 0;
42289           if (isObject$1(options)) {
42290             leading = !!options.leading;
42291             maxing = 'maxWait' in options;
42292             maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
42293             trailing = 'trailing' in options ? !!options.trailing : trailing;
42294           }
42295
42296           function invokeFunc(time) {
42297             var args = lastArgs,
42298                 thisArg = lastThis;
42299
42300             lastArgs = lastThis = undefined;
42301             lastInvokeTime = time;
42302             result = func.apply(thisArg, args);
42303             return result;
42304           }
42305
42306           function leadingEdge(time) {
42307             // Reset any `maxWait` timer.
42308             lastInvokeTime = time;
42309             // Start the timer for the trailing edge.
42310             timerId = setTimeout(timerExpired, wait);
42311             // Invoke the leading edge.
42312             return leading ? invokeFunc(time) : result;
42313           }
42314
42315           function remainingWait(time) {
42316             var timeSinceLastCall = time - lastCallTime,
42317                 timeSinceLastInvoke = time - lastInvokeTime,
42318                 timeWaiting = wait - timeSinceLastCall;
42319
42320             return maxing
42321               ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
42322               : timeWaiting;
42323           }
42324
42325           function shouldInvoke(time) {
42326             var timeSinceLastCall = time - lastCallTime,
42327                 timeSinceLastInvoke = time - lastInvokeTime;
42328
42329             // Either this is the first call, activity has stopped and we're at the
42330             // trailing edge, the system time has gone backwards and we're treating
42331             // it as the trailing edge, or we've hit the `maxWait` limit.
42332             return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
42333               (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
42334           }
42335
42336           function timerExpired() {
42337             var time = now$1();
42338             if (shouldInvoke(time)) {
42339               return trailingEdge(time);
42340             }
42341             // Restart the timer.
42342             timerId = setTimeout(timerExpired, remainingWait(time));
42343           }
42344
42345           function trailingEdge(time) {
42346             timerId = undefined;
42347
42348             // Only invoke if we have `lastArgs` which means `func` has been
42349             // debounced at least once.
42350             if (trailing && lastArgs) {
42351               return invokeFunc(time);
42352             }
42353             lastArgs = lastThis = undefined;
42354             return result;
42355           }
42356
42357           function cancel() {
42358             if (timerId !== undefined) {
42359               clearTimeout(timerId);
42360             }
42361             lastInvokeTime = 0;
42362             lastArgs = lastCallTime = lastThis = timerId = undefined;
42363           }
42364
42365           function flush() {
42366             return timerId === undefined ? result : trailingEdge(now$1());
42367           }
42368
42369           function debounced() {
42370             var time = now$1(),
42371                 isInvoking = shouldInvoke(time);
42372
42373             lastArgs = arguments;
42374             lastThis = this;
42375             lastCallTime = time;
42376
42377             if (isInvoking) {
42378               if (timerId === undefined) {
42379                 return leadingEdge(lastCallTime);
42380               }
42381               if (maxing) {
42382                 // Handle invocations in a tight loop.
42383                 timerId = setTimeout(timerExpired, wait);
42384                 return invokeFunc(lastCallTime);
42385               }
42386             }
42387             if (timerId === undefined) {
42388               timerId = setTimeout(timerExpired, wait);
42389             }
42390             return result;
42391           }
42392           debounced.cancel = cancel;
42393           debounced.flush = flush;
42394           return debounced;
42395         }
42396
42397         /** Error message constants. */
42398         var FUNC_ERROR_TEXT$1 = 'Expected a function';
42399
42400         /**
42401          * Creates a throttled function that only invokes `func` at most once per
42402          * every `wait` milliseconds. The throttled function comes with a `cancel`
42403          * method to cancel delayed `func` invocations and a `flush` method to
42404          * immediately invoke them. Provide `options` to indicate whether `func`
42405          * should be invoked on the leading and/or trailing edge of the `wait`
42406          * timeout. The `func` is invoked with the last arguments provided to the
42407          * throttled function. Subsequent calls to the throttled function return the
42408          * result of the last `func` invocation.
42409          *
42410          * **Note:** If `leading` and `trailing` options are `true`, `func` is
42411          * invoked on the trailing edge of the timeout only if the throttled function
42412          * is invoked more than once during the `wait` timeout.
42413          *
42414          * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
42415          * until to the next tick, similar to `setTimeout` with a timeout of `0`.
42416          *
42417          * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
42418          * for details over the differences between `_.throttle` and `_.debounce`.
42419          *
42420          * @static
42421          * @memberOf _
42422          * @since 0.1.0
42423          * @category Function
42424          * @param {Function} func The function to throttle.
42425          * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
42426          * @param {Object} [options={}] The options object.
42427          * @param {boolean} [options.leading=true]
42428          *  Specify invoking on the leading edge of the timeout.
42429          * @param {boolean} [options.trailing=true]
42430          *  Specify invoking on the trailing edge of the timeout.
42431          * @returns {Function} Returns the new throttled function.
42432          * @example
42433          *
42434          * // Avoid excessively updating the position while scrolling.
42435          * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
42436          *
42437          * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
42438          * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
42439          * jQuery(element).on('click', throttled);
42440          *
42441          * // Cancel the trailing throttled invocation.
42442          * jQuery(window).on('popstate', throttled.cancel);
42443          */
42444         function throttle(func, wait, options) {
42445           var leading = true,
42446               trailing = true;
42447
42448           if (typeof func != 'function') {
42449             throw new TypeError(FUNC_ERROR_TEXT$1);
42450           }
42451           if (isObject$1(options)) {
42452             leading = 'leading' in options ? !!options.leading : leading;
42453             trailing = 'trailing' in options ? !!options.trailing : trailing;
42454           }
42455           return debounce(func, wait, {
42456             'leading': leading,
42457             'maxWait': wait,
42458             'trailing': trailing
42459           });
42460         }
42461
42462         var hashes = createCommonjsModule(function (module, exports) {
42463         /**
42464          * jshashes - https://github.com/h2non/jshashes
42465          * Released under the "New BSD" license
42466          *
42467          * Algorithms specification:
42468          *
42469          * MD5 - http://www.ietf.org/rfc/rfc1321.txt
42470          * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
42471          * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42472          * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42473          * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
42474          * HMAC - http://www.ietf.org/rfc/rfc2104.txt
42475          */
42476         (function() {
42477           var Hashes;
42478
42479           function utf8Encode(str) {
42480             var x, y, output = '',
42481               i = -1,
42482               l;
42483
42484             if (str && str.length) {
42485               l = str.length;
42486               while ((i += 1) < l) {
42487                 /* Decode utf-16 surrogate pairs */
42488                 x = str.charCodeAt(i);
42489                 y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
42490                 if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
42491                   x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
42492                   i += 1;
42493                 }
42494                 /* Encode output as utf-8 */
42495                 if (x <= 0x7F) {
42496                   output += String.fromCharCode(x);
42497                 } else if (x <= 0x7FF) {
42498                   output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
42499                     0x80 | (x & 0x3F));
42500                 } else if (x <= 0xFFFF) {
42501                   output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
42502                     0x80 | ((x >>> 6) & 0x3F),
42503                     0x80 | (x & 0x3F));
42504                 } else if (x <= 0x1FFFFF) {
42505                   output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
42506                     0x80 | ((x >>> 12) & 0x3F),
42507                     0x80 | ((x >>> 6) & 0x3F),
42508                     0x80 | (x & 0x3F));
42509                 }
42510               }
42511             }
42512             return output;
42513           }
42514
42515           function utf8Decode(str) {
42516             var i, ac, c1, c2, c3, arr = [],
42517               l;
42518             i = ac = c1 = c2 = c3 = 0;
42519
42520             if (str && str.length) {
42521               l = str.length;
42522               str += '';
42523
42524               while (i < l) {
42525                 c1 = str.charCodeAt(i);
42526                 ac += 1;
42527                 if (c1 < 128) {
42528                   arr[ac] = String.fromCharCode(c1);
42529                   i += 1;
42530                 } else if (c1 > 191 && c1 < 224) {
42531                   c2 = str.charCodeAt(i + 1);
42532                   arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
42533                   i += 2;
42534                 } else {
42535                   c2 = str.charCodeAt(i + 1);
42536                   c3 = str.charCodeAt(i + 2);
42537                   arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
42538                   i += 3;
42539                 }
42540               }
42541             }
42542             return arr.join('');
42543           }
42544
42545           /**
42546            * Add integers, wrapping at 2^32. This uses 16-bit operations internally
42547            * to work around bugs in some JS interpreters.
42548            */
42549
42550           function safe_add(x, y) {
42551             var lsw = (x & 0xFFFF) + (y & 0xFFFF),
42552               msw = (x >> 16) + (y >> 16) + (lsw >> 16);
42553             return (msw << 16) | (lsw & 0xFFFF);
42554           }
42555
42556           /**
42557            * Bitwise rotate a 32-bit number to the left.
42558            */
42559
42560           function bit_rol(num, cnt) {
42561             return (num << cnt) | (num >>> (32 - cnt));
42562           }
42563
42564           /**
42565            * Convert a raw string to a hex string
42566            */
42567
42568           function rstr2hex(input, hexcase) {
42569             var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
42570               output = '',
42571               x, i = 0,
42572               l = input.length;
42573             for (; i < l; i += 1) {
42574               x = input.charCodeAt(i);
42575               output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
42576             }
42577             return output;
42578           }
42579
42580           /**
42581            * Convert an array of big-endian words to a string
42582            */
42583
42584           function binb2rstr(input) {
42585             var i, l = input.length * 32,
42586               output = '';
42587             for (i = 0; i < l; i += 8) {
42588               output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
42589             }
42590             return output;
42591           }
42592
42593           /**
42594            * Convert an array of little-endian words to a string
42595            */
42596
42597           function binl2rstr(input) {
42598             var i, l = input.length * 32,
42599               output = '';
42600             for (i = 0; i < l; i += 8) {
42601               output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
42602             }
42603             return output;
42604           }
42605
42606           /**
42607            * Convert a raw string to an array of little-endian words
42608            * Characters >255 have their high-byte silently ignored.
42609            */
42610
42611           function rstr2binl(input) {
42612             var i, l = input.length * 8,
42613               output = Array(input.length >> 2),
42614               lo = output.length;
42615             for (i = 0; i < lo; i += 1) {
42616               output[i] = 0;
42617             }
42618             for (i = 0; i < l; i += 8) {
42619               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
42620             }
42621             return output;
42622           }
42623
42624           /**
42625            * Convert a raw string to an array of big-endian words
42626            * Characters >255 have their high-byte silently ignored.
42627            */
42628
42629           function rstr2binb(input) {
42630             var i, l = input.length * 8,
42631               output = Array(input.length >> 2),
42632               lo = output.length;
42633             for (i = 0; i < lo; i += 1) {
42634               output[i] = 0;
42635             }
42636             for (i = 0; i < l; i += 8) {
42637               output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
42638             }
42639             return output;
42640           }
42641
42642           /**
42643            * Convert a raw string to an arbitrary string encoding
42644            */
42645
42646           function rstr2any(input, encoding) {
42647             var divisor = encoding.length,
42648               remainders = Array(),
42649               i, q, x, ld, quotient, dividend, output, full_length;
42650
42651             /* Convert to an array of 16-bit big-endian values, forming the dividend */
42652             dividend = Array(Math.ceil(input.length / 2));
42653             ld = dividend.length;
42654             for (i = 0; i < ld; i += 1) {
42655               dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
42656             }
42657
42658             /**
42659              * Repeatedly perform a long division. The binary array forms the dividend,
42660              * the length of the encoding is the divisor. Once computed, the quotient
42661              * forms the dividend for the next step. We stop when the dividend is zerHashes.
42662              * All remainders are stored for later use.
42663              */
42664             while (dividend.length > 0) {
42665               quotient = Array();
42666               x = 0;
42667               for (i = 0; i < dividend.length; i += 1) {
42668                 x = (x << 16) + dividend[i];
42669                 q = Math.floor(x / divisor);
42670                 x -= q * divisor;
42671                 if (quotient.length > 0 || q > 0) {
42672                   quotient[quotient.length] = q;
42673                 }
42674               }
42675               remainders[remainders.length] = x;
42676               dividend = quotient;
42677             }
42678
42679             /* Convert the remainders to the output string */
42680             output = '';
42681             for (i = remainders.length - 1; i >= 0; i--) {
42682               output += encoding.charAt(remainders[i]);
42683             }
42684
42685             /* Append leading zero equivalents */
42686             full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
42687             for (i = output.length; i < full_length; i += 1) {
42688               output = encoding[0] + output;
42689             }
42690             return output;
42691           }
42692
42693           /**
42694            * Convert a raw string to a base-64 string
42695            */
42696
42697           function rstr2b64(input, b64pad) {
42698             var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42699               output = '',
42700               len = input.length,
42701               i, j, triplet;
42702             b64pad = b64pad || '=';
42703             for (i = 0; i < len; i += 3) {
42704               triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42705               for (j = 0; j < 4; j += 1) {
42706                 if (i * 8 + j * 6 > input.length * 8) {
42707                   output += b64pad;
42708                 } else {
42709                   output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42710                 }
42711               }
42712             }
42713             return output;
42714           }
42715
42716           Hashes = {
42717             /**
42718              * @property {String} version
42719              * @readonly
42720              */
42721             VERSION: '1.0.6',
42722             /**
42723              * @member Hashes
42724              * @class Base64
42725              * @constructor
42726              */
42727             Base64: function() {
42728               // private properties
42729               var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
42730                 pad = '=', // default pad according with the RFC standard
42731                 utf8 = true; // by default enable UTF-8 support encoding
42732
42733               // public method for encoding
42734               this.encode = function(input) {
42735                 var i, j, triplet,
42736                   output = '',
42737                   len = input.length;
42738
42739                 pad = pad || '=';
42740                 input = (utf8) ? utf8Encode(input) : input;
42741
42742                 for (i = 0; i < len; i += 3) {
42743                   triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
42744                   for (j = 0; j < 4; j += 1) {
42745                     if (i * 8 + j * 6 > len * 8) {
42746                       output += pad;
42747                     } else {
42748                       output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
42749                     }
42750                   }
42751                 }
42752                 return output;
42753               };
42754
42755               // public method for decoding
42756               this.decode = function(input) {
42757                 // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
42758                 var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
42759                   dec = '',
42760                   arr = [];
42761                 if (!input) {
42762                   return input;
42763                 }
42764
42765                 i = ac = 0;
42766                 input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
42767                 //input += '';
42768
42769                 do { // unpack four hexets into three octets using index points in b64
42770                   h1 = tab.indexOf(input.charAt(i += 1));
42771                   h2 = tab.indexOf(input.charAt(i += 1));
42772                   h3 = tab.indexOf(input.charAt(i += 1));
42773                   h4 = tab.indexOf(input.charAt(i += 1));
42774
42775                   bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
42776
42777                   o1 = bits >> 16 & 0xff;
42778                   o2 = bits >> 8 & 0xff;
42779                   o3 = bits & 0xff;
42780                   ac += 1;
42781
42782                   if (h3 === 64) {
42783                     arr[ac] = String.fromCharCode(o1);
42784                   } else if (h4 === 64) {
42785                     arr[ac] = String.fromCharCode(o1, o2);
42786                   } else {
42787                     arr[ac] = String.fromCharCode(o1, o2, o3);
42788                   }
42789                 } while (i < input.length);
42790
42791                 dec = arr.join('');
42792                 dec = (utf8) ? utf8Decode(dec) : dec;
42793
42794                 return dec;
42795               };
42796
42797               // set custom pad string
42798               this.setPad = function(str) {
42799                 pad = str || pad;
42800                 return this;
42801               };
42802               // set custom tab string characters
42803               this.setTab = function(str) {
42804                 tab = str || tab;
42805                 return this;
42806               };
42807               this.setUTF8 = function(bool) {
42808                 if (typeof bool === 'boolean') {
42809                   utf8 = bool;
42810                 }
42811                 return this;
42812               };
42813             },
42814
42815             /**
42816              * CRC-32 calculation
42817              * @member Hashes
42818              * @method CRC32
42819              * @static
42820              * @param {String} str Input String
42821              * @return {String}
42822              */
42823             CRC32: function(str) {
42824               var crc = 0,
42825                 x = 0,
42826                 y = 0,
42827                 table, i, iTop;
42828               str = utf8Encode(str);
42829
42830               table = [
42831                 '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
42832                 '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
42833                 '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
42834                 '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
42835                 'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
42836                 '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
42837                 'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
42838                 '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
42839                 'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
42840                 '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
42841                 'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
42842                 '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
42843                 'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
42844                 '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
42845                 '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
42846                 '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
42847                 '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
42848                 'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
42849                 '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
42850                 'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
42851                 '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
42852                 'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
42853                 '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
42854                 'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
42855                 '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
42856                 'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
42857               ].join('');
42858
42859               crc = crc ^ (-1);
42860               for (i = 0, iTop = str.length; i < iTop; i += 1) {
42861                 y = (crc ^ str.charCodeAt(i)) & 0xFF;
42862                 x = '0x' + table.substr(y * 9, 8);
42863                 crc = (crc >>> 8) ^ x;
42864               }
42865               // always return a positive number (that's what >>> 0 does)
42866               return (crc ^ (-1)) >>> 0;
42867             },
42868             /**
42869              * @member Hashes
42870              * @class MD5
42871              * @constructor
42872              * @param {Object} [config]
42873              *
42874              * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
42875              * Digest Algorithm, as defined in RFC 1321.
42876              * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
42877              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
42878              * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
42879              */
42880             MD5: function(options) {
42881               /**
42882                * Private config properties. You may need to tweak these to be compatible with
42883                * the server-side, but the defaults work in most cases.
42884                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
42885                */
42886               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
42887                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
42888                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
42889
42890               // privileged (public) methods
42891               this.hex = function(s) {
42892                 return rstr2hex(rstr(s, utf8), hexcase);
42893               };
42894               this.b64 = function(s) {
42895                 return rstr2b64(rstr(s), b64pad);
42896               };
42897               this.any = function(s, e) {
42898                 return rstr2any(rstr(s, utf8), e);
42899               };
42900               this.raw = function(s) {
42901                 return rstr(s, utf8);
42902               };
42903               this.hex_hmac = function(k, d) {
42904                 return rstr2hex(rstr_hmac(k, d), hexcase);
42905               };
42906               this.b64_hmac = function(k, d) {
42907                 return rstr2b64(rstr_hmac(k, d), b64pad);
42908               };
42909               this.any_hmac = function(k, d, e) {
42910                 return rstr2any(rstr_hmac(k, d), e);
42911               };
42912               /**
42913                * Perform a simple self-test to see if the VM is working
42914                * @return {String} Hexadecimal hash sample
42915                */
42916               this.vm_test = function() {
42917                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
42918               };
42919               /**
42920                * Enable/disable uppercase hexadecimal returned string
42921                * @param {Boolean}
42922                * @return {Object} this
42923                */
42924               this.setUpperCase = function(a) {
42925                 if (typeof a === 'boolean') {
42926                   hexcase = a;
42927                 }
42928                 return this;
42929               };
42930               /**
42931                * Defines a base64 pad string
42932                * @param {String} Pad
42933                * @return {Object} this
42934                */
42935               this.setPad = function(a) {
42936                 b64pad = a || b64pad;
42937                 return this;
42938               };
42939               /**
42940                * Defines a base64 pad string
42941                * @param {Boolean}
42942                * @return {Object} [this]
42943                */
42944               this.setUTF8 = function(a) {
42945                 if (typeof a === 'boolean') {
42946                   utf8 = a;
42947                 }
42948                 return this;
42949               };
42950
42951               // private methods
42952
42953               /**
42954                * Calculate the MD5 of a raw string
42955                */
42956
42957               function rstr(s) {
42958                 s = (utf8) ? utf8Encode(s) : s;
42959                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
42960               }
42961
42962               /**
42963                * Calculate the HMAC-MD5, of a key and some data (raw strings)
42964                */
42965
42966               function rstr_hmac(key, data) {
42967                 var bkey, ipad, opad, hash, i;
42968
42969                 key = (utf8) ? utf8Encode(key) : key;
42970                 data = (utf8) ? utf8Encode(data) : data;
42971                 bkey = rstr2binl(key);
42972                 if (bkey.length > 16) {
42973                   bkey = binl(bkey, key.length * 8);
42974                 }
42975
42976                 ipad = Array(16), opad = Array(16);
42977                 for (i = 0; i < 16; i += 1) {
42978                   ipad[i] = bkey[i] ^ 0x36363636;
42979                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
42980                 }
42981                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
42982                 return binl2rstr(binl(opad.concat(hash), 512 + 128));
42983               }
42984
42985               /**
42986                * Calculate the MD5 of an array of little-endian words, and a bit length.
42987                */
42988
42989               function binl(x, len) {
42990                 var i, olda, oldb, oldc, oldd,
42991                   a = 1732584193,
42992                   b = -271733879,
42993                   c = -1732584194,
42994                   d = 271733878;
42995
42996                 /* append padding */
42997                 x[len >> 5] |= 0x80 << ((len) % 32);
42998                 x[(((len + 64) >>> 9) << 4) + 14] = len;
42999
43000                 for (i = 0; i < x.length; i += 16) {
43001                   olda = a;
43002                   oldb = b;
43003                   oldc = c;
43004                   oldd = d;
43005
43006                   a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
43007                   d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
43008                   c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
43009                   b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
43010                   a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
43011                   d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
43012                   c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
43013                   b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
43014                   a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
43015                   d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
43016                   c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
43017                   b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
43018                   a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
43019                   d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
43020                   c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
43021                   b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
43022
43023                   a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
43024                   d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
43025                   c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
43026                   b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
43027                   a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
43028                   d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
43029                   c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
43030                   b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
43031                   a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
43032                   d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
43033                   c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
43034                   b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
43035                   a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
43036                   d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
43037                   c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
43038                   b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
43039
43040                   a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
43041                   d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
43042                   c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
43043                   b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
43044                   a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
43045                   d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
43046                   c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
43047                   b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
43048                   a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
43049                   d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
43050                   c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
43051                   b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
43052                   a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
43053                   d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
43054                   c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
43055                   b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
43056
43057                   a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
43058                   d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
43059                   c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
43060                   b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
43061                   a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
43062                   d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
43063                   c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
43064                   b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
43065                   a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
43066                   d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
43067                   c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
43068                   b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
43069                   a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
43070                   d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
43071                   c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
43072                   b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
43073
43074                   a = safe_add(a, olda);
43075                   b = safe_add(b, oldb);
43076                   c = safe_add(c, oldc);
43077                   d = safe_add(d, oldd);
43078                 }
43079                 return Array(a, b, c, d);
43080               }
43081
43082               /**
43083                * These functions implement the four basic operations the algorithm uses.
43084                */
43085
43086               function md5_cmn(q, a, b, x, s, t) {
43087                 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
43088               }
43089
43090               function md5_ff(a, b, c, d, x, s, t) {
43091                 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
43092               }
43093
43094               function md5_gg(a, b, c, d, x, s, t) {
43095                 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
43096               }
43097
43098               function md5_hh(a, b, c, d, x, s, t) {
43099                 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
43100               }
43101
43102               function md5_ii(a, b, c, d, x, s, t) {
43103                 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
43104               }
43105             },
43106             /**
43107              * @member Hashes
43108              * @class Hashes.SHA1
43109              * @param {Object} [config]
43110              * @constructor
43111              *
43112              * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
43113              * Version 2.2 Copyright Paul Johnston 2000 - 2009.
43114              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43115              * See http://pajhome.org.uk/crypt/md5 for details.
43116              */
43117             SHA1: function(options) {
43118               /**
43119                * Private config properties. You may need to tweak these to be compatible with
43120                * the server-side, but the defaults work in most cases.
43121                * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
43122                */
43123               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
43124                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
43125                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
43126
43127               // public methods
43128               this.hex = function(s) {
43129                 return rstr2hex(rstr(s, utf8), hexcase);
43130               };
43131               this.b64 = function(s) {
43132                 return rstr2b64(rstr(s, utf8), b64pad);
43133               };
43134               this.any = function(s, e) {
43135                 return rstr2any(rstr(s, utf8), e);
43136               };
43137               this.raw = function(s) {
43138                 return rstr(s, utf8);
43139               };
43140               this.hex_hmac = function(k, d) {
43141                 return rstr2hex(rstr_hmac(k, d));
43142               };
43143               this.b64_hmac = function(k, d) {
43144                 return rstr2b64(rstr_hmac(k, d), b64pad);
43145               };
43146               this.any_hmac = function(k, d, e) {
43147                 return rstr2any(rstr_hmac(k, d), e);
43148               };
43149               /**
43150                * Perform a simple self-test to see if the VM is working
43151                * @return {String} Hexadecimal hash sample
43152                * @public
43153                */
43154               this.vm_test = function() {
43155                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43156               };
43157               /**
43158                * @description Enable/disable uppercase hexadecimal returned string
43159                * @param {boolean}
43160                * @return {Object} this
43161                * @public
43162                */
43163               this.setUpperCase = function(a) {
43164                 if (typeof a === 'boolean') {
43165                   hexcase = a;
43166                 }
43167                 return this;
43168               };
43169               /**
43170                * @description Defines a base64 pad string
43171                * @param {string} Pad
43172                * @return {Object} this
43173                * @public
43174                */
43175               this.setPad = function(a) {
43176                 b64pad = a || b64pad;
43177                 return this;
43178               };
43179               /**
43180                * @description Defines a base64 pad string
43181                * @param {boolean}
43182                * @return {Object} this
43183                * @public
43184                */
43185               this.setUTF8 = function(a) {
43186                 if (typeof a === 'boolean') {
43187                   utf8 = a;
43188                 }
43189                 return this;
43190               };
43191
43192               // private methods
43193
43194               /**
43195                * Calculate the SHA-512 of a raw string
43196                */
43197
43198               function rstr(s) {
43199                 s = (utf8) ? utf8Encode(s) : s;
43200                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43201               }
43202
43203               /**
43204                * Calculate the HMAC-SHA1 of a key and some data (raw strings)
43205                */
43206
43207               function rstr_hmac(key, data) {
43208                 var bkey, ipad, opad, i, hash;
43209                 key = (utf8) ? utf8Encode(key) : key;
43210                 data = (utf8) ? utf8Encode(data) : data;
43211                 bkey = rstr2binb(key);
43212
43213                 if (bkey.length > 16) {
43214                   bkey = binb(bkey, key.length * 8);
43215                 }
43216                 ipad = Array(16), opad = Array(16);
43217                 for (i = 0; i < 16; i += 1) {
43218                   ipad[i] = bkey[i] ^ 0x36363636;
43219                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43220                 }
43221                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43222                 return binb2rstr(binb(opad.concat(hash), 512 + 160));
43223               }
43224
43225               /**
43226                * Calculate the SHA-1 of an array of big-endian words, and a bit length
43227                */
43228
43229               function binb(x, len) {
43230                 var i, j, t, olda, oldb, oldc, oldd, olde,
43231                   w = Array(80),
43232                   a = 1732584193,
43233                   b = -271733879,
43234                   c = -1732584194,
43235                   d = 271733878,
43236                   e = -1009589776;
43237
43238                 /* append padding */
43239                 x[len >> 5] |= 0x80 << (24 - len % 32);
43240                 x[((len + 64 >> 9) << 4) + 15] = len;
43241
43242                 for (i = 0; i < x.length; i += 16) {
43243                   olda = a;
43244                   oldb = b;
43245                   oldc = c;
43246                   oldd = d;
43247                   olde = e;
43248
43249                   for (j = 0; j < 80; j += 1) {
43250                     if (j < 16) {
43251                       w[j] = x[i + j];
43252                     } else {
43253                       w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
43254                     }
43255                     t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
43256                       safe_add(safe_add(e, w[j]), sha1_kt(j)));
43257                     e = d;
43258                     d = c;
43259                     c = bit_rol(b, 30);
43260                     b = a;
43261                     a = t;
43262                   }
43263
43264                   a = safe_add(a, olda);
43265                   b = safe_add(b, oldb);
43266                   c = safe_add(c, oldc);
43267                   d = safe_add(d, oldd);
43268                   e = safe_add(e, olde);
43269                 }
43270                 return Array(a, b, c, d, e);
43271               }
43272
43273               /**
43274                * Perform the appropriate triplet combination function for the current
43275                * iteration
43276                */
43277
43278               function sha1_ft(t, b, c, d) {
43279                 if (t < 20) {
43280                   return (b & c) | ((~b) & d);
43281                 }
43282                 if (t < 40) {
43283                   return b ^ c ^ d;
43284                 }
43285                 if (t < 60) {
43286                   return (b & c) | (b & d) | (c & d);
43287                 }
43288                 return b ^ c ^ d;
43289               }
43290
43291               /**
43292                * Determine the appropriate additive constant for the current iteration
43293                */
43294
43295               function sha1_kt(t) {
43296                 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
43297                   (t < 60) ? -1894007588 : -899497514;
43298               }
43299             },
43300             /**
43301              * @class Hashes.SHA256
43302              * @param {config}
43303              *
43304              * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
43305              * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
43306              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43307              * See http://pajhome.org.uk/crypt/md5 for details.
43308              * Also http://anmar.eu.org/projects/jssha2/
43309              */
43310             SHA256: function(options) {
43311               /**
43312                * Private properties configuration variables. You may need to tweak these to be compatible with
43313                * the server-side, but the defaults work in most cases.
43314                * @see this.setUpperCase() method
43315                * @see this.setPad() method
43316                */
43317               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
43318                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43319                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43320                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43321                 /* enable/disable utf8 encoding */
43322                 sha256_K;
43323
43324               /* privileged (public) methods */
43325               this.hex = function(s) {
43326                 return rstr2hex(rstr(s, utf8));
43327               };
43328               this.b64 = function(s) {
43329                 return rstr2b64(rstr(s, utf8), b64pad);
43330               };
43331               this.any = function(s, e) {
43332                 return rstr2any(rstr(s, utf8), e);
43333               };
43334               this.raw = function(s) {
43335                 return rstr(s, utf8);
43336               };
43337               this.hex_hmac = function(k, d) {
43338                 return rstr2hex(rstr_hmac(k, d));
43339               };
43340               this.b64_hmac = function(k, d) {
43341                 return rstr2b64(rstr_hmac(k, d), b64pad);
43342               };
43343               this.any_hmac = function(k, d, e) {
43344                 return rstr2any(rstr_hmac(k, d), e);
43345               };
43346               /**
43347                * Perform a simple self-test to see if the VM is working
43348                * @return {String} Hexadecimal hash sample
43349                * @public
43350                */
43351               this.vm_test = function() {
43352                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43353               };
43354               /**
43355                * Enable/disable uppercase hexadecimal returned string
43356                * @param {boolean}
43357                * @return {Object} this
43358                * @public
43359                */
43360               this.setUpperCase = function(a) {
43361                 if (typeof a === 'boolean') {
43362                   hexcase = a;
43363                 }
43364                 return this;
43365               };
43366               /**
43367                * @description Defines a base64 pad string
43368                * @param {string} Pad
43369                * @return {Object} this
43370                * @public
43371                */
43372               this.setPad = function(a) {
43373                 b64pad = a || b64pad;
43374                 return this;
43375               };
43376               /**
43377                * Defines a base64 pad string
43378                * @param {boolean}
43379                * @return {Object} this
43380                * @public
43381                */
43382               this.setUTF8 = function(a) {
43383                 if (typeof a === 'boolean') {
43384                   utf8 = a;
43385                 }
43386                 return this;
43387               };
43388
43389               // private methods
43390
43391               /**
43392                * Calculate the SHA-512 of a raw string
43393                */
43394
43395               function rstr(s, utf8) {
43396                 s = (utf8) ? utf8Encode(s) : s;
43397                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43398               }
43399
43400               /**
43401                * Calculate the HMAC-sha256 of a key and some data (raw strings)
43402                */
43403
43404               function rstr_hmac(key, data) {
43405                 key = (utf8) ? utf8Encode(key) : key;
43406                 data = (utf8) ? utf8Encode(data) : data;
43407                 var hash, i = 0,
43408                   bkey = rstr2binb(key),
43409                   ipad = Array(16),
43410                   opad = Array(16);
43411
43412                 if (bkey.length > 16) {
43413                   bkey = binb(bkey, key.length * 8);
43414                 }
43415
43416                 for (; i < 16; i += 1) {
43417                   ipad[i] = bkey[i] ^ 0x36363636;
43418                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43419                 }
43420
43421                 hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
43422                 return binb2rstr(binb(opad.concat(hash), 512 + 256));
43423               }
43424
43425               /*
43426                * Main sha256 function, with its support functions
43427                */
43428
43429               function sha256_S(X, n) {
43430                 return (X >>> n) | (X << (32 - n));
43431               }
43432
43433               function sha256_R(X, n) {
43434                 return (X >>> n);
43435               }
43436
43437               function sha256_Ch(x, y, z) {
43438                 return ((x & y) ^ ((~x) & z));
43439               }
43440
43441               function sha256_Maj(x, y, z) {
43442                 return ((x & y) ^ (x & z) ^ (y & z));
43443               }
43444
43445               function sha256_Sigma0256(x) {
43446                 return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
43447               }
43448
43449               function sha256_Sigma1256(x) {
43450                 return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
43451               }
43452
43453               function sha256_Gamma0256(x) {
43454                 return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
43455               }
43456
43457               function sha256_Gamma1256(x) {
43458                 return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
43459               }
43460
43461               sha256_K = [
43462                 1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
43463                 1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
43464                 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
43465                 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
43466                 1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
43467                 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
43468                 1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
43469               ];
43470
43471               function binb(m, l) {
43472                 var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
43473                   1359893119, -1694144372, 528734635, 1541459225
43474                 ];
43475                 var W = new Array(64);
43476                 var a, b, c, d, e, f, g, h;
43477                 var i, j, T1, T2;
43478
43479                 /* append padding */
43480                 m[l >> 5] |= 0x80 << (24 - l % 32);
43481                 m[((l + 64 >> 9) << 4) + 15] = l;
43482
43483                 for (i = 0; i < m.length; i += 16) {
43484                   a = HASH[0];
43485                   b = HASH[1];
43486                   c = HASH[2];
43487                   d = HASH[3];
43488                   e = HASH[4];
43489                   f = HASH[5];
43490                   g = HASH[6];
43491                   h = HASH[7];
43492
43493                   for (j = 0; j < 64; j += 1) {
43494                     if (j < 16) {
43495                       W[j] = m[j + i];
43496                     } else {
43497                       W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
43498                         sha256_Gamma0256(W[j - 15])), W[j - 16]);
43499                     }
43500
43501                     T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
43502                       sha256_K[j]), W[j]);
43503                     T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
43504                     h = g;
43505                     g = f;
43506                     f = e;
43507                     e = safe_add(d, T1);
43508                     d = c;
43509                     c = b;
43510                     b = a;
43511                     a = safe_add(T1, T2);
43512                   }
43513
43514                   HASH[0] = safe_add(a, HASH[0]);
43515                   HASH[1] = safe_add(b, HASH[1]);
43516                   HASH[2] = safe_add(c, HASH[2]);
43517                   HASH[3] = safe_add(d, HASH[3]);
43518                   HASH[4] = safe_add(e, HASH[4]);
43519                   HASH[5] = safe_add(f, HASH[5]);
43520                   HASH[6] = safe_add(g, HASH[6]);
43521                   HASH[7] = safe_add(h, HASH[7]);
43522                 }
43523                 return HASH;
43524               }
43525
43526             },
43527
43528             /**
43529              * @class Hashes.SHA512
43530              * @param {config}
43531              *
43532              * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
43533              * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
43534              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43535              * See http://pajhome.org.uk/crypt/md5 for details.
43536              */
43537             SHA512: function(options) {
43538               /**
43539                * Private properties configuration variables. You may need to tweak these to be compatible with
43540                * the server-side, but the defaults work in most cases.
43541                * @see this.setUpperCase() method
43542                * @see this.setPad() method
43543                */
43544               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43545                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43546                 b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
43547                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43548                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43549                 /* enable/disable utf8 encoding */
43550                 sha512_k;
43551
43552               /* privileged (public) methods */
43553               this.hex = function(s) {
43554                 return rstr2hex(rstr(s));
43555               };
43556               this.b64 = function(s) {
43557                 return rstr2b64(rstr(s), b64pad);
43558               };
43559               this.any = function(s, e) {
43560                 return rstr2any(rstr(s), e);
43561               };
43562               this.raw = function(s) {
43563                 return rstr(s, utf8);
43564               };
43565               this.hex_hmac = function(k, d) {
43566                 return rstr2hex(rstr_hmac(k, d));
43567               };
43568               this.b64_hmac = function(k, d) {
43569                 return rstr2b64(rstr_hmac(k, d), b64pad);
43570               };
43571               this.any_hmac = function(k, d, e) {
43572                 return rstr2any(rstr_hmac(k, d), e);
43573               };
43574               /**
43575                * Perform a simple self-test to see if the VM is working
43576                * @return {String} Hexadecimal hash sample
43577                * @public
43578                */
43579               this.vm_test = function() {
43580                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43581               };
43582               /**
43583                * @description Enable/disable uppercase hexadecimal returned string
43584                * @param {boolean}
43585                * @return {Object} this
43586                * @public
43587                */
43588               this.setUpperCase = function(a) {
43589                 if (typeof a === 'boolean') {
43590                   hexcase = a;
43591                 }
43592                 return this;
43593               };
43594               /**
43595                * @description Defines a base64 pad string
43596                * @param {string} Pad
43597                * @return {Object} this
43598                * @public
43599                */
43600               this.setPad = function(a) {
43601                 b64pad = a || b64pad;
43602                 return this;
43603               };
43604               /**
43605                * @description Defines a base64 pad string
43606                * @param {boolean}
43607                * @return {Object} this
43608                * @public
43609                */
43610               this.setUTF8 = function(a) {
43611                 if (typeof a === 'boolean') {
43612                   utf8 = a;
43613                 }
43614                 return this;
43615               };
43616
43617               /* private methods */
43618
43619               /**
43620                * Calculate the SHA-512 of a raw string
43621                */
43622
43623               function rstr(s) {
43624                 s = (utf8) ? utf8Encode(s) : s;
43625                 return binb2rstr(binb(rstr2binb(s), s.length * 8));
43626               }
43627               /*
43628                * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
43629                */
43630
43631               function rstr_hmac(key, data) {
43632                 key = (utf8) ? utf8Encode(key) : key;
43633                 data = (utf8) ? utf8Encode(data) : data;
43634
43635                 var hash, i = 0,
43636                   bkey = rstr2binb(key),
43637                   ipad = Array(32),
43638                   opad = Array(32);
43639
43640                 if (bkey.length > 32) {
43641                   bkey = binb(bkey, key.length * 8);
43642                 }
43643
43644                 for (; i < 32; i += 1) {
43645                   ipad[i] = bkey[i] ^ 0x36363636;
43646                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
43647                 }
43648
43649                 hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
43650                 return binb2rstr(binb(opad.concat(hash), 1024 + 512));
43651               }
43652
43653               /**
43654                * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
43655                */
43656
43657               function binb(x, len) {
43658                 var j, i, l,
43659                   W = new Array(80),
43660                   hash = new Array(16),
43661                   //Initial hash values
43662                   H = [
43663                     new int64(0x6a09e667, -205731576),
43664                     new int64(-1150833019, -2067093701),
43665                     new int64(0x3c6ef372, -23791573),
43666                     new int64(-1521486534, 0x5f1d36f1),
43667                     new int64(0x510e527f, -1377402159),
43668                     new int64(-1694144372, 0x2b3e6c1f),
43669                     new int64(0x1f83d9ab, -79577749),
43670                     new int64(0x5be0cd19, 0x137e2179)
43671                   ],
43672                   T1 = new int64(0, 0),
43673                   T2 = new int64(0, 0),
43674                   a = new int64(0, 0),
43675                   b = new int64(0, 0),
43676                   c = new int64(0, 0),
43677                   d = new int64(0, 0),
43678                   e = new int64(0, 0),
43679                   f = new int64(0, 0),
43680                   g = new int64(0, 0),
43681                   h = new int64(0, 0),
43682                   //Temporary variables not specified by the document
43683                   s0 = new int64(0, 0),
43684                   s1 = new int64(0, 0),
43685                   Ch = new int64(0, 0),
43686                   Maj = new int64(0, 0),
43687                   r1 = new int64(0, 0),
43688                   r2 = new int64(0, 0),
43689                   r3 = new int64(0, 0);
43690
43691                 if (sha512_k === undefined) {
43692                   //SHA512 constants
43693                   sha512_k = [
43694                     new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
43695                     new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
43696                     new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
43697                     new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
43698                     new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
43699                     new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
43700                     new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
43701                     new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
43702                     new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
43703                     new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
43704                     new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
43705                     new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
43706                     new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
43707                     new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
43708                     new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
43709                     new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
43710                     new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
43711                     new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
43712                     new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
43713                     new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
43714                     new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
43715                     new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
43716                     new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
43717                     new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
43718                     new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
43719                     new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
43720                     new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
43721                     new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
43722                     new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
43723                     new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
43724                     new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
43725                     new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
43726                     new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
43727                     new int64(-354779690, -840897762), new int64(-176337025, -294727304),
43728                     new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
43729                     new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
43730                     new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
43731                     new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
43732                     new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
43733                     new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
43734                   ];
43735                 }
43736
43737                 for (i = 0; i < 80; i += 1) {
43738                   W[i] = new int64(0, 0);
43739                 }
43740
43741                 // append padding to the source string. The format is described in the FIPS.
43742                 x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
43743                 x[((len + 128 >> 10) << 5) + 31] = len;
43744                 l = x.length;
43745                 for (i = 0; i < l; i += 32) { //32 dwords is the block size
43746                   int64copy(a, H[0]);
43747                   int64copy(b, H[1]);
43748                   int64copy(c, H[2]);
43749                   int64copy(d, H[3]);
43750                   int64copy(e, H[4]);
43751                   int64copy(f, H[5]);
43752                   int64copy(g, H[6]);
43753                   int64copy(h, H[7]);
43754
43755                   for (j = 0; j < 16; j += 1) {
43756                     W[j].h = x[i + 2 * j];
43757                     W[j].l = x[i + 2 * j + 1];
43758                   }
43759
43760                   for (j = 16; j < 80; j += 1) {
43761                     //sigma1
43762                     int64rrot(r1, W[j - 2], 19);
43763                     int64revrrot(r2, W[j - 2], 29);
43764                     int64shr(r3, W[j - 2], 6);
43765                     s1.l = r1.l ^ r2.l ^ r3.l;
43766                     s1.h = r1.h ^ r2.h ^ r3.h;
43767                     //sigma0
43768                     int64rrot(r1, W[j - 15], 1);
43769                     int64rrot(r2, W[j - 15], 8);
43770                     int64shr(r3, W[j - 15], 7);
43771                     s0.l = r1.l ^ r2.l ^ r3.l;
43772                     s0.h = r1.h ^ r2.h ^ r3.h;
43773
43774                     int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
43775                   }
43776
43777                   for (j = 0; j < 80; j += 1) {
43778                     //Ch
43779                     Ch.l = (e.l & f.l) ^ (~e.l & g.l);
43780                     Ch.h = (e.h & f.h) ^ (~e.h & g.h);
43781
43782                     //Sigma1
43783                     int64rrot(r1, e, 14);
43784                     int64rrot(r2, e, 18);
43785                     int64revrrot(r3, e, 9);
43786                     s1.l = r1.l ^ r2.l ^ r3.l;
43787                     s1.h = r1.h ^ r2.h ^ r3.h;
43788
43789                     //Sigma0
43790                     int64rrot(r1, a, 28);
43791                     int64revrrot(r2, a, 2);
43792                     int64revrrot(r3, a, 7);
43793                     s0.l = r1.l ^ r2.l ^ r3.l;
43794                     s0.h = r1.h ^ r2.h ^ r3.h;
43795
43796                     //Maj
43797                     Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
43798                     Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
43799
43800                     int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
43801                     int64add(T2, s0, Maj);
43802
43803                     int64copy(h, g);
43804                     int64copy(g, f);
43805                     int64copy(f, e);
43806                     int64add(e, d, T1);
43807                     int64copy(d, c);
43808                     int64copy(c, b);
43809                     int64copy(b, a);
43810                     int64add(a, T1, T2);
43811                   }
43812                   int64add(H[0], H[0], a);
43813                   int64add(H[1], H[1], b);
43814                   int64add(H[2], H[2], c);
43815                   int64add(H[3], H[3], d);
43816                   int64add(H[4], H[4], e);
43817                   int64add(H[5], H[5], f);
43818                   int64add(H[6], H[6], g);
43819                   int64add(H[7], H[7], h);
43820                 }
43821
43822                 //represent the hash as an array of 32-bit dwords
43823                 for (i = 0; i < 8; i += 1) {
43824                   hash[2 * i] = H[i].h;
43825                   hash[2 * i + 1] = H[i].l;
43826                 }
43827                 return hash;
43828               }
43829
43830               //A constructor for 64-bit numbers
43831
43832               function int64(h, l) {
43833                 this.h = h;
43834                 this.l = l;
43835                 //this.toString = int64toString;
43836               }
43837
43838               //Copies src into dst, assuming both are 64-bit numbers
43839
43840               function int64copy(dst, src) {
43841                 dst.h = src.h;
43842                 dst.l = src.l;
43843               }
43844
43845               //Right-rotates a 64-bit number by shift
43846               //Won't handle cases of shift>=32
43847               //The function revrrot() is for that
43848
43849               function int64rrot(dst, x, shift) {
43850                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43851                 dst.h = (x.h >>> shift) | (x.l << (32 - shift));
43852               }
43853
43854               //Reverses the dwords of the source and then rotates right by shift.
43855               //This is equivalent to rotation by 32+shift
43856
43857               function int64revrrot(dst, x, shift) {
43858                 dst.l = (x.h >>> shift) | (x.l << (32 - shift));
43859                 dst.h = (x.l >>> shift) | (x.h << (32 - shift));
43860               }
43861
43862               //Bitwise-shifts right a 64-bit number by shift
43863               //Won't handle shift>=32, but it's never needed in SHA512
43864
43865               function int64shr(dst, x, shift) {
43866                 dst.l = (x.l >>> shift) | (x.h << (32 - shift));
43867                 dst.h = (x.h >>> shift);
43868               }
43869
43870               //Adds two 64-bit numbers
43871               //Like the original implementation, does not rely on 32-bit operations
43872
43873               function int64add(dst, x, y) {
43874                 var w0 = (x.l & 0xffff) + (y.l & 0xffff);
43875                 var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
43876                 var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
43877                 var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
43878                 dst.l = (w0 & 0xffff) | (w1 << 16);
43879                 dst.h = (w2 & 0xffff) | (w3 << 16);
43880               }
43881
43882               //Same, except with 4 addends. Works faster than adding them one by one.
43883
43884               function int64add4(dst, a, b, c, d) {
43885                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
43886                 var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
43887                 var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
43888                 var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
43889                 dst.l = (w0 & 0xffff) | (w1 << 16);
43890                 dst.h = (w2 & 0xffff) | (w3 << 16);
43891               }
43892
43893               //Same, except with 5 addends
43894
43895               function int64add5(dst, a, b, c, d, e) {
43896                 var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
43897                   w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
43898                   w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
43899                   w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
43900                 dst.l = (w0 & 0xffff) | (w1 << 16);
43901                 dst.h = (w2 & 0xffff) | (w3 << 16);
43902               }
43903             },
43904             /**
43905              * @class Hashes.RMD160
43906              * @constructor
43907              * @param {Object} [config]
43908              *
43909              * A JavaScript implementation of the RIPEMD-160 Algorithm
43910              * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
43911              * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
43912              * See http://pajhome.org.uk/crypt/md5 for details.
43913              * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
43914              */
43915             RMD160: function(options) {
43916               /**
43917                * Private properties configuration variables. You may need to tweak these to be compatible with
43918                * the server-side, but the defaults work in most cases.
43919                * @see this.setUpperCase() method
43920                * @see this.setPad() method
43921                */
43922               var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
43923                 /* hexadecimal output case format. false - lowercase; true - uppercase  */
43924                 b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
43925                 /* base-64 pad character. Default '=' for strict RFC compliance   */
43926                 utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
43927                 /* enable/disable utf8 encoding */
43928                 rmd160_r1 = [
43929                   0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
43930                   7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
43931                   3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
43932                   1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
43933                   4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
43934                 ],
43935                 rmd160_r2 = [
43936                   5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
43937                   6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
43938                   15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
43939                   8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
43940                   12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
43941                 ],
43942                 rmd160_s1 = [
43943                   11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
43944                   7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
43945                   11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
43946                   11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
43947                   9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
43948                 ],
43949                 rmd160_s2 = [
43950                   8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
43951                   9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
43952                   9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
43953                   15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
43954                   8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
43955                 ];
43956
43957               /* privileged (public) methods */
43958               this.hex = function(s) {
43959                 return rstr2hex(rstr(s, utf8));
43960               };
43961               this.b64 = function(s) {
43962                 return rstr2b64(rstr(s, utf8), b64pad);
43963               };
43964               this.any = function(s, e) {
43965                 return rstr2any(rstr(s, utf8), e);
43966               };
43967               this.raw = function(s) {
43968                 return rstr(s, utf8);
43969               };
43970               this.hex_hmac = function(k, d) {
43971                 return rstr2hex(rstr_hmac(k, d));
43972               };
43973               this.b64_hmac = function(k, d) {
43974                 return rstr2b64(rstr_hmac(k, d), b64pad);
43975               };
43976               this.any_hmac = function(k, d, e) {
43977                 return rstr2any(rstr_hmac(k, d), e);
43978               };
43979               /**
43980                * Perform a simple self-test to see if the VM is working
43981                * @return {String} Hexadecimal hash sample
43982                * @public
43983                */
43984               this.vm_test = function() {
43985                 return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
43986               };
43987               /**
43988                * @description Enable/disable uppercase hexadecimal returned string
43989                * @param {boolean}
43990                * @return {Object} this
43991                * @public
43992                */
43993               this.setUpperCase = function(a) {
43994                 if (typeof a === 'boolean') {
43995                   hexcase = a;
43996                 }
43997                 return this;
43998               };
43999               /**
44000                * @description Defines a base64 pad string
44001                * @param {string} Pad
44002                * @return {Object} this
44003                * @public
44004                */
44005               this.setPad = function(a) {
44006                 if (typeof a !== 'undefined') {
44007                   b64pad = a;
44008                 }
44009                 return this;
44010               };
44011               /**
44012                * @description Defines a base64 pad string
44013                * @param {boolean}
44014                * @return {Object} this
44015                * @public
44016                */
44017               this.setUTF8 = function(a) {
44018                 if (typeof a === 'boolean') {
44019                   utf8 = a;
44020                 }
44021                 return this;
44022               };
44023
44024               /* private methods */
44025
44026               /**
44027                * Calculate the rmd160 of a raw string
44028                */
44029
44030               function rstr(s) {
44031                 s = (utf8) ? utf8Encode(s) : s;
44032                 return binl2rstr(binl(rstr2binl(s), s.length * 8));
44033               }
44034
44035               /**
44036                * Calculate the HMAC-rmd160 of a key and some data (raw strings)
44037                */
44038
44039               function rstr_hmac(key, data) {
44040                 key = (utf8) ? utf8Encode(key) : key;
44041                 data = (utf8) ? utf8Encode(data) : data;
44042                 var i, hash,
44043                   bkey = rstr2binl(key),
44044                   ipad = Array(16),
44045                   opad = Array(16);
44046
44047                 if (bkey.length > 16) {
44048                   bkey = binl(bkey, key.length * 8);
44049                 }
44050
44051                 for (i = 0; i < 16; i += 1) {
44052                   ipad[i] = bkey[i] ^ 0x36363636;
44053                   opad[i] = bkey[i] ^ 0x5C5C5C5C;
44054                 }
44055                 hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
44056                 return binl2rstr(binl(opad.concat(hash), 512 + 160));
44057               }
44058
44059               /**
44060                * Convert an array of little-endian words to a string
44061                */
44062
44063               function binl2rstr(input) {
44064                 var i, output = '',
44065                   l = input.length * 32;
44066                 for (i = 0; i < l; i += 8) {
44067                   output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
44068                 }
44069                 return output;
44070               }
44071
44072               /**
44073                * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
44074                */
44075
44076               function binl(x, len) {
44077                 var T, j, i, l,
44078                   h0 = 0x67452301,
44079                   h1 = 0xefcdab89,
44080                   h2 = 0x98badcfe,
44081                   h3 = 0x10325476,
44082                   h4 = 0xc3d2e1f0,
44083                   A1, B1, C1, D1, E1,
44084                   A2, B2, C2, D2, E2;
44085
44086                 /* append padding */
44087                 x[len >> 5] |= 0x80 << (len % 32);
44088                 x[(((len + 64) >>> 9) << 4) + 14] = len;
44089                 l = x.length;
44090
44091                 for (i = 0; i < l; i += 16) {
44092                   A1 = A2 = h0;
44093                   B1 = B2 = h1;
44094                   C1 = C2 = h2;
44095                   D1 = D2 = h3;
44096                   E1 = E2 = h4;
44097                   for (j = 0; j <= 79; j += 1) {
44098                     T = safe_add(A1, rmd160_f(j, B1, C1, D1));
44099                     T = safe_add(T, x[i + rmd160_r1[j]]);
44100                     T = safe_add(T, rmd160_K1(j));
44101                     T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
44102                     A1 = E1;
44103                     E1 = D1;
44104                     D1 = bit_rol(C1, 10);
44105                     C1 = B1;
44106                     B1 = T;
44107                     T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
44108                     T = safe_add(T, x[i + rmd160_r2[j]]);
44109                     T = safe_add(T, rmd160_K2(j));
44110                     T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
44111                     A2 = E2;
44112                     E2 = D2;
44113                     D2 = bit_rol(C2, 10);
44114                     C2 = B2;
44115                     B2 = T;
44116                   }
44117
44118                   T = safe_add(h1, safe_add(C1, D2));
44119                   h1 = safe_add(h2, safe_add(D1, E2));
44120                   h2 = safe_add(h3, safe_add(E1, A2));
44121                   h3 = safe_add(h4, safe_add(A1, B2));
44122                   h4 = safe_add(h0, safe_add(B1, C2));
44123                   h0 = T;
44124                 }
44125                 return [h0, h1, h2, h3, h4];
44126               }
44127
44128               // specific algorithm methods
44129
44130               function rmd160_f(j, x, y, z) {
44131                 return (0 <= j && j <= 15) ? (x ^ y ^ z) :
44132                   (16 <= j && j <= 31) ? (x & y) | (~x & z) :
44133                   (32 <= j && j <= 47) ? (x | ~y) ^ z :
44134                   (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
44135                   (64 <= j && j <= 79) ? x ^ (y | ~z) :
44136                   'rmd160_f: j out of range';
44137               }
44138
44139               function rmd160_K1(j) {
44140                 return (0 <= j && j <= 15) ? 0x00000000 :
44141                   (16 <= j && j <= 31) ? 0x5a827999 :
44142                   (32 <= j && j <= 47) ? 0x6ed9eba1 :
44143                   (48 <= j && j <= 63) ? 0x8f1bbcdc :
44144                   (64 <= j && j <= 79) ? 0xa953fd4e :
44145                   'rmd160_K1: j out of range';
44146               }
44147
44148               function rmd160_K2(j) {
44149                 return (0 <= j && j <= 15) ? 0x50a28be6 :
44150                   (16 <= j && j <= 31) ? 0x5c4dd124 :
44151                   (32 <= j && j <= 47) ? 0x6d703ef3 :
44152                   (48 <= j && j <= 63) ? 0x7a6d76e9 :
44153                   (64 <= j && j <= 79) ? 0x00000000 :
44154                   'rmd160_K2: j out of range';
44155               }
44156             }
44157           };
44158
44159           // exposes Hashes
44160           (function(window, undefined$1) {
44161             var freeExports = false;
44162             {
44163               freeExports = exports;
44164               if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
44165                 window = commonjsGlobal;
44166               }
44167             }
44168
44169             if (typeof undefined$1 === 'function' && typeof undefined$1.amd === 'object' && undefined$1.amd) {
44170               // define as an anonymous module, so, through path mapping, it can be aliased
44171               undefined$1(function() {
44172                 return Hashes;
44173               });
44174             } else if (freeExports) {
44175               // in Node.js or RingoJS v0.8.0+
44176               if (module && module.exports === freeExports) {
44177                 module.exports = Hashes;
44178               }
44179               // in Narwhal or RingoJS v0.7.0-
44180               else {
44181                 freeExports.Hashes = Hashes;
44182               }
44183             } else {
44184               // in a browser or Rhino
44185               window.Hashes = Hashes;
44186             }
44187           }(this));
44188         }()); // IIFE
44189         });
44190
44191         var immutable = extend$2;
44192
44193         var hasOwnProperty$2 = Object.prototype.hasOwnProperty;
44194
44195         function extend$2() {
44196             var target = {};
44197
44198             for (var i = 0; i < arguments.length; i++) {
44199                 var source = arguments[i];
44200
44201                 for (var key in source) {
44202                     if (hasOwnProperty$2.call(source, key)) {
44203                         target[key] = source[key];
44204                     }
44205                 }
44206             }
44207
44208             return target
44209         }
44210
44211         var sha1 = new hashes.SHA1();
44212
44213         var ohauth = {};
44214
44215         ohauth.qsString = function(obj) {
44216             return Object.keys(obj).sort().map(function(key) {
44217                 return ohauth.percentEncode(key) + '=' +
44218                     ohauth.percentEncode(obj[key]);
44219             }).join('&');
44220         };
44221
44222         ohauth.stringQs = function(str) {
44223             return str.split('&').filter(function (pair) {
44224                 return pair !== '';
44225             }).reduce(function(obj, pair){
44226                 var parts = pair.split('=');
44227                 obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
44228                     '' : decodeURIComponent(parts[1]);
44229                 return obj;
44230             }, {});
44231         };
44232
44233         ohauth.rawxhr = function(method, url, data, headers, callback) {
44234             var xhr = new XMLHttpRequest(),
44235                 twoHundred = /^20\d$/;
44236             xhr.onreadystatechange = function() {
44237                 if (4 === xhr.readyState && 0 !== xhr.status) {
44238                     if (twoHundred.test(xhr.status)) callback(null, xhr);
44239                     else return callback(xhr, null);
44240                 }
44241             };
44242             xhr.onerror = function(e) { return callback(e, null); };
44243             xhr.open(method, url, true);
44244             for (var h in headers) xhr.setRequestHeader(h, headers[h]);
44245             xhr.send(data);
44246             return xhr;
44247         };
44248
44249         ohauth.xhr = function(method, url, auth, data, options, callback) {
44250             var headers = (options && options.header) || {
44251                 'Content-Type': 'application/x-www-form-urlencoded'
44252             };
44253             headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
44254             return ohauth.rawxhr(method, url, data, headers, callback);
44255         };
44256
44257         ohauth.nonce = function() {
44258             for (var o = ''; o.length < 6;) {
44259                 o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
44260             }
44261             return o;
44262         };
44263
44264         ohauth.authHeader = function(obj) {
44265             return Object.keys(obj).sort().map(function(key) {
44266                 return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
44267             }).join(', ');
44268         };
44269
44270         ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
44271
44272         ohauth.percentEncode = function(s) {
44273             return encodeURIComponent(s)
44274                 .replace(/\!/g, '%21').replace(/\'/g, '%27')
44275                 .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
44276         };
44277
44278         ohauth.baseString = function(method, url, params) {
44279             if (params.oauth_signature) delete params.oauth_signature;
44280             return [
44281                 method,
44282                 ohauth.percentEncode(url),
44283                 ohauth.percentEncode(ohauth.qsString(params))].join('&');
44284         };
44285
44286         ohauth.signature = function(oauth_secret, token_secret, baseString) {
44287             return sha1.b64_hmac(
44288                 ohauth.percentEncode(oauth_secret) + '&' +
44289                 ohauth.percentEncode(token_secret),
44290                 baseString);
44291         };
44292
44293         /**
44294          * Takes an options object for configuration (consumer_key,
44295          * consumer_secret, version, signature_method, token, token_secret)
44296          * and returns a function that generates the Authorization header
44297          * for given data.
44298          *
44299          * The returned function takes these parameters:
44300          * - method: GET/POST/...
44301          * - uri: full URI with protocol, port, path and query string
44302          * - extra_params: any extra parameters (that are passed in the POST data),
44303          *   can be an object or a from-urlencoded string.
44304          *
44305          * Returned function returns full OAuth header with "OAuth" string in it.
44306          */
44307
44308         ohauth.headerGenerator = function(options) {
44309             options = options || {};
44310             var consumer_key = options.consumer_key || '',
44311                 consumer_secret = options.consumer_secret || '',
44312                 signature_method = options.signature_method || 'HMAC-SHA1',
44313                 version = options.version || '1.0',
44314                 token = options.token || '',
44315                 token_secret = options.token_secret || '';
44316
44317             return function(method, uri, extra_params) {
44318                 method = method.toUpperCase();
44319                 if (typeof extra_params === 'string' && extra_params.length > 0) {
44320                     extra_params = ohauth.stringQs(extra_params);
44321                 }
44322
44323                 var uri_parts = uri.split('?', 2),
44324                 base_uri = uri_parts[0];
44325
44326                 var query_params = uri_parts.length === 2 ?
44327                     ohauth.stringQs(uri_parts[1]) : {};
44328
44329                 var oauth_params = {
44330                     oauth_consumer_key: consumer_key,
44331                     oauth_signature_method: signature_method,
44332                     oauth_version: version,
44333                     oauth_timestamp: ohauth.timestamp(),
44334                     oauth_nonce: ohauth.nonce()
44335                 };
44336
44337                 if (token) oauth_params.oauth_token = token;
44338
44339                 var all_params = immutable({}, oauth_params, query_params, extra_params),
44340                     base_str = ohauth.baseString(method, base_uri, all_params);
44341
44342                 oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
44343
44344                 return 'OAuth ' + ohauth.authHeader(oauth_params);
44345             };
44346         };
44347
44348         var ohauth_1 = ohauth;
44349
44350         var resolveUrl = createCommonjsModule(function (module, exports) {
44351         // Copyright 2014 Simon Lydell
44352         // X11 (“MIT”) Licensed. (See LICENSE.)
44353
44354         void (function(root, factory) {
44355           {
44356             module.exports = factory();
44357           }
44358         }(commonjsGlobal, function() {
44359
44360           function resolveUrl(/* ...urls */) {
44361             var numUrls = arguments.length;
44362
44363             if (numUrls === 0) {
44364               throw new Error("resolveUrl requires at least one argument; got none.")
44365             }
44366
44367             var base = document.createElement("base");
44368             base.href = arguments[0];
44369
44370             if (numUrls === 1) {
44371               return base.href
44372             }
44373
44374             var head = document.getElementsByTagName("head")[0];
44375             head.insertBefore(base, head.firstChild);
44376
44377             var a = document.createElement("a");
44378             var resolved;
44379
44380             for (var index = 1; index < numUrls; index++) {
44381               a.href = arguments[index];
44382               resolved = a.href;
44383               base.href = resolved;
44384             }
44385
44386             head.removeChild(base);
44387
44388             return resolved
44389           }
44390
44391           return resolveUrl
44392
44393         }));
44394         });
44395
44396         var assign$2 = make_assign();
44397         var create$7 = make_create();
44398         var trim$1 = make_trim();
44399         var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
44400
44401         var util = {
44402                 assign: assign$2,
44403                 create: create$7,
44404                 trim: trim$1,
44405                 bind: bind$3,
44406                 slice: slice$b,
44407                 each: each,
44408                 map: map$5,
44409                 pluck: pluck,
44410                 isList: isList,
44411                 isFunction: isFunction$2,
44412                 isObject: isObject$2,
44413                 Global: Global
44414         };
44415
44416         function make_assign() {
44417                 if (Object.assign) {
44418                         return Object.assign
44419                 } else {
44420                         return function shimAssign(obj, props1, props2, etc) {
44421                                 for (var i = 1; i < arguments.length; i++) {
44422                                         each(Object(arguments[i]), function(val, key) {
44423                                                 obj[key] = val;
44424                                         });
44425                                 }                       
44426                                 return obj
44427                         }
44428                 }
44429         }
44430
44431         function make_create() {
44432                 if (Object.create) {
44433                         return function create(obj, assignProps1, assignProps2, etc) {
44434                                 var assignArgsList = slice$b(arguments, 1);
44435                                 return assign$2.apply(this, [Object.create(obj)].concat(assignArgsList))
44436                         }
44437                 } else {
44438                         function F() {} // eslint-disable-line no-inner-declarations
44439                         return function create(obj, assignProps1, assignProps2, etc) {
44440                                 var assignArgsList = slice$b(arguments, 1);
44441                                 F.prototype = obj;
44442                                 return assign$2.apply(this, [new F()].concat(assignArgsList))
44443                         }
44444                 }
44445         }
44446
44447         function make_trim() {
44448                 if (String.prototype.trim) {
44449                         return function trim(str) {
44450                                 return String.prototype.trim.call(str)
44451                         }
44452                 } else {
44453                         return function trim(str) {
44454                                 return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
44455                         }
44456                 }
44457         }
44458
44459         function bind$3(obj, fn) {
44460                 return function() {
44461                         return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
44462                 }
44463         }
44464
44465         function slice$b(arr, index) {
44466                 return Array.prototype.slice.call(arr, index || 0)
44467         }
44468
44469         function each(obj, fn) {
44470                 pluck(obj, function(val, key) {
44471                         fn(val, key);
44472                         return false
44473                 });
44474         }
44475
44476         function map$5(obj, fn) {
44477                 var res = (isList(obj) ? [] : {});
44478                 pluck(obj, function(v, k) {
44479                         res[k] = fn(v, k);
44480                         return false
44481                 });
44482                 return res
44483         }
44484
44485         function pluck(obj, fn) {
44486                 if (isList(obj)) {
44487                         for (var i=0; i<obj.length; i++) {
44488                                 if (fn(obj[i], i)) {
44489                                         return obj[i]
44490                                 }
44491                         }
44492                 } else {
44493                         for (var key in obj) {
44494                                 if (obj.hasOwnProperty(key)) {
44495                                         if (fn(obj[key], key)) {
44496                                                 return obj[key]
44497                                         }
44498                                 }
44499                         }
44500                 }
44501         }
44502
44503         function isList(val) {
44504                 return (val != null && typeof val != 'function' && typeof val.length == 'number')
44505         }
44506
44507         function isFunction$2(val) {
44508                 return val && {}.toString.call(val) === '[object Function]'
44509         }
44510
44511         function isObject$2(val) {
44512                 return val && {}.toString.call(val) === '[object Object]'
44513         }
44514
44515         var slice$c = util.slice;
44516         var pluck$1 = util.pluck;
44517         var each$1 = util.each;
44518         var bind$4 = util.bind;
44519         var create$8 = util.create;
44520         var isList$1 = util.isList;
44521         var isFunction$3 = util.isFunction;
44522         var isObject$3 = util.isObject;
44523
44524         var storeEngine = {
44525                 createStore: createStore
44526         };
44527
44528         var storeAPI = {
44529                 version: '2.0.12',
44530                 enabled: false,
44531                 
44532                 // get returns the value of the given key. If that value
44533                 // is undefined, it returns optionalDefaultValue instead.
44534                 get: function(key, optionalDefaultValue) {
44535                         var data = this.storage.read(this._namespacePrefix + key);
44536                         return this._deserialize(data, optionalDefaultValue)
44537                 },
44538
44539                 // set will store the given value at key and returns value.
44540                 // Calling set with value === undefined is equivalent to calling remove.
44541                 set: function(key, value) {
44542                         if (value === undefined) {
44543                                 return this.remove(key)
44544                         }
44545                         this.storage.write(this._namespacePrefix + key, this._serialize(value));
44546                         return value
44547                 },
44548
44549                 // remove deletes the key and value stored at the given key.
44550                 remove: function(key) {
44551                         this.storage.remove(this._namespacePrefix + key);
44552                 },
44553
44554                 // each will call the given callback once for each key-value pair
44555                 // in this store.
44556                 each: function(callback) {
44557                         var self = this;
44558                         this.storage.each(function(val, namespacedKey) {
44559                                 callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
44560                         });
44561                 },
44562
44563                 // clearAll will remove all the stored key-value pairs in this store.
44564                 clearAll: function() {
44565                         this.storage.clearAll();
44566                 },
44567
44568                 // additional functionality that can't live in plugins
44569                 // ---------------------------------------------------
44570
44571                 // hasNamespace returns true if this store instance has the given namespace.
44572                 hasNamespace: function(namespace) {
44573                         return (this._namespacePrefix == '__storejs_'+namespace+'_')
44574                 },
44575
44576                 // createStore creates a store.js instance with the first
44577                 // functioning storage in the list of storage candidates,
44578                 // and applies the the given mixins to the instance.
44579                 createStore: function() {
44580                         return createStore.apply(this, arguments)
44581                 },
44582                 
44583                 addPlugin: function(plugin) {
44584                         this._addPlugin(plugin);
44585                 },
44586                 
44587                 namespace: function(namespace) {
44588                         return createStore(this.storage, this.plugins, namespace)
44589                 }
44590         };
44591
44592         function _warn() {
44593                 var _console = (typeof console == 'undefined' ? null : console);
44594                 if (!_console) { return }
44595                 var fn = (_console.warn ? _console.warn : _console.log);
44596                 fn.apply(_console, arguments);
44597         }
44598
44599         function createStore(storages, plugins, namespace) {
44600                 if (!namespace) {
44601                         namespace = '';
44602                 }
44603                 if (storages && !isList$1(storages)) {
44604                         storages = [storages];
44605                 }
44606                 if (plugins && !isList$1(plugins)) {
44607                         plugins = [plugins];
44608                 }
44609
44610                 var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
44611                 var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
44612                 var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
44613                 if (!legalNamespaces.test(namespace)) {
44614                         throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
44615                 }
44616                 
44617                 var _privateStoreProps = {
44618                         _namespacePrefix: namespacePrefix,
44619                         _namespaceRegexp: namespaceRegexp,
44620
44621                         _testStorage: function(storage) {
44622                                 try {
44623                                         var testStr = '__storejs__test__';
44624                                         storage.write(testStr, testStr);
44625                                         var ok = (storage.read(testStr) === testStr);
44626                                         storage.remove(testStr);
44627                                         return ok
44628                                 } catch(e) {
44629                                         return false
44630                                 }
44631                         },
44632
44633                         _assignPluginFnProp: function(pluginFnProp, propName) {
44634                                 var oldFn = this[propName];
44635                                 this[propName] = function pluginFn() {
44636                                         var args = slice$c(arguments, 0);
44637                                         var self = this;
44638
44639                                         // super_fn calls the old function which was overwritten by
44640                                         // this mixin.
44641                                         function super_fn() {
44642                                                 if (!oldFn) { return }
44643                                                 each$1(arguments, function(arg, i) {
44644                                                         args[i] = arg;
44645                                                 });
44646                                                 return oldFn.apply(self, args)
44647                                         }
44648
44649                                         // Give mixing function access to super_fn by prefixing all mixin function
44650                                         // arguments with super_fn.
44651                                         var newFnArgs = [super_fn].concat(args);
44652
44653                                         return pluginFnProp.apply(self, newFnArgs)
44654                                 };
44655                         },
44656
44657                         _serialize: function(obj) {
44658                                 return JSON.stringify(obj)
44659                         },
44660
44661                         _deserialize: function(strVal, defaultVal) {
44662                                 if (!strVal) { return defaultVal }
44663                                 // It is possible that a raw string value has been previously stored
44664                                 // in a storage without using store.js, meaning it will be a raw
44665                                 // string value instead of a JSON serialized string. By defaulting
44666                                 // to the raw string value in case of a JSON parse error, we allow
44667                                 // for past stored values to be forwards-compatible with store.js
44668                                 var val = '';
44669                                 try { val = JSON.parse(strVal); }
44670                                 catch(e) { val = strVal; }
44671
44672                                 return (val !== undefined ? val : defaultVal)
44673                         },
44674                         
44675                         _addStorage: function(storage) {
44676                                 if (this.enabled) { return }
44677                                 if (this._testStorage(storage)) {
44678                                         this.storage = storage;
44679                                         this.enabled = true;
44680                                 }
44681                         },
44682
44683                         _addPlugin: function(plugin) {
44684                                 var self = this;
44685
44686                                 // If the plugin is an array, then add all plugins in the array.
44687                                 // This allows for a plugin to depend on other plugins.
44688                                 if (isList$1(plugin)) {
44689                                         each$1(plugin, function(plugin) {
44690                                                 self._addPlugin(plugin);
44691                                         });
44692                                         return
44693                                 }
44694
44695                                 // Keep track of all plugins we've seen so far, so that we
44696                                 // don't add any of them twice.
44697                                 var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
44698                                         return (plugin === seenPlugin)
44699                                 });
44700                                 if (seenPlugin) {
44701                                         return
44702                                 }
44703                                 this.plugins.push(plugin);
44704
44705                                 // Check that the plugin is properly formed
44706                                 if (!isFunction$3(plugin)) {
44707                                         throw new Error('Plugins must be function values that return objects')
44708                                 }
44709
44710                                 var pluginProperties = plugin.call(this);
44711                                 if (!isObject$3(pluginProperties)) {
44712                                         throw new Error('Plugins must return an object of function properties')
44713                                 }
44714
44715                                 // Add the plugin function properties to this store instance.
44716                                 each$1(pluginProperties, function(pluginFnProp, propName) {
44717                                         if (!isFunction$3(pluginFnProp)) {
44718                                                 throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
44719                                         }
44720                                         self._assignPluginFnProp(pluginFnProp, propName);
44721                                 });
44722                         },
44723                         
44724                         // Put deprecated properties in the private API, so as to not expose it to accidential
44725                         // discovery through inspection of the store object.
44726                         
44727                         // Deprecated: addStorage
44728                         addStorage: function(storage) {
44729                                 _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
44730                                 this._addStorage(storage);
44731                         }
44732                 };
44733
44734                 var store = create$8(_privateStoreProps, storeAPI, {
44735                         plugins: []
44736                 });
44737                 store.raw = {};
44738                 each$1(store, function(prop, propName) {
44739                         if (isFunction$3(prop)) {
44740                                 store.raw[propName] = bind$4(store, prop);                      
44741                         }
44742                 });
44743                 each$1(storages, function(storage) {
44744                         store._addStorage(storage);
44745                 });
44746                 each$1(plugins, function(plugin) {
44747                         store._addPlugin(plugin);
44748                 });
44749                 return store
44750         }
44751
44752         var Global$1 = util.Global;
44753
44754         var localStorage_1 = {
44755                 name: 'localStorage',
44756                 read: read,
44757                 write: write,
44758                 each: each$2,
44759                 remove: remove$2,
44760                 clearAll: clearAll,
44761         };
44762
44763         function localStorage$1() {
44764                 return Global$1.localStorage
44765         }
44766
44767         function read(key) {
44768                 return localStorage$1().getItem(key)
44769         }
44770
44771         function write(key, data) {
44772                 return localStorage$1().setItem(key, data)
44773         }
44774
44775         function each$2(fn) {
44776                 for (var i = localStorage$1().length - 1; i >= 0; i--) {
44777                         var key = localStorage$1().key(i);
44778                         fn(read(key), key);
44779                 }
44780         }
44781
44782         function remove$2(key) {
44783                 return localStorage$1().removeItem(key)
44784         }
44785
44786         function clearAll() {
44787                 return localStorage$1().clear()
44788         }
44789
44790         // oldFF-globalStorage provides storage for Firefox
44791         // versions 6 and 7, where no localStorage, etc
44792         // is available.
44793
44794
44795         var Global$2 = util.Global;
44796
44797         var oldFFGlobalStorage = {
44798                 name: 'oldFF-globalStorage',
44799                 read: read$1,
44800                 write: write$1,
44801                 each: each$3,
44802                 remove: remove$3,
44803                 clearAll: clearAll$1,
44804         };
44805
44806         var globalStorage = Global$2.globalStorage;
44807
44808         function read$1(key) {
44809                 return globalStorage[key]
44810         }
44811
44812         function write$1(key, data) {
44813                 globalStorage[key] = data;
44814         }
44815
44816         function each$3(fn) {
44817                 for (var i = globalStorage.length - 1; i >= 0; i--) {
44818                         var key = globalStorage.key(i);
44819                         fn(globalStorage[key], key);
44820                 }
44821         }
44822
44823         function remove$3(key) {
44824                 return globalStorage.removeItem(key)
44825         }
44826
44827         function clearAll$1() {
44828                 each$3(function(key, _) {
44829                         delete globalStorage[key];
44830                 });
44831         }
44832
44833         // oldIE-userDataStorage provides storage for Internet Explorer
44834         // versions 6 and 7, where no localStorage, sessionStorage, etc
44835         // is available.
44836
44837
44838         var Global$3 = util.Global;
44839
44840         var oldIEUserDataStorage = {
44841                 name: 'oldIE-userDataStorage',
44842                 write: write$2,
44843                 read: read$2,
44844                 each: each$4,
44845                 remove: remove$4,
44846                 clearAll: clearAll$2,
44847         };
44848
44849         var storageName = 'storejs';
44850         var doc = Global$3.document;
44851         var _withStorageEl = _makeIEStorageElFunction();
44852         var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
44853
44854         function write$2(unfixedKey, data) {
44855                 if (disable) { return }
44856                 var fixedKey = fixKey(unfixedKey);
44857                 _withStorageEl(function(storageEl) {
44858                         storageEl.setAttribute(fixedKey, data);
44859                         storageEl.save(storageName);
44860                 });
44861         }
44862
44863         function read$2(unfixedKey) {
44864                 if (disable) { return }
44865                 var fixedKey = fixKey(unfixedKey);
44866                 var res = null;
44867                 _withStorageEl(function(storageEl) {
44868                         res = storageEl.getAttribute(fixedKey);
44869                 });
44870                 return res
44871         }
44872
44873         function each$4(callback) {
44874                 _withStorageEl(function(storageEl) {
44875                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44876                         for (var i=attributes.length-1; i>=0; i--) {
44877                                 var attr = attributes[i];
44878                                 callback(storageEl.getAttribute(attr.name), attr.name);
44879                         }
44880                 });
44881         }
44882
44883         function remove$4(unfixedKey) {
44884                 var fixedKey = fixKey(unfixedKey);
44885                 _withStorageEl(function(storageEl) {
44886                         storageEl.removeAttribute(fixedKey);
44887                         storageEl.save(storageName);
44888                 });
44889         }
44890
44891         function clearAll$2() {
44892                 _withStorageEl(function(storageEl) {
44893                         var attributes = storageEl.XMLDocument.documentElement.attributes;
44894                         storageEl.load(storageName);
44895                         for (var i=attributes.length-1; i>=0; i--) {
44896                                 storageEl.removeAttribute(attributes[i].name);
44897                         }
44898                         storageEl.save(storageName);
44899                 });
44900         }
44901
44902         // Helpers
44903         //////////
44904
44905         // In IE7, keys cannot start with a digit or contain certain chars.
44906         // See https://github.com/marcuswestin/store.js/issues/40
44907         // See https://github.com/marcuswestin/store.js/issues/83
44908         var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
44909         function fixKey(key) {
44910                 return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
44911         }
44912
44913         function _makeIEStorageElFunction() {
44914                 if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
44915                         return null
44916                 }
44917                 var scriptTag = 'script',
44918                         storageOwner,
44919                         storageContainer,
44920                         storageEl;
44921
44922                 // Since #userData storage applies only to specific paths, we need to
44923                 // somehow link our data to a specific path.  We choose /favicon.ico
44924                 // as a pretty safe option, since all browsers already make a request to
44925                 // this URL anyway and being a 404 will not hurt us here.  We wrap an
44926                 // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
44927                 // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
44928                 // since the iframe access rules appear to allow direct access and
44929                 // manipulation of the document element, even for a 404 page.  This
44930                 // document can be used instead of the current document (which would
44931                 // have been limited to the current path) to perform #userData storage.
44932                 try {
44933                         /* global ActiveXObject */
44934                         storageContainer = new ActiveXObject('htmlfile');
44935                         storageContainer.open();
44936                         storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
44937                         storageContainer.close();
44938                         storageOwner = storageContainer.w.frames[0].document;
44939                         storageEl = storageOwner.createElement('div');
44940                 } catch(e) {
44941                         // somehow ActiveXObject instantiation failed (perhaps some special
44942                         // security settings or otherwse), fall back to per-path storage
44943                         storageEl = doc.createElement('div');
44944                         storageOwner = doc.body;
44945                 }
44946
44947                 return function(storeFunction) {
44948                         var args = [].slice.call(arguments, 0);
44949                         args.unshift(storageEl);
44950                         // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
44951                         // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
44952                         storageOwner.appendChild(storageEl);
44953                         storageEl.addBehavior('#default#userData');
44954                         storageEl.load(storageName);
44955                         storeFunction.apply(this, args);
44956                         storageOwner.removeChild(storageEl);
44957                         return
44958                 }
44959         }
44960
44961         // cookieStorage is useful Safari private browser mode, where localStorage
44962         // doesn't work but cookies do. This implementation is adopted from
44963         // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
44964
44965
44966         var Global$4 = util.Global;
44967         var trim$2 = util.trim;
44968
44969         var cookieStorage = {
44970                 name: 'cookieStorage',
44971                 read: read$3,
44972                 write: write$3,
44973                 each: each$5,
44974                 remove: remove$5,
44975                 clearAll: clearAll$3,
44976         };
44977
44978         var doc$1 = Global$4.document;
44979
44980         function read$3(key) {
44981                 if (!key || !_has(key)) { return null }
44982                 var regexpStr = "(?:^|.*;\\s*)" +
44983                         escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
44984                         "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
44985                 return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
44986         }
44987
44988         function each$5(callback) {
44989                 var cookies = doc$1.cookie.split(/; ?/g);
44990                 for (var i = cookies.length - 1; i >= 0; i--) {
44991                         if (!trim$2(cookies[i])) {
44992                                 continue
44993                         }
44994                         var kvp = cookies[i].split('=');
44995                         var key = unescape(kvp[0]);
44996                         var val = unescape(kvp[1]);
44997                         callback(val, key);
44998                 }
44999         }
45000
45001         function write$3(key, data) {
45002                 if(!key) { return }
45003                 doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
45004         }
45005
45006         function remove$5(key) {
45007                 if (!key || !_has(key)) {
45008                         return
45009                 }
45010                 doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
45011         }
45012
45013         function clearAll$3() {
45014                 each$5(function(_, key) {
45015                         remove$5(key);
45016                 });
45017         }
45018
45019         function _has(key) {
45020                 return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
45021         }
45022
45023         var Global$5 = util.Global;
45024
45025         var sessionStorage_1 = {
45026                 name: 'sessionStorage',
45027                 read: read$4,
45028                 write: write$4,
45029                 each: each$6,
45030                 remove: remove$6,
45031                 clearAll: clearAll$4
45032         };
45033
45034         function sessionStorage() {
45035                 return Global$5.sessionStorage
45036         }
45037
45038         function read$4(key) {
45039                 return sessionStorage().getItem(key)
45040         }
45041
45042         function write$4(key, data) {
45043                 return sessionStorage().setItem(key, data)
45044         }
45045
45046         function each$6(fn) {
45047                 for (var i = sessionStorage().length - 1; i >= 0; i--) {
45048                         var key = sessionStorage().key(i);
45049                         fn(read$4(key), key);
45050                 }
45051         }
45052
45053         function remove$6(key) {
45054                 return sessionStorage().removeItem(key)
45055         }
45056
45057         function clearAll$4() {
45058                 return sessionStorage().clear()
45059         }
45060
45061         // memoryStorage is a useful last fallback to ensure that the store
45062         // is functions (meaning store.get(), store.set(), etc will all function).
45063         // However, stored values will not persist when the browser navigates to
45064         // a new page or reloads the current page.
45065
45066         var memoryStorage_1 = {
45067                 name: 'memoryStorage',
45068                 read: read$5,
45069                 write: write$5,
45070                 each: each$7,
45071                 remove: remove$7,
45072                 clearAll: clearAll$5,
45073         };
45074
45075         var memoryStorage = {};
45076
45077         function read$5(key) {
45078                 return memoryStorage[key]
45079         }
45080
45081         function write$5(key, data) {
45082                 memoryStorage[key] = data;
45083         }
45084
45085         function each$7(callback) {
45086                 for (var key in memoryStorage) {
45087                         if (memoryStorage.hasOwnProperty(key)) {
45088                                 callback(memoryStorage[key], key);
45089                         }
45090                 }
45091         }
45092
45093         function remove$7(key) {
45094                 delete memoryStorage[key];
45095         }
45096
45097         function clearAll$5(key) {
45098                 memoryStorage = {};
45099         }
45100
45101         var all = [
45102                 // Listed in order of usage preference
45103                 localStorage_1,
45104                 oldFFGlobalStorage,
45105                 oldIEUserDataStorage,
45106                 cookieStorage,
45107                 sessionStorage_1,
45108                 memoryStorage_1
45109         ];
45110
45111         /* eslint-disable */
45112
45113         //  json2.js
45114         //  2016-10-28
45115         //  Public Domain.
45116         //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
45117         //  See http://www.JSON.org/js.html
45118         //  This code should be minified before deployment.
45119         //  See http://javascript.crockford.com/jsmin.html
45120
45121         //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
45122         //  NOT CONTROL.
45123
45124         //  This file creates a global JSON object containing two methods: stringify
45125         //  and parse. This file provides the ES5 JSON capability to ES3 systems.
45126         //  If a project might run on IE8 or earlier, then this file should be included.
45127         //  This file does nothing on ES5 systems.
45128
45129         //      JSON.stringify(value, replacer, space)
45130         //          value       any JavaScript value, usually an object or array.
45131         //          replacer    an optional parameter that determines how object
45132         //                      values are stringified for objects. It can be a
45133         //                      function or an array of strings.
45134         //          space       an optional parameter that specifies the indentation
45135         //                      of nested structures. If it is omitted, the text will
45136         //                      be packed without extra whitespace. If it is a number,
45137         //                      it will specify the number of spaces to indent at each
45138         //                      level. If it is a string (such as "\t" or "&nbsp;"),
45139         //                      it contains the characters used to indent at each level.
45140         //          This method produces a JSON text from a JavaScript value.
45141         //          When an object value is found, if the object contains a toJSON
45142         //          method, its toJSON method will be called and the result will be
45143         //          stringified. A toJSON method does not serialize: it returns the
45144         //          value represented by the name/value pair that should be serialized,
45145         //          or undefined if nothing should be serialized. The toJSON method
45146         //          will be passed the key associated with the value, and this will be
45147         //          bound to the value.
45148
45149         //          For example, this would serialize Dates as ISO strings.
45150
45151         //              Date.prototype.toJSON = function (key) {
45152         //                  function f(n) {
45153         //                      // Format integers to have at least two digits.
45154         //                      return (n < 10)
45155         //                          ? "0" + n
45156         //                          : n;
45157         //                  }
45158         //                  return this.getUTCFullYear()   + "-" +
45159         //                       f(this.getUTCMonth() + 1) + "-" +
45160         //                       f(this.getUTCDate())      + "T" +
45161         //                       f(this.getUTCHours())     + ":" +
45162         //                       f(this.getUTCMinutes())   + ":" +
45163         //                       f(this.getUTCSeconds())   + "Z";
45164         //              };
45165
45166         //          You can provide an optional replacer method. It will be passed the
45167         //          key and value of each member, with this bound to the containing
45168         //          object. The value that is returned from your method will be
45169         //          serialized. If your method returns undefined, then the member will
45170         //          be excluded from the serialization.
45171
45172         //          If the replacer parameter is an array of strings, then it will be
45173         //          used to select the members to be serialized. It filters the results
45174         //          such that only members with keys listed in the replacer array are
45175         //          stringified.
45176
45177         //          Values that do not have JSON representations, such as undefined or
45178         //          functions, will not be serialized. Such values in objects will be
45179         //          dropped; in arrays they will be replaced with null. You can use
45180         //          a replacer function to replace those with JSON values.
45181
45182         //          JSON.stringify(undefined) returns undefined.
45183
45184         //          The optional space parameter produces a stringification of the
45185         //          value that is filled with line breaks and indentation to make it
45186         //          easier to read.
45187
45188         //          If the space parameter is a non-empty string, then that string will
45189         //          be used for indentation. If the space parameter is a number, then
45190         //          the indentation will be that many spaces.
45191
45192         //          Example:
45193
45194         //          text = JSON.stringify(["e", {pluribus: "unum"}]);
45195         //          // text is '["e",{"pluribus":"unum"}]'
45196
45197         //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
45198         //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
45199
45200         //          text = JSON.stringify([new Date()], function (key, value) {
45201         //              return this[key] instanceof Date
45202         //                  ? "Date(" + this[key] + ")"
45203         //                  : value;
45204         //          });
45205         //          // text is '["Date(---current time---)"]'
45206
45207         //      JSON.parse(text, reviver)
45208         //          This method parses a JSON text to produce an object or array.
45209         //          It can throw a SyntaxError exception.
45210
45211         //          The optional reviver parameter is a function that can filter and
45212         //          transform the results. It receives each of the keys and values,
45213         //          and its return value is used instead of the original value.
45214         //          If it returns what it received, then the structure is not modified.
45215         //          If it returns undefined then the member is deleted.
45216
45217         //          Example:
45218
45219         //          // Parse the text. Values that look like ISO date strings will
45220         //          // be converted to Date objects.
45221
45222         //          myData = JSON.parse(text, function (key, value) {
45223         //              var a;
45224         //              if (typeof value === "string") {
45225         //                  a =
45226         //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
45227         //                  if (a) {
45228         //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
45229         //                          +a[5], +a[6]));
45230         //                  }
45231         //              }
45232         //              return value;
45233         //          });
45234
45235         //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
45236         //              var d;
45237         //              if (typeof value === "string" &&
45238         //                      value.slice(0, 5) === "Date(" &&
45239         //                      value.slice(-1) === ")") {
45240         //                  d = new Date(value.slice(5, -1));
45241         //                  if (d) {
45242         //                      return d;
45243         //                  }
45244         //              }
45245         //              return value;
45246         //          });
45247
45248         //  This is a reference implementation. You are free to copy, modify, or
45249         //  redistribute.
45250
45251         /*jslint
45252             eval, for, this
45253         */
45254
45255         /*property
45256             JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
45257             getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
45258             lastIndex, length, parse, prototype, push, replace, slice, stringify,
45259             test, toJSON, toString, valueOf
45260         */
45261
45262
45263         // Create a JSON object only if one does not already exist. We create the
45264         // methods in a closure to avoid creating global variables.
45265
45266         if (typeof JSON !== "object") {
45267             JSON = {};
45268         }
45269
45270         (function () {
45271
45272             var rx_one = /^[\],:{}\s]*$/;
45273             var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
45274             var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
45275             var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
45276             var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45277             var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
45278
45279             function f(n) {
45280                 // Format integers to have at least two digits.
45281                 return n < 10
45282                     ? "0" + n
45283                     : n;
45284             }
45285
45286             function this_value() {
45287                 return this.valueOf();
45288             }
45289
45290             if (typeof Date.prototype.toJSON !== "function") {
45291
45292                 Date.prototype.toJSON = function () {
45293
45294                     return isFinite(this.valueOf())
45295                         ? this.getUTCFullYear() + "-" +
45296                                 f(this.getUTCMonth() + 1) + "-" +
45297                                 f(this.getUTCDate()) + "T" +
45298                                 f(this.getUTCHours()) + ":" +
45299                                 f(this.getUTCMinutes()) + ":" +
45300                                 f(this.getUTCSeconds()) + "Z"
45301                         : null;
45302                 };
45303
45304                 Boolean.prototype.toJSON = this_value;
45305                 Number.prototype.toJSON = this_value;
45306                 String.prototype.toJSON = this_value;
45307             }
45308
45309             var gap;
45310             var indent;
45311             var meta;
45312             var rep;
45313
45314
45315             function quote(string) {
45316
45317         // If the string contains no control characters, no quote characters, and no
45318         // backslash characters, then we can safely slap some quotes around it.
45319         // Otherwise we must also replace the offending characters with safe escape
45320         // sequences.
45321
45322                 rx_escapable.lastIndex = 0;
45323                 return rx_escapable.test(string)
45324                     ? "\"" + string.replace(rx_escapable, function (a) {
45325                         var c = meta[a];
45326                         return typeof c === "string"
45327                             ? c
45328                             : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45329                     }) + "\""
45330                     : "\"" + string + "\"";
45331             }
45332
45333
45334             function str(key, holder) {
45335
45336         // Produce a string from holder[key].
45337
45338                 var i;          // The loop counter.
45339                 var k;          // The member key.
45340                 var v;          // The member value.
45341                 var length;
45342                 var mind = gap;
45343                 var partial;
45344                 var value = holder[key];
45345
45346         // If the value has a toJSON method, call it to obtain a replacement value.
45347
45348                 if (value && typeof value === "object" &&
45349                         typeof value.toJSON === "function") {
45350                     value = value.toJSON(key);
45351                 }
45352
45353         // If we were called with a replacer function, then call the replacer to
45354         // obtain a replacement value.
45355
45356                 if (typeof rep === "function") {
45357                     value = rep.call(holder, key, value);
45358                 }
45359
45360         // What happens next depends on the value's type.
45361
45362                 switch (typeof value) {
45363                 case "string":
45364                     return quote(value);
45365
45366                 case "number":
45367
45368         // JSON numbers must be finite. Encode non-finite numbers as null.
45369
45370                     return isFinite(value)
45371                         ? String(value)
45372                         : "null";
45373
45374                 case "boolean":
45375                 case "null":
45376
45377         // If the value is a boolean or null, convert it to a string. Note:
45378         // typeof null does not produce "null". The case is included here in
45379         // the remote chance that this gets fixed someday.
45380
45381                     return String(value);
45382
45383         // If the type is "object", we might be dealing with an object or an array or
45384         // null.
45385
45386                 case "object":
45387
45388         // Due to a specification blunder in ECMAScript, typeof null is "object",
45389         // so watch out for that case.
45390
45391                     if (!value) {
45392                         return "null";
45393                     }
45394
45395         // Make an array to hold the partial results of stringifying this object value.
45396
45397                     gap += indent;
45398                     partial = [];
45399
45400         // Is the value an array?
45401
45402                     if (Object.prototype.toString.apply(value) === "[object Array]") {
45403
45404         // The value is an array. Stringify every element. Use null as a placeholder
45405         // for non-JSON values.
45406
45407                         length = value.length;
45408                         for (i = 0; i < length; i += 1) {
45409                             partial[i] = str(i, value) || "null";
45410                         }
45411
45412         // Join all of the elements together, separated with commas, and wrap them in
45413         // brackets.
45414
45415                         v = partial.length === 0
45416                             ? "[]"
45417                             : gap
45418                                 ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
45419                                 : "[" + partial.join(",") + "]";
45420                         gap = mind;
45421                         return v;
45422                     }
45423
45424         // If the replacer is an array, use it to select the members to be stringified.
45425
45426                     if (rep && typeof rep === "object") {
45427                         length = rep.length;
45428                         for (i = 0; i < length; i += 1) {
45429                             if (typeof rep[i] === "string") {
45430                                 k = rep[i];
45431                                 v = str(k, value);
45432                                 if (v) {
45433                                     partial.push(quote(k) + (
45434                                         gap
45435                                             ? ": "
45436                                             : ":"
45437                                     ) + v);
45438                                 }
45439                             }
45440                         }
45441                     } else {
45442
45443         // Otherwise, iterate through all of the keys in the object.
45444
45445                         for (k in value) {
45446                             if (Object.prototype.hasOwnProperty.call(value, k)) {
45447                                 v = str(k, value);
45448                                 if (v) {
45449                                     partial.push(quote(k) + (
45450                                         gap
45451                                             ? ": "
45452                                             : ":"
45453                                     ) + v);
45454                                 }
45455                             }
45456                         }
45457                     }
45458
45459         // Join all of the member texts together, separated with commas,
45460         // and wrap them in braces.
45461
45462                     v = partial.length === 0
45463                         ? "{}"
45464                         : gap
45465                             ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
45466                             : "{" + partial.join(",") + "}";
45467                     gap = mind;
45468                     return v;
45469                 }
45470             }
45471
45472         // If the JSON object does not yet have a stringify method, give it one.
45473
45474             if (typeof JSON.stringify !== "function") {
45475                 meta = {    // table of character substitutions
45476                     "\b": "\\b",
45477                     "\t": "\\t",
45478                     "\n": "\\n",
45479                     "\f": "\\f",
45480                     "\r": "\\r",
45481                     "\"": "\\\"",
45482                     "\\": "\\\\"
45483                 };
45484                 JSON.stringify = function (value, replacer, space) {
45485
45486         // The stringify method takes a value and an optional replacer, and an optional
45487         // space parameter, and returns a JSON text. The replacer can be a function
45488         // that can replace values, or an array of strings that will select the keys.
45489         // A default replacer method can be provided. Use of the space parameter can
45490         // produce text that is more easily readable.
45491
45492                     var i;
45493                     gap = "";
45494                     indent = "";
45495
45496         // If the space parameter is a number, make an indent string containing that
45497         // many spaces.
45498
45499                     if (typeof space === "number") {
45500                         for (i = 0; i < space; i += 1) {
45501                             indent += " ";
45502                         }
45503
45504         // If the space parameter is a string, it will be used as the indent string.
45505
45506                     } else if (typeof space === "string") {
45507                         indent = space;
45508                     }
45509
45510         // If there is a replacer, it must be a function or an array.
45511         // Otherwise, throw an error.
45512
45513                     rep = replacer;
45514                     if (replacer && typeof replacer !== "function" &&
45515                             (typeof replacer !== "object" ||
45516                             typeof replacer.length !== "number")) {
45517                         throw new Error("JSON.stringify");
45518                     }
45519
45520         // Make a fake root object containing our value under the key of "".
45521         // Return the result of stringifying the value.
45522
45523                     return str("", {"": value});
45524                 };
45525             }
45526
45527
45528         // If the JSON object does not yet have a parse method, give it one.
45529
45530             if (typeof JSON.parse !== "function") {
45531                 JSON.parse = function (text, reviver) {
45532
45533         // The parse method takes a text and an optional reviver function, and returns
45534         // a JavaScript value if the text is a valid JSON text.
45535
45536                     var j;
45537
45538                     function walk(holder, key) {
45539
45540         // The walk method is used to recursively walk the resulting structure so
45541         // that modifications can be made.
45542
45543                         var k;
45544                         var v;
45545                         var value = holder[key];
45546                         if (value && typeof value === "object") {
45547                             for (k in value) {
45548                                 if (Object.prototype.hasOwnProperty.call(value, k)) {
45549                                     v = walk(value, k);
45550                                     if (v !== undefined) {
45551                                         value[k] = v;
45552                                     } else {
45553                                         delete value[k];
45554                                     }
45555                                 }
45556                             }
45557                         }
45558                         return reviver.call(holder, key, value);
45559                     }
45560
45561
45562         // Parsing happens in four stages. In the first stage, we replace certain
45563         // Unicode characters with escape sequences. JavaScript handles many characters
45564         // incorrectly, either silently deleting them, or treating them as line endings.
45565
45566                     text = String(text);
45567                     rx_dangerous.lastIndex = 0;
45568                     if (rx_dangerous.test(text)) {
45569                         text = text.replace(rx_dangerous, function (a) {
45570                             return "\\u" +
45571                                     ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
45572                         });
45573                     }
45574
45575         // In the second stage, we run the text against regular expressions that look
45576         // for non-JSON patterns. We are especially concerned with "()" and "new"
45577         // because they can cause invocation, and "=" because it can cause mutation.
45578         // But just to be safe, we want to reject all unexpected forms.
45579
45580         // We split the second stage into 4 regexp operations in order to work around
45581         // crippling inefficiencies in IE's and Safari's regexp engines. First we
45582         // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
45583         // replace all simple value tokens with "]" characters. Third, we delete all
45584         // open brackets that follow a colon or comma or that begin the text. Finally,
45585         // we look to see that the remaining characters are only whitespace or "]" or
45586         // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
45587
45588                     if (
45589                         rx_one.test(
45590                             text
45591                                 .replace(rx_two, "@")
45592                                 .replace(rx_three, "]")
45593                                 .replace(rx_four, "")
45594                         )
45595                     ) {
45596
45597         // In the third stage we use the eval function to compile the text into a
45598         // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
45599         // in JavaScript: it can begin a block or an object literal. We wrap the text
45600         // in parens to eliminate the ambiguity.
45601
45602                         j = eval("(" + text + ")");
45603
45604         // In the optional fourth stage, we recursively walk the new structure, passing
45605         // each name/value pair to a reviver function for possible transformation.
45606
45607                         return (typeof reviver === "function")
45608                             ? walk({"": j}, "")
45609                             : j;
45610                     }
45611
45612         // If the text is not JSON parseable, then a SyntaxError is thrown.
45613
45614                     throw new SyntaxError("JSON.parse");
45615                 };
45616             }
45617         }());
45618
45619         var json2 = json2Plugin;
45620
45621         function json2Plugin() {
45622                 
45623                 return {}
45624         }
45625
45626         var plugins = [json2];
45627
45628         var store_legacy = storeEngine.createStore(all, plugins);
45629
45630         // # osm-auth
45631         //
45632         // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
45633         // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
45634         // does not support custom headers, which this uses everywhere.
45635         var osmAuth = function(o) {
45636
45637             var oauth = {};
45638
45639             // authenticated users will also have a request token secret, but it's
45640             // not used in transactions with the server
45641             oauth.authenticated = function() {
45642                 return !!(token('oauth_token') && token('oauth_token_secret'));
45643             };
45644
45645             oauth.logout = function() {
45646                 token('oauth_token', '');
45647                 token('oauth_token_secret', '');
45648                 token('oauth_request_token_secret', '');
45649                 return oauth;
45650             };
45651
45652             // TODO: detect lack of click event
45653             oauth.authenticate = function(callback) {
45654                 if (oauth.authenticated()) return callback();
45655
45656                 oauth.logout();
45657
45658                 // ## Getting a request token
45659                 var params = timenonce(getAuth(o)),
45660                     url = o.url + '/oauth/request_token';
45661
45662                 params.oauth_signature = ohauth_1.signature(
45663                     o.oauth_secret, '',
45664                     ohauth_1.baseString('POST', url, params));
45665
45666                 if (!o.singlepage) {
45667                     // Create a 600x550 popup window in the center of the screen
45668                     var w = 600, h = 550,
45669                         settings = [
45670                             ['width', w], ['height', h],
45671                             ['left', screen.width / 2 - w / 2],
45672                             ['top', screen.height / 2 - h / 2]].map(function(x) {
45673                                 return x.join('=');
45674                             }).join(','),
45675                         popup = window.open('about:blank', 'oauth_window', settings);
45676                 }
45677
45678                 // Request a request token. When this is complete, the popup
45679                 // window is redirected to OSM's authorization page.
45680                 ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
45681                 o.loading();
45682
45683                 function reqTokenDone(err, xhr) {
45684                     o.done();
45685                     if (err) return callback(err);
45686                     var resp = ohauth_1.stringQs(xhr.response);
45687                     token('oauth_request_token_secret', resp.oauth_token_secret);
45688                     var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
45689                         oauth_token: resp.oauth_token,
45690                         oauth_callback: resolveUrl(o.landing)
45691                     });
45692
45693                     if (o.singlepage) {
45694                         location.href = authorize_url;
45695                     } else {
45696                         popup.location = authorize_url;
45697                     }
45698                 }
45699
45700                 // Called by a function in a landing page, in the popup window. The
45701                 // window closes itself.
45702                 window.authComplete = function(token) {
45703                     var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
45704                     get_access_token(oauth_token.oauth_token);
45705                     delete window.authComplete;
45706                 };
45707
45708                 // ## Getting an request token
45709                 //
45710                 // At this point we have an `oauth_token`, brought in from a function
45711                 // call on a landing page popup.
45712                 function get_access_token(oauth_token) {
45713                     var url = o.url + '/oauth/access_token',
45714                         params = timenonce(getAuth(o)),
45715                         request_token_secret = token('oauth_request_token_secret');
45716                     params.oauth_token = oauth_token;
45717                     params.oauth_signature = ohauth_1.signature(
45718                         o.oauth_secret,
45719                         request_token_secret,
45720                         ohauth_1.baseString('POST', url, params));
45721
45722                     // ## Getting an access token
45723                     //
45724                     // The final token required for authentication. At this point
45725                     // we have a `request token secret`
45726                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45727                     o.loading();
45728                 }
45729
45730                 function accessTokenDone(err, xhr) {
45731                     o.done();
45732                     if (err) return callback(err);
45733                     var access_token = ohauth_1.stringQs(xhr.response);
45734                     token('oauth_token', access_token.oauth_token);
45735                     token('oauth_token_secret', access_token.oauth_token_secret);
45736                     callback(null, oauth);
45737                 }
45738             };
45739
45740             oauth.bootstrapToken = function(oauth_token, callback) {
45741                 // ## Getting an request token
45742                 // At this point we have an `oauth_token`, brought in from a function
45743                 // call on a landing page popup.
45744                 function get_access_token(oauth_token) {
45745                     var url = o.url + '/oauth/access_token',
45746                         params = timenonce(getAuth(o)),
45747                         request_token_secret = token('oauth_request_token_secret');
45748                     params.oauth_token = oauth_token;
45749                     params.oauth_signature = ohauth_1.signature(
45750                         o.oauth_secret,
45751                         request_token_secret,
45752                         ohauth_1.baseString('POST', url, params));
45753
45754                     // ## Getting an access token
45755                     // The final token required for authentication. At this point
45756                     // we have a `request token secret`
45757                     ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
45758                     o.loading();
45759                 }
45760
45761                 function accessTokenDone(err, xhr) {
45762                     o.done();
45763                     if (err) return callback(err);
45764                     var access_token = ohauth_1.stringQs(xhr.response);
45765                     token('oauth_token', access_token.oauth_token);
45766                     token('oauth_token_secret', access_token.oauth_token_secret);
45767                     callback(null, oauth);
45768                 }
45769
45770                 get_access_token(oauth_token);
45771             };
45772
45773             // # xhr
45774             //
45775             // A single XMLHttpRequest wrapper that does authenticated calls if the
45776             // user has logged in.
45777             oauth.xhr = function(options, callback) {
45778                 if (!oauth.authenticated()) {
45779                     if (o.auto) {
45780                         return oauth.authenticate(run);
45781                     } else {
45782                         callback('not authenticated', null);
45783                         return;
45784                     }
45785                 } else {
45786                     return run();
45787                 }
45788
45789                 function run() {
45790                     var params = timenonce(getAuth(o)),
45791                         oauth_token_secret = token('oauth_token_secret'),
45792                         url = (options.prefix !== false) ? o.url + options.path : options.path,
45793                         url_parts = url.replace(/#.*$/, '').split('?', 2),
45794                         base_url = url_parts[0],
45795                         query = (url_parts.length === 2) ? url_parts[1] : '';
45796
45797                     // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
45798                     if ((!options.options || !options.options.header ||
45799                         options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
45800                         options.content) {
45801                         params = immutable(params, ohauth_1.stringQs(options.content));
45802                     }
45803
45804                     params.oauth_token = token('oauth_token');
45805                     params.oauth_signature = ohauth_1.signature(
45806                         o.oauth_secret,
45807                         oauth_token_secret,
45808                         ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
45809                     );
45810
45811                     return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
45812                 }
45813
45814                 function done(err, xhr) {
45815                     if (err) return callback(err);
45816                     else if (xhr.responseXML) return callback(err, xhr.responseXML);
45817                     else return callback(err, xhr.response);
45818                 }
45819             };
45820
45821             // pre-authorize this object, if we can just get a token and token_secret
45822             // from the start
45823             oauth.preauth = function(c) {
45824                 if (!c) return;
45825                 if (c.oauth_token) token('oauth_token', c.oauth_token);
45826                 if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
45827                 return oauth;
45828             };
45829
45830             oauth.options = function(_) {
45831                 if (!arguments.length) return o;
45832
45833                 o = _;
45834                 o.url = o.url || 'https://www.openstreetmap.org';
45835                 o.landing = o.landing || 'land.html';
45836                 o.singlepage = o.singlepage || false;
45837
45838                 // Optional loading and loading-done functions for nice UI feedback.
45839                 // by default, no-ops
45840                 o.loading = o.loading || function() {};
45841                 o.done = o.done || function() {};
45842
45843                 return oauth.preauth(o);
45844             };
45845
45846             // 'stamp' an authentication object from `getAuth()`
45847             // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
45848             // and timestamp
45849             function timenonce(o) {
45850                 o.oauth_timestamp = ohauth_1.timestamp();
45851                 o.oauth_nonce = ohauth_1.nonce();
45852                 return o;
45853             }
45854
45855             // get/set tokens. These are prefixed with the base URL so that `osm-auth`
45856             // can be used with multiple APIs and the keys in `localStorage`
45857             // will not clash
45858             var token;
45859
45860             if (store_legacy.enabled) {
45861                 token = function (x, y) {
45862                     if (arguments.length === 1) return store_legacy.get(o.url + x);
45863                     else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
45864                 };
45865             } else {
45866                 var storage = {};
45867                 token = function (x, y) {
45868                     if (arguments.length === 1) return storage[o.url + x];
45869                     else if (arguments.length === 2) return storage[o.url + x] = y;
45870                 };
45871             }
45872
45873             // Get an authentication object. If you just add and remove properties
45874             // from a single object, you'll need to use `delete` to make sure that
45875             // it doesn't contain undesired properties for authentication
45876             function getAuth(o) {
45877                 return {
45878                     oauth_consumer_key: o.oauth_consumer_key,
45879                     oauth_signature_method: 'HMAC-SHA1'
45880                 };
45881             }
45882
45883             // potentially pre-authorize
45884             oauth.options(o);
45885
45886             return oauth;
45887         };
45888
45889         var JXON = new (function () {
45890           var
45891             sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
45892             aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
45893
45894           function parseText (sValue) {
45895             if (rIsNull.test(sValue)) { return null; }
45896             if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
45897             if (isFinite(sValue)) { return parseFloat(sValue); }
45898             if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
45899             return sValue;
45900           }
45901
45902           function EmptyTree () { }
45903           EmptyTree.prototype.toString = function () { return 'null'; };
45904           EmptyTree.prototype.valueOf = function () { return null; };
45905
45906           function objectify (vValue) {
45907             return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
45908           }
45909
45910           function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
45911             var
45912               nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
45913               bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
45914
45915             var
45916               sProp, vContent, nLength = 0, sCollectedTxt = '',
45917               vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
45918
45919             if (bChildren) {
45920               for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
45921                 oNode = oParentNode.childNodes.item(nItem);
45922                 if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
45923                 else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
45924                 else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
45925               }
45926             }
45927
45928             var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
45929
45930             if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
45931
45932             for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
45933               sProp = aCache[nElId].nodeName.toLowerCase();
45934               vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
45935               if (vResult.hasOwnProperty(sProp)) {
45936                 if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
45937                 vResult[sProp].push(vContent);
45938               } else {
45939                 vResult[sProp] = vContent;
45940                 nLength++;
45941               }
45942             }
45943
45944             if (bAttributes) {
45945               var
45946                 nAttrLen = oParentNode.attributes.length,
45947                 sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
45948
45949               for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
45950                 oAttrib = oParentNode.attributes.item(nAttrib);
45951                 oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
45952               }
45953
45954               if (bNesteAttr) {
45955                 if (bFreeze) { Object.freeze(oAttrParent); }
45956                 vResult[sAttributesProp] = oAttrParent;
45957                 nLength -= nAttrLen - 1;
45958               }
45959             }
45960
45961             if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
45962               vResult[sValueProp] = vBuiltVal;
45963             } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
45964               vResult = vBuiltVal;
45965             }
45966
45967             if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
45968
45969             aCache.length = nLevelStart;
45970
45971             return vResult;
45972           }
45973
45974           function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
45975             var vValue, oChild;
45976
45977             if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
45978               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
45979             } else if (oParentObj.constructor === Date) {
45980               oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
45981             }
45982
45983             for (var sName in oParentObj) {
45984               vValue = oParentObj[sName];
45985               if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
45986               if (sName === sValueProp) {
45987                 if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
45988               } else if (sName === sAttributesProp) { /* verbosity level is 3 */
45989                 for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
45990               } else if (sName.charAt(0) === sAttrPref) {
45991                 oParentEl.setAttribute(sName.slice(1), vValue);
45992               } else if (vValue.constructor === Array) {
45993                 for (var nItem = 0; nItem < vValue.length; nItem++) {
45994                   oChild = oXMLDoc.createElement(sName);
45995                   loadObjTree(oXMLDoc, oChild, vValue[nItem]);
45996                   oParentEl.appendChild(oChild);
45997                 }
45998               } else {
45999                 oChild = oXMLDoc.createElement(sName);
46000                 if (vValue instanceof Object) {
46001                   loadObjTree(oXMLDoc, oChild, vValue);
46002                 } else if (vValue !== null && vValue !== true) {
46003                   oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
46004                 }
46005                 oParentEl.appendChild(oChild);
46006              }
46007            }
46008           }
46009
46010           this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
46011             var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
46012             return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
46013           };
46014
46015           this.unbuild = function (oObjTree) {    
46016             var oNewDoc = document.implementation.createDocument('', '', null);
46017             loadObjTree(oNewDoc, oNewDoc, oObjTree);
46018             return oNewDoc;
46019           };
46020
46021           this.stringify = function (oObjTree) {
46022             return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
46023           };
46024         })();
46025
46026         // var myObject = JXON.build(doc);
46027         // we got our javascript object! try: alert(JSON.stringify(myObject));
46028
46029         // var newDoc = JXON.unbuild(myObject);
46030         // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
46031
46032         var tiler$4 = utilTiler();
46033         var dispatch$5 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
46034         var urlroot = 'https://www.openstreetmap.org';
46035         var oauth = osmAuth({
46036             url: urlroot,
46037             oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
46038             oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
46039             loading: authLoading,
46040             done: authDone
46041         });
46042
46043         var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
46044         var _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46045         var _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46046         var _userCache = { toLoad: {}, user: {} };
46047         var _changeset = {};
46048
46049         var _deferred = new Set();
46050         var _connectionID = 1;
46051         var _tileZoom = 16;
46052         var _noteZoom = 12;
46053         var _rateLimitError;
46054         var _userChangesets;
46055         var _userDetails;
46056         var _off;
46057
46058
46059         function authLoading() {
46060             dispatch$5.call('authLoading');
46061         }
46062
46063
46064         function authDone() {
46065             dispatch$5.call('authDone');
46066         }
46067
46068
46069         function abortRequest$4(controllerOrXHR) {
46070             if (controllerOrXHR) {
46071                 controllerOrXHR.abort();
46072             }
46073         }
46074
46075
46076         function hasInflightRequests(cache) {
46077             return Object.keys(cache.inflight).length;
46078         }
46079
46080
46081         function abortUnwantedRequests$2(cache, visibleTiles) {
46082             Object.keys(cache.inflight).forEach(function(k) {
46083                 if (cache.toLoad[k]) return;
46084                 if (visibleTiles.find(function(tile) { return k === tile.id; })) return;
46085
46086                 abortRequest$4(cache.inflight[k]);
46087                 delete cache.inflight[k];
46088             });
46089         }
46090
46091
46092         function getLoc(attrs) {
46093             var lon = attrs.lon && attrs.lon.value;
46094             var lat = attrs.lat && attrs.lat.value;
46095             return [parseFloat(lon), parseFloat(lat)];
46096         }
46097
46098
46099         function getNodes(obj) {
46100             var elems = obj.getElementsByTagName('nd');
46101             var nodes = new Array(elems.length);
46102             for (var i = 0, l = elems.length; i < l; i++) {
46103                 nodes[i] = 'n' + elems[i].attributes.ref.value;
46104             }
46105             return nodes;
46106         }
46107
46108
46109         function getTags(obj) {
46110             var elems = obj.getElementsByTagName('tag');
46111             var tags = {};
46112             for (var i = 0, l = elems.length; i < l; i++) {
46113                 var attrs = elems[i].attributes;
46114                 tags[attrs.k.value] = attrs.v.value;
46115             }
46116
46117             return tags;
46118         }
46119
46120
46121         function getMembers(obj) {
46122             var elems = obj.getElementsByTagName('member');
46123             var members = new Array(elems.length);
46124             for (var i = 0, l = elems.length; i < l; i++) {
46125                 var attrs = elems[i].attributes;
46126                 members[i] = {
46127                     id: attrs.type.value[0] + attrs.ref.value,
46128                     type: attrs.type.value,
46129                     role: attrs.role.value
46130                 };
46131             }
46132             return members;
46133         }
46134
46135
46136         function getVisible(attrs) {
46137             return (!attrs.visible || attrs.visible.value !== 'false');
46138         }
46139
46140
46141         function parseComments(comments) {
46142             var parsedComments = [];
46143
46144             // for each comment
46145             for (var i = 0; i < comments.length; i++) {
46146                 var comment = comments[i];
46147                 if (comment.nodeName === 'comment') {
46148                     var childNodes = comment.childNodes;
46149                     var parsedComment = {};
46150
46151                     for (var j = 0; j < childNodes.length; j++) {
46152                         var node = childNodes[j];
46153                         var nodeName = node.nodeName;
46154                         if (nodeName === '#text') continue;
46155                         parsedComment[nodeName] = node.textContent;
46156
46157                         if (nodeName === 'uid') {
46158                             var uid = node.textContent;
46159                             if (uid && !_userCache.user[uid]) {
46160                                 _userCache.toLoad[uid] = true;
46161                             }
46162                         }
46163                     }
46164
46165                     if (parsedComment) {
46166                         parsedComments.push(parsedComment);
46167                     }
46168                 }
46169             }
46170             return parsedComments;
46171         }
46172
46173
46174         function encodeNoteRtree(note) {
46175             return {
46176                 minX: note.loc[0],
46177                 minY: note.loc[1],
46178                 maxX: note.loc[0],
46179                 maxY: note.loc[1],
46180                 data: note
46181             };
46182         }
46183
46184
46185         var parsers = {
46186             node: function nodeData(obj, uid) {
46187                 var attrs = obj.attributes;
46188                 return new osmNode({
46189                     id: uid,
46190                     visible: getVisible(attrs),
46191                     version: attrs.version.value,
46192                     changeset: attrs.changeset && attrs.changeset.value,
46193                     timestamp: attrs.timestamp && attrs.timestamp.value,
46194                     user: attrs.user && attrs.user.value,
46195                     uid: attrs.uid && attrs.uid.value,
46196                     loc: getLoc(attrs),
46197                     tags: getTags(obj)
46198                 });
46199             },
46200
46201             way: function wayData(obj, uid) {
46202                 var attrs = obj.attributes;
46203                 return new osmWay({
46204                     id: uid,
46205                     visible: getVisible(attrs),
46206                     version: attrs.version.value,
46207                     changeset: attrs.changeset && attrs.changeset.value,
46208                     timestamp: attrs.timestamp && attrs.timestamp.value,
46209                     user: attrs.user && attrs.user.value,
46210                     uid: attrs.uid && attrs.uid.value,
46211                     tags: getTags(obj),
46212                     nodes: getNodes(obj),
46213                 });
46214             },
46215
46216             relation: function relationData(obj, uid) {
46217                 var attrs = obj.attributes;
46218                 return new osmRelation({
46219                     id: uid,
46220                     visible: getVisible(attrs),
46221                     version: attrs.version.value,
46222                     changeset: attrs.changeset && attrs.changeset.value,
46223                     timestamp: attrs.timestamp && attrs.timestamp.value,
46224                     user: attrs.user && attrs.user.value,
46225                     uid: attrs.uid && attrs.uid.value,
46226                     tags: getTags(obj),
46227                     members: getMembers(obj)
46228                 });
46229             },
46230
46231             note: function parseNote(obj, uid) {
46232                 var attrs = obj.attributes;
46233                 var childNodes = obj.childNodes;
46234                 var props = {};
46235
46236                 props.id = uid;
46237                 props.loc = getLoc(attrs);
46238
46239                 // if notes are coincident, move them apart slightly
46240                 var coincident = false;
46241                 var epsilon = 0.00001;
46242                 do {
46243                     if (coincident) {
46244                         props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
46245                     }
46246                     var bbox = geoExtent(props.loc).bbox();
46247                     coincident = _noteCache.rtree.search(bbox).length;
46248                 } while (coincident);
46249
46250                 // parse note contents
46251                 for (var i = 0; i < childNodes.length; i++) {
46252                     var node = childNodes[i];
46253                     var nodeName = node.nodeName;
46254                     if (nodeName === '#text') continue;
46255
46256                     // if the element is comments, parse the comments
46257                     if (nodeName === 'comments') {
46258                         props[nodeName] = parseComments(node.childNodes);
46259                     } else {
46260                         props[nodeName] = node.textContent;
46261                     }
46262                 }
46263
46264                 var note = new osmNote(props);
46265                 var item = encodeNoteRtree(note);
46266                 _noteCache.note[note.id] = note;
46267                 _noteCache.rtree.insert(item);
46268
46269                 return note;
46270             },
46271
46272             user: function parseUser(obj, uid) {
46273                 var attrs = obj.attributes;
46274                 var user = {
46275                     id: uid,
46276                     display_name: attrs.display_name && attrs.display_name.value,
46277                     account_created: attrs.account_created && attrs.account_created.value,
46278                     changesets_count: 0
46279                 };
46280
46281                 var img = obj.getElementsByTagName('img');
46282                 if (img && img[0] && img[0].getAttribute('href')) {
46283                     user.image_url = img[0].getAttribute('href');
46284                 }
46285
46286                 var changesets = obj.getElementsByTagName('changesets');
46287                 if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
46288                     user.changesets_count = changesets[0].getAttribute('count');
46289                 }
46290
46291                 _userCache.user[uid] = user;
46292                 delete _userCache.toLoad[uid];
46293                 return user;
46294             }
46295         };
46296
46297
46298         function parseXML(xml, callback, options) {
46299             options = Object.assign({ skipSeen: true }, options);
46300             if (!xml || !xml.childNodes) {
46301                 return callback({ message: 'No XML', status: -1 });
46302             }
46303
46304             var root = xml.childNodes[0];
46305             var children = root.childNodes;
46306
46307             var handle = window.requestIdleCallback(function() {
46308                 var results = [];
46309                 var result;
46310                 for (var i = 0; i < children.length; i++) {
46311                     result = parseChild(children[i]);
46312                     if (result) results.push(result);
46313                 }
46314                 callback(null, results);
46315             });
46316
46317             _deferred.add(handle);
46318
46319
46320             function parseChild(child) {
46321                 var parser = parsers[child.nodeName];
46322                 if (!parser) return null;
46323
46324                 var uid;
46325                 if (child.nodeName === 'user') {
46326                     uid = child.attributes.id.value;
46327                     if (options.skipSeen && _userCache.user[uid]) {
46328                         delete _userCache.toLoad[uid];
46329                         return null;
46330                     }
46331
46332                 } else if (child.nodeName === 'note') {
46333                     uid = child.getElementsByTagName('id')[0].textContent;
46334
46335                 } else {
46336                     uid = osmEntity.id.fromOSM(child.nodeName, child.attributes.id.value);
46337                     if (options.skipSeen) {
46338                         if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
46339                         _tileCache.seen[uid] = true;
46340                     }
46341                 }
46342
46343                 return parser(child, uid);
46344             }
46345         }
46346
46347
46348         // replace or remove note from rtree
46349         function updateRtree$2(item, replace) {
46350             _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
46351
46352             if (replace) {
46353                 _noteCache.rtree.insert(item);
46354             }
46355         }
46356
46357
46358         function wrapcb(thisArg, callback, cid) {
46359             return function(err, result) {
46360                 if (err) {
46361                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
46362                     if (err.status === 400 || err.status === 401 || err.status === 403) {
46363                         thisArg.logout();
46364                     }
46365                     return callback.call(thisArg, err);
46366
46367                 } else if (thisArg.getConnectionId() !== cid) {
46368                     return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
46369
46370                 } else {
46371                     return callback.call(thisArg, err, result);
46372                 }
46373             };
46374         }
46375
46376
46377         var serviceOsm = {
46378
46379             init: function() {
46380                 utilRebind(this, dispatch$5, 'on');
46381             },
46382
46383
46384             reset: function() {
46385                 Array.from(_deferred).forEach(function(handle) {
46386                     window.cancelIdleCallback(handle);
46387                     _deferred.delete(handle);
46388                 });
46389
46390                 _connectionID++;
46391                 _userChangesets = undefined;
46392                 _userDetails = undefined;
46393                 _rateLimitError = undefined;
46394
46395                 Object.values(_tileCache.inflight).forEach(abortRequest$4);
46396                 Object.values(_noteCache.inflight).forEach(abortRequest$4);
46397                 Object.values(_noteCache.inflightPost).forEach(abortRequest$4);
46398                 if (_changeset.inflight) abortRequest$4(_changeset.inflight);
46399
46400                 _tileCache = { toLoad: {}, loaded: {}, inflight: {}, seen: {}, rtree: rbush_1() };
46401                 _noteCache = { toLoad: {}, loaded: {}, inflight: {}, inflightPost: {}, note: {}, closed: {}, rtree: rbush_1() };
46402                 _userCache = { toLoad: {}, user: {} };
46403                 _changeset = {};
46404
46405                 return this;
46406             },
46407
46408
46409             getConnectionId: function() {
46410                 return _connectionID;
46411             },
46412
46413
46414             changesetURL: function(changesetID) {
46415                 return urlroot + '/changeset/' + changesetID;
46416             },
46417
46418
46419             changesetsURL: function(center, zoom) {
46420                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
46421                 return urlroot + '/history#map=' +
46422                     Math.floor(zoom) + '/' +
46423                     center[1].toFixed(precision) + '/' +
46424                     center[0].toFixed(precision);
46425             },
46426
46427
46428             entityURL: function(entity) {
46429                 return urlroot + '/' + entity.type + '/' + entity.osmId();
46430             },
46431
46432
46433             historyURL: function(entity) {
46434                 return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
46435             },
46436
46437
46438             userURL: function(username) {
46439                 return urlroot + '/user/' + username;
46440             },
46441
46442
46443             noteURL: function(note) {
46444                 return urlroot + '/note/' + note.id;
46445             },
46446
46447
46448             noteReportURL: function(note) {
46449                 return urlroot + '/reports/new?reportable_type=Note&reportable_id=' + note.id;
46450             },
46451
46452
46453             // Generic method to load data from the OSM API
46454             // Can handle either auth or unauth calls.
46455             loadFromAPI: function(path, callback, options) {
46456                 options = Object.assign({ skipSeen: true }, options);
46457                 var that = this;
46458                 var cid = _connectionID;
46459
46460                 function done(err, xml) {
46461                     if (that.getConnectionId() !== cid) {
46462                         if (callback) callback({ message: 'Connection Switched', status: -1 });
46463                         return;
46464                     }
46465
46466                     var isAuthenticated = that.authenticated();
46467
46468                     // 400 Bad Request, 401 Unauthorized, 403 Forbidden
46469                     // Logout and retry the request..
46470                     if (isAuthenticated && err && err.status &&
46471                             (err.status === 400 || err.status === 401 || err.status === 403)) {
46472                         that.logout();
46473                         that.loadFromAPI(path, callback, options);
46474
46475                     // else, no retry..
46476                     } else {
46477                         // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
46478                         // Set the rateLimitError flag and trigger a warning..
46479                         if (!isAuthenticated && !_rateLimitError && err && err.status &&
46480                                 (err.status === 509 || err.status === 429)) {
46481                             _rateLimitError = err;
46482                             dispatch$5.call('change');
46483                         }
46484
46485                         if (callback) {
46486                             if (err) {
46487                                 return callback(err);
46488                             } else {
46489                                 return parseXML(xml, callback, options);
46490                             }
46491                         }
46492                     }
46493                 }
46494
46495                 if (this.authenticated()) {
46496                     return oauth.xhr({ method: 'GET', path: path }, done);
46497                 } else {
46498                     var url = urlroot + path;
46499                     var controller = new AbortController();
46500                     d3_xml(url, { signal: controller.signal })
46501                         .then(function(data) {
46502                             done(null, data);
46503                         })
46504                         .catch(function(err) {
46505                             if (err.name === 'AbortError') return;
46506                             // d3-fetch includes status in the error message,
46507                             // but we can't access the response itself
46508                             // https://github.com/d3/d3-fetch/issues/27
46509                             var match = err.message.match(/^\d{3}/);
46510                             if (match) {
46511                                 done({ status: +match[0], statusText: err.message });
46512                             } else {
46513                                 done(err.message);
46514                             }
46515                         });
46516                     return controller;
46517                 }
46518             },
46519
46520
46521             // Load a single entity by id (ways and relations use the `/full` call)
46522             // GET /api/0.6/node/#id
46523             // GET /api/0.6/[way|relation]/#id/full
46524             loadEntity: function(id, callback) {
46525                 var type = osmEntity.id.type(id);
46526                 var osmID = osmEntity.id.toOSM(id);
46527                 var options = { skipSeen: false };
46528
46529                 this.loadFromAPI(
46530                     '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
46531                     function(err, entities) {
46532                         if (callback) callback(err, { data: entities });
46533                     },
46534                     options
46535                 );
46536             },
46537
46538
46539             // Load a single entity with a specific version
46540             // GET /api/0.6/[node|way|relation]/#id/#version
46541             loadEntityVersion: function(id, version, callback) {
46542                 var type = osmEntity.id.type(id);
46543                 var osmID = osmEntity.id.toOSM(id);
46544                 var options = { skipSeen: false };
46545
46546                 this.loadFromAPI(
46547                     '/api/0.6/' + type + '/' + osmID + '/' + version,
46548                     function(err, entities) {
46549                         if (callback) callback(err, { data: entities });
46550                     },
46551                     options
46552                 );
46553             },
46554
46555
46556             // Load multiple entities in chunks
46557             // (note: callback may be called multiple times)
46558             // GET /api/0.6/[nodes|ways|relations]?#parameters
46559             loadMultiple: function(ids, callback) {
46560                 var that = this;
46561                 var groups = utilArrayGroupBy(utilArrayUniq(ids), osmEntity.id.type);
46562
46563                 Object.keys(groups).forEach(function(k) {
46564                     var type = k + 's';   // nodes, ways, relations
46565                     var osmIDs = groups[k].map(function(id) { return osmEntity.id.toOSM(id); });
46566                     var options = { skipSeen: false };
46567
46568                     utilArrayChunk(osmIDs, 150).forEach(function(arr) {
46569                         that.loadFromAPI(
46570                             '/api/0.6/' + type + '?' + type + '=' + arr.join(),
46571                             function(err, entities) {
46572                                 if (callback) callback(err, { data: entities });
46573                             },
46574                             options
46575                         );
46576                     });
46577                 });
46578             },
46579
46580
46581             // Create, upload, and close a changeset
46582             // PUT /api/0.6/changeset/create
46583             // POST /api/0.6/changeset/#id/upload
46584             // PUT /api/0.6/changeset/#id/close
46585             putChangeset: function(changeset, changes, callback) {
46586                 var cid = _connectionID;
46587
46588                 if (_changeset.inflight) {
46589                     return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
46590
46591                 } else if (_changeset.open) {   // reuse existing open changeset..
46592                     return createdChangeset.call(this, null, _changeset.open);
46593
46594                 } else {   // Open a new changeset..
46595                     var options = {
46596                         method: 'PUT',
46597                         path: '/api/0.6/changeset/create',
46598                         options: { header: { 'Content-Type': 'text/xml' } },
46599                         content: JXON.stringify(changeset.asJXON())
46600                     };
46601                     _changeset.inflight = oauth.xhr(
46602                         options,
46603                         wrapcb(this, createdChangeset, cid)
46604                     );
46605                 }
46606
46607
46608                 function createdChangeset(err, changesetID) {
46609                     _changeset.inflight = null;
46610                     if (err) { return callback(err, changeset); }
46611
46612                     _changeset.open = changesetID;
46613                     changeset = changeset.update({ id: changesetID });
46614
46615                     // Upload the changeset..
46616                     var options = {
46617                         method: 'POST',
46618                         path: '/api/0.6/changeset/' + changesetID + '/upload',
46619                         options: { header: { 'Content-Type': 'text/xml' } },
46620                         content: JXON.stringify(changeset.osmChangeJXON(changes))
46621                     };
46622                     _changeset.inflight = oauth.xhr(
46623                         options,
46624                         wrapcb(this, uploadedChangeset, cid)
46625                     );
46626                 }
46627
46628
46629                 function uploadedChangeset(err) {
46630                     _changeset.inflight = null;
46631                     if (err) return callback(err, changeset);
46632
46633                     // Upload was successful, safe to call the callback.
46634                     // Add delay to allow for postgres replication #1646 #2678
46635                     window.setTimeout(function() { callback(null, changeset); }, 2500);
46636                     _changeset.open = null;
46637
46638                     // At this point, we don't really care if the connection was switched..
46639                     // Only try to close the changeset if we're still talking to the same server.
46640                     if (this.getConnectionId() === cid) {
46641                         // Still attempt to close changeset, but ignore response because #2667
46642                         oauth.xhr({
46643                             method: 'PUT',
46644                             path: '/api/0.6/changeset/' + changeset.id + '/close',
46645                             options: { header: { 'Content-Type': 'text/xml' } }
46646                         }, function() { return true; });
46647                     }
46648                 }
46649             },
46650
46651
46652             // Load multiple users in chunks
46653             // (note: callback may be called multiple times)
46654             // GET /api/0.6/users?users=#id1,#id2,...,#idn
46655             loadUsers: function(uids, callback) {
46656                 var toLoad = [];
46657                 var cached = [];
46658
46659                 utilArrayUniq(uids).forEach(function(uid) {
46660                     if (_userCache.user[uid]) {
46661                         delete _userCache.toLoad[uid];
46662                         cached.push(_userCache.user[uid]);
46663                     } else {
46664                         toLoad.push(uid);
46665                     }
46666                 });
46667
46668                 if (cached.length || !this.authenticated()) {
46669                     callback(undefined, cached);
46670                     if (!this.authenticated()) return;  // require auth
46671                 }
46672
46673                 utilArrayChunk(toLoad, 150).forEach(function(arr) {
46674                     oauth.xhr(
46675                         { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
46676                         wrapcb(this, done, _connectionID)
46677                     );
46678                 }.bind(this));
46679
46680                 function done(err, xml) {
46681                     if (err) { return callback(err); }
46682
46683                     var options = { skipSeen: true };
46684                     return parseXML(xml, function(err, results) {
46685                         if (err) {
46686                             return callback(err);
46687                         } else {
46688                             return callback(undefined, results);
46689                         }
46690                     }, options);
46691                 }
46692             },
46693
46694
46695             // Load a given user by id
46696             // GET /api/0.6/user/#id
46697             loadUser: function(uid, callback) {
46698                 if (_userCache.user[uid] || !this.authenticated()) {   // require auth
46699                     delete _userCache.toLoad[uid];
46700                     return callback(undefined, _userCache.user[uid]);
46701                 }
46702
46703                 oauth.xhr(
46704                     { method: 'GET', path: '/api/0.6/user/' + uid },
46705                     wrapcb(this, done, _connectionID)
46706                 );
46707
46708                 function done(err, xml) {
46709                     if (err) { return callback(err); }
46710
46711                     var options = { skipSeen: true };
46712                     return parseXML(xml, function(err, results) {
46713                         if (err) {
46714                             return callback(err);
46715                         } else {
46716                             return callback(undefined, results[0]);
46717                         }
46718                     }, options);
46719                 }
46720             },
46721
46722
46723             // Load the details of the logged-in user
46724             // GET /api/0.6/user/details
46725             userDetails: function(callback) {
46726                 if (_userDetails) {    // retrieve cached
46727                     return callback(undefined, _userDetails);
46728                 }
46729
46730                 oauth.xhr(
46731                     { method: 'GET', path: '/api/0.6/user/details' },
46732                     wrapcb(this, done, _connectionID)
46733                 );
46734
46735                 function done(err, xml) {
46736                     if (err) { return callback(err); }
46737
46738                     var options = { skipSeen: false };
46739                     return parseXML(xml, function(err, results) {
46740                         if (err) {
46741                             return callback(err);
46742                         } else {
46743                             _userDetails = results[0];
46744                             return callback(undefined, _userDetails);
46745                         }
46746                     }, options);
46747                 }
46748             },
46749
46750
46751             // Load previous changesets for the logged in user
46752             // GET /api/0.6/changesets?user=#id
46753             userChangesets: function(callback) {
46754                 if (_userChangesets) {    // retrieve cached
46755                     return callback(undefined, _userChangesets);
46756                 }
46757
46758                 this.userDetails(
46759                     wrapcb(this, gotDetails, _connectionID)
46760                 );
46761
46762
46763                 function gotDetails(err, user) {
46764                     if (err) { return callback(err); }
46765
46766                     oauth.xhr(
46767                         { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
46768                         wrapcb(this, done, _connectionID)
46769                     );
46770                 }
46771
46772                 function done(err, xml) {
46773                     if (err) { return callback(err); }
46774
46775                     _userChangesets = Array.prototype.map.call(
46776                         xml.getElementsByTagName('changeset'),
46777                         function (changeset) { return { tags: getTags(changeset) }; }
46778                     ).filter(function (changeset) {
46779                         var comment = changeset.tags.comment;
46780                         return comment && comment !== '';
46781                     });
46782
46783                     return callback(undefined, _userChangesets);
46784                 }
46785             },
46786
46787
46788             // Fetch the status of the OSM API
46789             // GET /api/capabilities
46790             status: function(callback) {
46791                 var url = urlroot + '/api/capabilities';
46792                 var errback = wrapcb(this, done, _connectionID);
46793                 d3_xml(url)
46794                     .then(function(data) { errback(null, data); })
46795                     .catch(function(err) { errback(err.message); });
46796
46797                 function done(err, xml) {
46798                     if (err) { return callback(err); }
46799
46800                     // update blacklists
46801                     var elements = xml.getElementsByTagName('blacklist');
46802                     var regexes = [];
46803                     for (var i = 0; i < elements.length; i++) {
46804                         var regex = elements[i].getAttribute('regex');  // needs unencode?
46805                         if (regex) {
46806                             regexes.push(regex);
46807                         }
46808                     }
46809                     if (regexes.length) {
46810                         _blacklists = regexes;
46811                     }
46812
46813                     if (_rateLimitError) {
46814                         return callback(_rateLimitError, 'rateLimited');
46815                     } else {
46816                         var apiStatus = xml.getElementsByTagName('status');
46817                         var val = apiStatus[0].getAttribute('api');
46818                         return callback(undefined, val);
46819                     }
46820                 }
46821             },
46822
46823
46824             // Load data (entities) from the API in tiles
46825             // GET /api/0.6/map?bbox=
46826             loadTiles: function(projection, callback) {
46827                 if (_off) return;
46828
46829                 // determine the needed tiles to cover the view
46830                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46831
46832                 // abort inflight requests that are no longer needed
46833                 var hadRequests = hasInflightRequests(_tileCache);
46834                 abortUnwantedRequests$2(_tileCache, tiles);
46835                 if (hadRequests && !hasInflightRequests(_tileCache)) {
46836                     dispatch$5.call('loaded');    // stop the spinner
46837                 }
46838
46839                 // issue new requests..
46840                 tiles.forEach(function(tile) {
46841                     this.loadTile(tile, callback);
46842                 }, this);
46843             },
46844
46845
46846             // Load a single data tile
46847             // GET /api/0.6/map?bbox=
46848             loadTile: function(tile, callback) {
46849                 if (_off) return;
46850                 if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46851
46852                 if (!hasInflightRequests(_tileCache)) {
46853                     dispatch$5.call('loading');   // start the spinner
46854                 }
46855
46856                 var path = '/api/0.6/map?bbox=';
46857                 var options = { skipSeen: true };
46858
46859                 _tileCache.inflight[tile.id] = this.loadFromAPI(
46860                     path + tile.extent.toParam(),
46861                     function(err, parsed) {
46862                         delete _tileCache.inflight[tile.id];
46863                         if (!err) {
46864                             delete _tileCache.toLoad[tile.id];
46865                             _tileCache.loaded[tile.id] = true;
46866                             var bbox = tile.extent.bbox();
46867                             bbox.id = tile.id;
46868                             _tileCache.rtree.insert(bbox);
46869                         }
46870                         if (callback) {
46871                             callback(err, Object.assign({ data: parsed }, tile));
46872                         }
46873                         if (!hasInflightRequests(_tileCache)) {
46874                             dispatch$5.call('loaded');     // stop the spinner
46875                         }
46876                     },
46877                     options
46878                 );
46879             },
46880
46881
46882             isDataLoaded: function(loc) {
46883                 var bbox = { minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1] };
46884                 return _tileCache.rtree.collides(bbox);
46885             },
46886
46887
46888             // load the tile that covers the given `loc`
46889             loadTileAtLoc: function(loc, callback) {
46890                 // Back off if the toLoad queue is filling up.. re #6417
46891                 // (Currently `loadTileAtLoc` requests are considered low priority - used by operations to
46892                 // let users safely edit geometries which extend to unloaded tiles.  We can drop some.)
46893                 if (Object.keys(_tileCache.toLoad).length > 50) return;
46894
46895                 var k = geoZoomToScale(_tileZoom + 1);
46896                 var offset = geoRawMercator().scale(k)(loc);
46897                 var projection = geoRawMercator().transform({ k: k, x: -offset[0], y: -offset[1] });
46898                 var tiles = tiler$4.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
46899
46900                 tiles.forEach(function(tile) {
46901                     if (_tileCache.toLoad[tile.id] || _tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
46902
46903                     _tileCache.toLoad[tile.id] = true;
46904                     this.loadTile(tile, callback);
46905                 }, this);
46906             },
46907
46908
46909             // Load notes from the API in tiles
46910             // GET /api/0.6/notes?bbox=
46911             loadNotes: function(projection, noteOptions) {
46912                 noteOptions = Object.assign({ limit: 10000, closed: 7 }, noteOptions);
46913                 if (_off) return;
46914
46915                 var that = this;
46916                 var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
46917                 var throttleLoadUsers = throttle(function() {
46918                     var uids = Object.keys(_userCache.toLoad);
46919                     if (!uids.length) return;
46920                     that.loadUsers(uids, function() {});  // eagerly load user details
46921                 }, 750);
46922
46923                 // determine the needed tiles to cover the view
46924                 var tiles = tiler$4.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
46925
46926                 // abort inflight requests that are no longer needed
46927                 abortUnwantedRequests$2(_noteCache, tiles);
46928
46929                 // issue new requests..
46930                 tiles.forEach(function(tile) {
46931                     if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
46932
46933                     var options = { skipSeen: false };
46934                     _noteCache.inflight[tile.id] = that.loadFromAPI(
46935                         path + tile.extent.toParam(),
46936                         function(err) {
46937                             delete _noteCache.inflight[tile.id];
46938                             if (!err) {
46939                                 _noteCache.loaded[tile.id] = true;
46940                             }
46941                             throttleLoadUsers();
46942                             dispatch$5.call('loadedNotes');
46943                         },
46944                         options
46945                     );
46946                 });
46947             },
46948
46949
46950             // Create a note
46951             // POST /api/0.6/notes?params
46952             postNoteCreate: function(note, callback) {
46953                 if (!this.authenticated()) {
46954                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46955                 }
46956                 if (_noteCache.inflightPost[note.id]) {
46957                     return callback({ message: 'Note update already inflight', status: -2 }, note);
46958                 }
46959
46960                 if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
46961
46962                 var comment = note.newComment;
46963                 if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
46964
46965                 var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
46966
46967                 _noteCache.inflightPost[note.id] = oauth.xhr(
46968                     { method: 'POST', path: path },
46969                     wrapcb(this, done, _connectionID)
46970                 );
46971
46972
46973                 function done(err, xml) {
46974                     delete _noteCache.inflightPost[note.id];
46975                     if (err) { return callback(err); }
46976
46977                     // we get the updated note back, remove from caches and reparse..
46978                     this.removeNote(note);
46979
46980                     var options = { skipSeen: false };
46981                     return parseXML(xml, function(err, results) {
46982                         if (err) {
46983                             return callback(err);
46984                         } else {
46985                             return callback(undefined, results[0]);
46986                         }
46987                     }, options);
46988                 }
46989             },
46990
46991
46992             // Update a note
46993             // POST /api/0.6/notes/#id/comment?text=comment
46994             // POST /api/0.6/notes/#id/close?text=comment
46995             // POST /api/0.6/notes/#id/reopen?text=comment
46996             postNoteUpdate: function(note, newStatus, callback) {
46997                 if (!this.authenticated()) {
46998                     return callback({ message: 'Not Authenticated', status: -3 }, note);
46999                 }
47000                 if (_noteCache.inflightPost[note.id]) {
47001                     return callback({ message: 'Note update already inflight', status: -2 }, note);
47002                 }
47003
47004                 var action;
47005                 if (note.status !== 'closed' && newStatus === 'closed') {
47006                     action = 'close';
47007                 } else if (note.status !== 'open' && newStatus === 'open') {
47008                     action = 'reopen';
47009                 } else {
47010                     action = 'comment';
47011                     if (!note.newComment) return; // when commenting, comment required
47012                 }
47013
47014                 var path = '/api/0.6/notes/' + note.id + '/' + action;
47015                 if (note.newComment) {
47016                     path += '?' + utilQsString({ text: note.newComment });
47017                 }
47018
47019                 _noteCache.inflightPost[note.id] = oauth.xhr(
47020                     { method: 'POST', path: path },
47021                     wrapcb(this, done, _connectionID)
47022                 );
47023
47024
47025                 function done(err, xml) {
47026                     delete _noteCache.inflightPost[note.id];
47027                     if (err) { return callback(err); }
47028
47029                     // we get the updated note back, remove from caches and reparse..
47030                     this.removeNote(note);
47031
47032                     // update closed note cache - used to populate `closed:note` changeset tag
47033                     if (action === 'close') {
47034                         _noteCache.closed[note.id] = true;
47035                     } else if (action === 'reopen') {
47036                         delete _noteCache.closed[note.id];
47037                     }
47038
47039                     var options = { skipSeen: false };
47040                     return parseXML(xml, function(err, results) {
47041                         if (err) {
47042                             return callback(err);
47043                         } else {
47044                             return callback(undefined, results[0]);
47045                         }
47046                     }, options);
47047                 }
47048             },
47049
47050
47051             switch: function(options) {
47052                 urlroot = options.urlroot;
47053
47054                 oauth.options(Object.assign({
47055                     url: urlroot,
47056                     loading: authLoading,
47057                     done: authDone
47058                 }, options));
47059
47060                 this.reset();
47061                 this.userChangesets(function() {});  // eagerly load user details/changesets
47062                 dispatch$5.call('change');
47063                 return this;
47064             },
47065
47066
47067             toggle: function(val) {
47068                 _off = !val;
47069                 return this;
47070             },
47071
47072
47073             isChangesetInflight: function() {
47074                 return !!_changeset.inflight;
47075             },
47076
47077
47078             // get/set cached data
47079             // This is used to save/restore the state when entering/exiting the walkthrough
47080             // Also used for testing purposes.
47081             caches: function(obj) {
47082                 function cloneCache(source) {
47083                     var target = {};
47084                     Object.keys(source).forEach(function(k) {
47085                         if (k === 'rtree') {
47086                             target.rtree = rbush_1().fromJSON(source.rtree.toJSON());  // clone rbush
47087                         } else if (k === 'note') {
47088                             target.note = {};
47089                             Object.keys(source.note).forEach(function(id) {
47090                                 target.note[id] = osmNote(source.note[id]);   // copy notes
47091                             });
47092                         } else {
47093                             target[k] = JSON.parse(JSON.stringify(source[k]));   // clone deep
47094                         }
47095                     });
47096                     return target;
47097                 }
47098
47099                 if (!arguments.length) {
47100                     return {
47101                         tile: cloneCache(_tileCache),
47102                         note: cloneCache(_noteCache),
47103                         user: cloneCache(_userCache)
47104                     };
47105                 }
47106
47107                 // access caches directly for testing (e.g., loading notes rtree)
47108                 if (obj === 'get') {
47109                     return {
47110                         tile: _tileCache,
47111                         note: _noteCache,
47112                         user: _userCache
47113                     };
47114                 }
47115
47116                 if (obj.tile) {
47117                     _tileCache = obj.tile;
47118                     _tileCache.inflight = {};
47119                 }
47120                 if (obj.note) {
47121                     _noteCache = obj.note;
47122                     _noteCache.inflight = {};
47123                     _noteCache.inflightPost = {};
47124                 }
47125                 if (obj.user) {
47126                     _userCache = obj.user;
47127                 }
47128
47129                 return this;
47130             },
47131
47132
47133             logout: function() {
47134                 _userChangesets = undefined;
47135                 _userDetails = undefined;
47136                 oauth.logout();
47137                 dispatch$5.call('change');
47138                 return this;
47139             },
47140
47141
47142             authenticated: function() {
47143                 return oauth.authenticated();
47144             },
47145
47146
47147             authenticate: function(callback) {
47148                 var that = this;
47149                 var cid = _connectionID;
47150                 _userChangesets = undefined;
47151                 _userDetails = undefined;
47152
47153                 function done(err, res) {
47154                     if (err) {
47155                         if (callback) callback(err);
47156                         return;
47157                     }
47158                     if (that.getConnectionId() !== cid) {
47159                         if (callback) callback({ message: 'Connection Switched', status: -1 });
47160                         return;
47161                     }
47162                     _rateLimitError = undefined;
47163                     dispatch$5.call('change');
47164                     if (callback) callback(err, res);
47165                     that.userChangesets(function() {});  // eagerly load user details/changesets
47166                 }
47167
47168                 return oauth.authenticate(done);
47169             },
47170
47171
47172             imageryBlacklists: function() {
47173                 return _blacklists;
47174             },
47175
47176
47177             tileZoom: function(val) {
47178                 if (!arguments.length) return _tileZoom;
47179                 _tileZoom = val;
47180                 return this;
47181             },
47182
47183
47184             // get all cached notes covering the viewport
47185             notes: function(projection) {
47186                 var viewport = projection.clipExtent();
47187                 var min = [viewport[0][0], viewport[1][1]];
47188                 var max = [viewport[1][0], viewport[0][1]];
47189                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
47190
47191                 return _noteCache.rtree.search(bbox)
47192                     .map(function(d) { return d.data; });
47193             },
47194
47195
47196             // get a single note from the cache
47197             getNote: function(id) {
47198                 return _noteCache.note[id];
47199             },
47200
47201
47202             // remove a single note from the cache
47203             removeNote: function(note) {
47204                 if (!(note instanceof osmNote) || !note.id) return;
47205
47206                 delete _noteCache.note[note.id];
47207                 updateRtree$2(encodeNoteRtree(note), false);  // false = remove
47208             },
47209
47210
47211             // replace a single note in the cache
47212             replaceNote: function(note) {
47213                 if (!(note instanceof osmNote) || !note.id) return;
47214
47215                 _noteCache.note[note.id] = note;
47216                 updateRtree$2(encodeNoteRtree(note), true);  // true = replace
47217                 return note;
47218             },
47219
47220
47221             // Get an array of note IDs closed during this session.
47222             // Used to populate `closed:note` changeset tag
47223             getClosedIDs: function() {
47224                 return Object.keys(_noteCache.closed).sort();
47225             }
47226
47227         };
47228
47229         var apibase$3 = 'https://wiki.openstreetmap.org/w/api.php';
47230         var _inflight$1 = {};
47231         var _wikibaseCache = {};
47232         var _localeIDs = { en: false };
47233
47234
47235         var debouncedRequest = debounce(request, 500, { leading: false });
47236
47237         function request(url, callback) {
47238             if (_inflight$1[url]) return;
47239             var controller = new AbortController();
47240             _inflight$1[url] = controller;
47241
47242             d3_json(url, { signal: controller.signal })
47243                 .then(function(result) {
47244                     delete _inflight$1[url];
47245                     if (callback) callback(null, result);
47246                 })
47247                 .catch(function(err) {
47248                     delete _inflight$1[url];
47249                     if (err.name === 'AbortError') return;
47250                     if (callback) callback(err.message);
47251                 });
47252         }
47253
47254
47255         /**
47256          * Get the best string value from the descriptions/labels result
47257          * Note that if mediawiki doesn't recognize language code, it will return all values.
47258          * In that case, fallback to use English.
47259          * @param values object - either descriptions or labels
47260          * @param langCode String
47261          * @returns localized string
47262          */
47263         function localizedToString(values, langCode) {
47264             if (values) {
47265                 values = values[langCode] || values.en;
47266             }
47267             return values ? values.value : '';
47268         }
47269
47270
47271         var serviceOsmWikibase = {
47272
47273             init: function() {
47274                 _inflight$1 = {};
47275                 _wikibaseCache = {};
47276                 _localeIDs = {};
47277             },
47278
47279
47280             reset: function() {
47281                 Object.values(_inflight$1).forEach(function(controller) { controller.abort(); });
47282                 _inflight$1 = {};
47283             },
47284
47285
47286             /**
47287              * Get the best value for the property, or undefined if not found
47288              * @param entity object from wikibase
47289              * @param property string e.g. 'P4' for image
47290              * @param langCode string e.g. 'fr' for French
47291              */
47292             claimToValue: function(entity, property, langCode) {
47293                 if (!entity.claims[property]) return undefined;
47294                 var locale = _localeIDs[langCode];
47295                 var preferredPick, localePick;
47296
47297                 entity.claims[property].forEach(function(stmt) {
47298                     // If exists, use value limited to the needed language (has a qualifier P26 = locale)
47299                     // Or if not found, use the first value with the "preferred" rank
47300                     if (!preferredPick && stmt.rank === 'preferred') {
47301                         preferredPick = stmt;
47302                     }
47303                     if (locale && stmt.qualifiers && stmt.qualifiers.P26 &&
47304                         stmt.qualifiers.P26[0].datavalue.value.id === locale
47305                     ) {
47306                         localePick = stmt;
47307                     }
47308                 });
47309
47310                 var result = localePick || preferredPick;
47311                 if (result) {
47312                     var datavalue = result.mainsnak.datavalue;
47313                     return datavalue.type === 'wikibase-entityid' ? datavalue.value.id : datavalue.value;
47314                 } else {
47315                     return undefined;
47316                 }
47317             },
47318
47319
47320             /**
47321              * Convert monolingual property into a key-value object (language -> value)
47322              * @param entity object from wikibase
47323              * @param property string e.g. 'P31' for monolingual wiki page title
47324              */
47325             monolingualClaimToValueObj: function(entity, property) {
47326                 if (!entity || !entity.claims[property]) return undefined;
47327
47328                 return entity.claims[property].reduce(function(acc, obj) {
47329                     var value = obj.mainsnak.datavalue.value;
47330                     acc[value.language] = value.text;
47331                     return acc;
47332                 }, {});
47333             },
47334
47335
47336             toSitelink: function(key, value) {
47337                 var result = value ? ('Tag:' + key + '=' + value) : 'Key:' + key;
47338                 return result.replace(/_/g, ' ').trim();
47339             },
47340
47341
47342             //
47343             // Pass params object of the form:
47344             // {
47345             //   key: 'string',
47346             //   value: 'string',
47347             //   rtype: 'string',
47348             //   langCode: 'string'
47349             // }
47350             //
47351             getEntity: function(params, callback) {
47352                 var doRequest = params.debounce ? debouncedRequest : request;
47353                 var that = this;
47354                 var titles = [];
47355                 var result = {};
47356                 var rtypeSitelink = params.rtype ? ('Relation:' + params.rtype).replace(/_/g, ' ').trim() : false;
47357                 var keySitelink = params.key ? this.toSitelink(params.key) : false;
47358                 var tagSitelink = (params.key && params.value) ? this.toSitelink(params.key, params.value) : false;
47359                 var localeSitelink;
47360
47361                 if (params.langCode && _localeIDs[params.langCode] === undefined) {
47362                     // If this is the first time we are asking about this locale,
47363                     // fetch corresponding entity (if it exists), and cache it.
47364                     // If there is no such entry, cache `false` value to avoid re-requesting it.
47365                     localeSitelink = ('Locale:' + params.langCode).replace(/_/g, ' ').trim();
47366                     titles.push(localeSitelink);
47367                 }
47368
47369                 if (rtypeSitelink) {
47370                     if (_wikibaseCache[rtypeSitelink]) {
47371                         result.rtype = _wikibaseCache[rtypeSitelink];
47372                     } else {
47373                         titles.push(rtypeSitelink);
47374                     }
47375                 }
47376
47377                 if (keySitelink) {
47378                     if (_wikibaseCache[keySitelink]) {
47379                         result.key = _wikibaseCache[keySitelink];
47380                     } else {
47381                         titles.push(keySitelink);
47382                     }
47383                 }
47384
47385                 if (tagSitelink) {
47386                     if (_wikibaseCache[tagSitelink]) {
47387                         result.tag = _wikibaseCache[tagSitelink];
47388                     } else {
47389                         titles.push(tagSitelink);
47390                     }
47391                 }
47392
47393                 if (!titles.length) {
47394                     // Nothing to do, we already had everything in the cache
47395                     return callback(null, result);
47396                 }
47397
47398                 // Requesting just the user language code
47399                 // If backend recognizes the code, it will perform proper fallbacks,
47400                 // and the result will contain the requested code. If not, all values are returned:
47401                 // {"zh-tw":{"value":"...","language":"zh-tw","source-language":"zh-hant"}
47402                 // {"pt-br":{"value":"...","language":"pt","for-language":"pt-br"}}
47403                 var obj = {
47404                     action: 'wbgetentities',
47405                     sites: 'wiki',
47406                     titles: titles.join('|'),
47407                     languages: params.langCode,
47408                     languagefallback: 1,
47409                     origin: '*',
47410                     format: 'json',
47411                     // There is an MW Wikibase API bug https://phabricator.wikimedia.org/T212069
47412                     // We shouldn't use v1 until it gets fixed, but should switch to it afterwards
47413                     // formatversion: 2,
47414                 };
47415
47416                 var url = apibase$3 + '?' + utilQsString(obj);
47417                 doRequest(url, function(err, d) {
47418                     if (err) {
47419                         callback(err);
47420                     } else if (!d.success || d.error) {
47421                         callback(d.error.messages.map(function(v) { return v.html['*']; }).join('<br>'));
47422                     } else {
47423                         var localeID = false;
47424                         Object.values(d.entities).forEach(function(res) {
47425                             if (res.missing !== '') {
47426                                 // Simplify access to the localized values
47427                                 res.description = localizedToString(res.descriptions, params.langCode);
47428                                 res.label = localizedToString(res.labels, params.langCode);
47429
47430                                 var title = res.sitelinks.wiki.title;
47431                                 if (title === rtypeSitelink) {
47432                                     _wikibaseCache[rtypeSitelink] = res;
47433                                     result.rtype = res;
47434                                 } else if (title === keySitelink) {
47435                                     _wikibaseCache[keySitelink] = res;
47436                                     result.key = res;
47437                                 } else if (title === tagSitelink) {
47438                                     _wikibaseCache[tagSitelink] = res;
47439                                     result.tag = res;
47440                                 } else if (title === localeSitelink) {
47441                                     localeID = res.id;
47442                                 } else {
47443                                     console.log('Unexpected title ' + title);  // eslint-disable-line no-console
47444                                 }
47445                             }
47446                         });
47447
47448                         if (localeSitelink) {
47449                             // If locale ID is not found, store false to prevent repeated queries
47450                             that.addLocale(params.langCode, localeID);
47451                         }
47452
47453                         callback(null, result);
47454                     }
47455                 });
47456             },
47457
47458
47459             //
47460             // Pass params object of the form:
47461             // {
47462             //   key: 'string',     // required
47463             //   value: 'string'    // optional
47464             // }
47465             //   -or-
47466             // {
47467             //   rtype: 'rtype'     // relation type  (e.g. 'multipolygon')
47468             // }
47469             //
47470             // Get an result object used to display tag documentation
47471             // {
47472             //   title:        'string',
47473             //   description:  'string',
47474             //   editURL:      'string',
47475             //   imageURL:     'string',
47476             //   wiki:         { title: 'string', text: 'string', url: 'string' }
47477             // }
47478             //
47479             getDocs: function(params, callback) {
47480                 var that = this;
47481                 var langCode = utilDetect().locale.toLowerCase();
47482                 params.langCode = langCode;
47483
47484                 this.getEntity(params, function(err, data) {
47485                     if (err) {
47486                         callback(err);
47487                         return;
47488                     }
47489
47490                     var entity = data.rtype || data.tag || data.key;
47491                     if (!entity) {
47492                         callback('No entity');
47493                         return;
47494                     }
47495
47496                     // prepare result
47497                     var result = {
47498                         title: entity.title,
47499                         description: entity.description,
47500                         editURL: 'https://wiki.openstreetmap.org/wiki/' + entity.title
47501                     };
47502
47503                     // add image
47504                     if (entity.claims) {
47505                         var imageroot;
47506                         var image = that.claimToValue(entity, 'P4', langCode);
47507                         if (image) {
47508                             imageroot = 'https://commons.wikimedia.org/w/index.php';
47509                         } else {
47510                             image = that.claimToValue(entity, 'P28', langCode);
47511                             if (image) {
47512                                 imageroot = 'https://wiki.openstreetmap.org/w/index.php';
47513                             }
47514                         }
47515                         if (imageroot && image) {
47516                             result.imageURL = imageroot + '?' + utilQsString({
47517                                 title: 'Special:Redirect/file/' + image,
47518                                 width: 400
47519                             });
47520                         }
47521                     }
47522
47523                     // Try to get a wiki page from tag data item first, followed by the corresponding key data item.
47524                     // If neither tag nor key data item contain a wiki page in the needed language nor English,
47525                     // get the first found wiki page from either the tag or the key item.
47526                     var rtypeWiki = that.monolingualClaimToValueObj(data.rtype, 'P31');
47527                     var tagWiki = that.monolingualClaimToValueObj(data.tag, 'P31');
47528                     var keyWiki = that.monolingualClaimToValueObj(data.key, 'P31');
47529
47530                     // If exact language code does not exist, try to find the first part before the '-'
47531                     // BUG: in some cases, a more elaborate fallback logic might be needed
47532                     var langPrefix = langCode.split('-', 2)[0];
47533
47534                     // use the first acceptable wiki page
47535                     result.wiki =
47536                         getWikiInfo(rtypeWiki, langCode, 'inspector.wiki_reference') ||
47537                         getWikiInfo(rtypeWiki, langPrefix, 'inspector.wiki_reference') ||
47538                         getWikiInfo(rtypeWiki, 'en', 'inspector.wiki_en_reference') ||
47539                         getWikiInfo(tagWiki, langCode, 'inspector.wiki_reference') ||
47540                         getWikiInfo(tagWiki, langPrefix, 'inspector.wiki_reference') ||
47541                         getWikiInfo(tagWiki, 'en', 'inspector.wiki_en_reference') ||
47542                         getWikiInfo(keyWiki, langCode, 'inspector.wiki_reference') ||
47543                         getWikiInfo(keyWiki, langPrefix, 'inspector.wiki_reference') ||
47544                         getWikiInfo(keyWiki, 'en', 'inspector.wiki_en_reference');
47545
47546                     callback(null, result);
47547
47548
47549                     // Helper method to get wiki info if a given language exists
47550                     function getWikiInfo(wiki, langCode, tKey) {
47551                         if (wiki && wiki[langCode]) {
47552                             return {
47553                                 title: wiki[langCode],
47554                                 text: tKey,
47555                                 url: 'https://wiki.openstreetmap.org/wiki/' + wiki[langCode]
47556                             };
47557                         }
47558                     }
47559                 });
47560             },
47561
47562
47563             addLocale: function(langCode, qid) {
47564                 // Makes it easier to unit test
47565                 _localeIDs[langCode] = qid;
47566             },
47567
47568
47569             apibase: function(val) {
47570                 if (!arguments.length) return apibase$3;
47571                 apibase$3 = val;
47572                 return this;
47573             }
47574
47575         };
47576
47577         var jsonpCache = {};
47578         window.jsonpCache = jsonpCache;
47579
47580         function jsonpRequest(url, callback) {
47581             var request = {
47582                 abort: function() {}
47583             };
47584
47585             if (window.JSONP_FIX) {
47586                 if (window.JSONP_DELAY === 0) {
47587                     callback(window.JSONP_FIX);
47588                 } else {
47589                     var t = window.setTimeout(function() {
47590                         callback(window.JSONP_FIX);
47591                     }, window.JSONP_DELAY || 0);
47592
47593                     request.abort = function() { window.clearTimeout(t); };
47594                 }
47595
47596                 return request;
47597             }
47598
47599             function rand() {
47600                 var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
47601                 var c = '';
47602                 var i = -1;
47603                 while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
47604                 return c;
47605             }
47606
47607             function create(url) {
47608                 var e = url.match(/callback=(\w+)/);
47609                 var c = e ? e[1] : rand();
47610
47611                 jsonpCache[c] = function(data) {
47612                     if (jsonpCache[c]) {
47613                         callback(data);
47614                     }
47615                     finalize();
47616                 };
47617
47618                 function finalize() {
47619                     delete jsonpCache[c];
47620                     script.remove();
47621                 }
47622
47623                 request.abort = finalize;
47624                 return 'jsonpCache.' + c;
47625             }
47626
47627             var cb = create(url);
47628
47629             var script = d3_select('head')
47630                 .append('script')
47631                 .attr('type', 'text/javascript')
47632                 .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
47633
47634             return request;
47635         }
47636
47637         var q = createCommonjsModule(function (module, exports) {
47638         // vim:ts=4:sts=4:sw=4:
47639         /*!
47640          *
47641          * Copyright 2009-2017 Kris Kowal under the terms of the MIT
47642          * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
47643          *
47644          * With parts by Tyler Close
47645          * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
47646          * at http://www.opensource.org/licenses/mit-license.html
47647          * Forked at ref_send.js version: 2009-05-11
47648          *
47649          * With parts by Mark Miller
47650          * Copyright (C) 2011 Google Inc.
47651          *
47652          * Licensed under the Apache License, Version 2.0 (the "License");
47653          * you may not use this file except in compliance with the License.
47654          * You may obtain a copy of the License at
47655          *
47656          * http://www.apache.org/licenses/LICENSE-2.0
47657          *
47658          * Unless required by applicable law or agreed to in writing, software
47659          * distributed under the License is distributed on an "AS IS" BASIS,
47660          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47661          * See the License for the specific language governing permissions and
47662          * limitations under the License.
47663          *
47664          */
47665
47666         (function (definition) {
47667
47668             // This file will function properly as a <script> tag, or a module
47669             // using CommonJS and NodeJS or RequireJS module formats.  In
47670             // Common/Node/RequireJS, the module exports the Q API and when
47671             // executed as a simple <script>, it creates a Q global instead.
47672
47673             // Montage Require
47674             if (typeof bootstrap === "function") {
47675                 bootstrap("promise", definition);
47676
47677             // CommonJS
47678             } else {
47679                 module.exports = definition();
47680
47681             // RequireJS
47682             }
47683
47684         })(function () {
47685
47686         var hasStacks = false;
47687         try {
47688             throw new Error();
47689         } catch (e) {
47690             hasStacks = !!e.stack;
47691         }
47692
47693         // All code after this point will be filtered from stack traces reported
47694         // by Q.
47695         var qStartingLine = captureLine();
47696         var qFileName;
47697
47698         // shims
47699
47700         // used for fallback in "allResolved"
47701         var noop = function () {};
47702
47703         // Use the fastest possible means to execute a task in a future turn
47704         // of the event loop.
47705         var nextTick =(function () {
47706             // linked list of tasks (single, with head node)
47707             var head = {task: void 0, next: null};
47708             var tail = head;
47709             var flushing = false;
47710             var requestTick = void 0;
47711             var isNodeJS = false;
47712             // queue for late tasks, used by unhandled rejection tracking
47713             var laterQueue = [];
47714
47715             function flush() {
47716                 /* jshint loopfunc: true */
47717                 var task, domain;
47718
47719                 while (head.next) {
47720                     head = head.next;
47721                     task = head.task;
47722                     head.task = void 0;
47723                     domain = head.domain;
47724
47725                     if (domain) {
47726                         head.domain = void 0;
47727                         domain.enter();
47728                     }
47729                     runSingle(task, domain);
47730
47731                 }
47732                 while (laterQueue.length) {
47733                     task = laterQueue.pop();
47734                     runSingle(task);
47735                 }
47736                 flushing = false;
47737             }
47738             // runs a single function in the async queue
47739             function runSingle(task, domain) {
47740                 try {
47741                     task();
47742
47743                 } catch (e) {
47744                     if (isNodeJS) {
47745                         // In node, uncaught exceptions are considered fatal errors.
47746                         // Re-throw them synchronously to interrupt flushing!
47747
47748                         // Ensure continuation if the uncaught exception is suppressed
47749                         // listening "uncaughtException" events (as domains does).
47750                         // Continue in next event to avoid tick recursion.
47751                         if (domain) {
47752                             domain.exit();
47753                         }
47754                         setTimeout(flush, 0);
47755                         if (domain) {
47756                             domain.enter();
47757                         }
47758
47759                         throw e;
47760
47761                     } else {
47762                         // In browsers, uncaught exceptions are not fatal.
47763                         // Re-throw them asynchronously to avoid slow-downs.
47764                         setTimeout(function () {
47765                             throw e;
47766                         }, 0);
47767                     }
47768                 }
47769
47770                 if (domain) {
47771                     domain.exit();
47772                 }
47773             }
47774
47775             nextTick = function (task) {
47776                 tail = tail.next = {
47777                     task: task,
47778                     domain: isNodeJS && process.domain,
47779                     next: null
47780                 };
47781
47782                 if (!flushing) {
47783                     flushing = true;
47784                     requestTick();
47785                 }
47786             };
47787
47788             if (typeof process === "object" &&
47789                 process.toString() === "[object process]" && process.nextTick) {
47790                 // Ensure Q is in a real Node environment, with a `process.nextTick`.
47791                 // To see through fake Node environments:
47792                 // * Mocha test runner - exposes a `process` global without a `nextTick`
47793                 // * Browserify - exposes a `process.nexTick` function that uses
47794                 //   `setTimeout`. In this case `setImmediate` is preferred because
47795                 //    it is faster. Browserify's `process.toString()` yields
47796                 //   "[object Object]", while in a real Node environment
47797                 //   `process.toString()` yields "[object process]".
47798                 isNodeJS = true;
47799
47800                 requestTick = function () {
47801                     process.nextTick(flush);
47802                 };
47803
47804             } else if (typeof setImmediate === "function") {
47805                 // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
47806                 if (typeof window !== "undefined") {
47807                     requestTick = setImmediate.bind(window, flush);
47808                 } else {
47809                     requestTick = function () {
47810                         setImmediate(flush);
47811                     };
47812                 }
47813
47814             } else if (typeof MessageChannel !== "undefined") {
47815                 // modern browsers
47816                 // http://www.nonblocking.io/2011/06/windownexttick.html
47817                 var channel = new MessageChannel();
47818                 // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
47819                 // working message ports the first time a page loads.
47820                 channel.port1.onmessage = function () {
47821                     requestTick = requestPortTick;
47822                     channel.port1.onmessage = flush;
47823                     flush();
47824                 };
47825                 var requestPortTick = function () {
47826                     // Opera requires us to provide a message payload, regardless of
47827                     // whether we use it.
47828                     channel.port2.postMessage(0);
47829                 };
47830                 requestTick = function () {
47831                     setTimeout(flush, 0);
47832                     requestPortTick();
47833                 };
47834
47835             } else {
47836                 // old browsers
47837                 requestTick = function () {
47838                     setTimeout(flush, 0);
47839                 };
47840             }
47841             // runs a task after all other tasks have been run
47842             // this is useful for unhandled rejection tracking that needs to happen
47843             // after all `then`d tasks have been run.
47844             nextTick.runAfter = function (task) {
47845                 laterQueue.push(task);
47846                 if (!flushing) {
47847                     flushing = true;
47848                     requestTick();
47849                 }
47850             };
47851             return nextTick;
47852         })();
47853
47854         // Attempt to make generics safe in the face of downstream
47855         // modifications.
47856         // There is no situation where this is necessary.
47857         // If you need a security guarantee, these primordials need to be
47858         // deeply frozen anyway, and if you don’t need a security guarantee,
47859         // this is just plain paranoid.
47860         // However, this **might** have the nice side-effect of reducing the size of
47861         // the minified code by reducing x.call() to merely x()
47862         // See Mark Miller’s explanation of what this does.
47863         // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
47864         var call = Function.call;
47865         function uncurryThis(f) {
47866             return function () {
47867                 return call.apply(f, arguments);
47868             };
47869         }
47870         // This is equivalent, but slower:
47871         // uncurryThis = Function_bind.bind(Function_bind.call);
47872         // http://jsperf.com/uncurrythis
47873
47874         var array_slice = uncurryThis(Array.prototype.slice);
47875
47876         var array_reduce = uncurryThis(
47877             Array.prototype.reduce || function (callback, basis) {
47878                 var index = 0,
47879                     length = this.length;
47880                 // concerning the initial value, if one is not provided
47881                 if (arguments.length === 1) {
47882                     // seek to the first value in the array, accounting
47883                     // for the possibility that is is a sparse array
47884                     do {
47885                         if (index in this) {
47886                             basis = this[index++];
47887                             break;
47888                         }
47889                         if (++index >= length) {
47890                             throw new TypeError();
47891                         }
47892                     } while (1);
47893                 }
47894                 // reduce
47895                 for (; index < length; index++) {
47896                     // account for the possibility that the array is sparse
47897                     if (index in this) {
47898                         basis = callback(basis, this[index], index);
47899                     }
47900                 }
47901                 return basis;
47902             }
47903         );
47904
47905         var array_indexOf = uncurryThis(
47906             Array.prototype.indexOf || function (value) {
47907                 // not a very good shim, but good enough for our one use of it
47908                 for (var i = 0; i < this.length; i++) {
47909                     if (this[i] === value) {
47910                         return i;
47911                     }
47912                 }
47913                 return -1;
47914             }
47915         );
47916
47917         var array_map = uncurryThis(
47918             Array.prototype.map || function (callback, thisp) {
47919                 var self = this;
47920                 var collect = [];
47921                 array_reduce(self, function (undefined$1, value, index) {
47922                     collect.push(callback.call(thisp, value, index, self));
47923                 }, void 0);
47924                 return collect;
47925             }
47926         );
47927
47928         var object_create = Object.create || function (prototype) {
47929             function Type() { }
47930             Type.prototype = prototype;
47931             return new Type();
47932         };
47933
47934         var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
47935             obj[prop] = descriptor.value;
47936             return obj;
47937         };
47938
47939         var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
47940
47941         var object_keys = Object.keys || function (object) {
47942             var keys = [];
47943             for (var key in object) {
47944                 if (object_hasOwnProperty(object, key)) {
47945                     keys.push(key);
47946                 }
47947             }
47948             return keys;
47949         };
47950
47951         var object_toString = uncurryThis(Object.prototype.toString);
47952
47953         function isObject(value) {
47954             return value === Object(value);
47955         }
47956
47957         // generator related shims
47958
47959         // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
47960         function isStopIteration(exception) {
47961             return (
47962                 object_toString(exception) === "[object StopIteration]" ||
47963                 exception instanceof QReturnValue
47964             );
47965         }
47966
47967         // FIXME: Remove this helper and Q.return once ES6 generators are in
47968         // SpiderMonkey.
47969         var QReturnValue;
47970         if (typeof ReturnValue !== "undefined") {
47971             QReturnValue = ReturnValue;
47972         } else {
47973             QReturnValue = function (value) {
47974                 this.value = value;
47975             };
47976         }
47977
47978         // long stack traces
47979
47980         var STACK_JUMP_SEPARATOR = "From previous event:";
47981
47982         function makeStackTraceLong(error, promise) {
47983             // If possible, transform the error stack trace by removing Node and Q
47984             // cruft, then concatenating with the stack trace of `promise`. See #57.
47985             if (hasStacks &&
47986                 promise.stack &&
47987                 typeof error === "object" &&
47988                 error !== null &&
47989                 error.stack
47990             ) {
47991                 var stacks = [];
47992                 for (var p = promise; !!p; p = p.source) {
47993                     if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
47994                         object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
47995                         stacks.unshift(p.stack);
47996                     }
47997                 }
47998                 stacks.unshift(error.stack);
47999
48000                 var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
48001                 var stack = filterStackString(concatedStacks);
48002                 object_defineProperty(error, "stack", {value: stack, configurable: true});
48003             }
48004         }
48005
48006         function filterStackString(stackString) {
48007             var lines = stackString.split("\n");
48008             var desiredLines = [];
48009             for (var i = 0; i < lines.length; ++i) {
48010                 var line = lines[i];
48011
48012                 if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
48013                     desiredLines.push(line);
48014                 }
48015             }
48016             return desiredLines.join("\n");
48017         }
48018
48019         function isNodeFrame(stackLine) {
48020             return stackLine.indexOf("(module.js:") !== -1 ||
48021                    stackLine.indexOf("(node.js:") !== -1;
48022         }
48023
48024         function getFileNameAndLineNumber(stackLine) {
48025             // Named functions: "at functionName (filename:lineNumber:columnNumber)"
48026             // In IE10 function name can have spaces ("Anonymous function") O_o
48027             var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
48028             if (attempt1) {
48029                 return [attempt1[1], Number(attempt1[2])];
48030             }
48031
48032             // Anonymous functions: "at filename:lineNumber:columnNumber"
48033             var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
48034             if (attempt2) {
48035                 return [attempt2[1], Number(attempt2[2])];
48036             }
48037
48038             // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
48039             var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
48040             if (attempt3) {
48041                 return [attempt3[1], Number(attempt3[2])];
48042             }
48043         }
48044
48045         function isInternalFrame(stackLine) {
48046             var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
48047
48048             if (!fileNameAndLineNumber) {
48049                 return false;
48050             }
48051
48052             var fileName = fileNameAndLineNumber[0];
48053             var lineNumber = fileNameAndLineNumber[1];
48054
48055             return fileName === qFileName &&
48056                 lineNumber >= qStartingLine &&
48057                 lineNumber <= qEndingLine;
48058         }
48059
48060         // discover own file name and line number range for filtering stack
48061         // traces
48062         function captureLine() {
48063             if (!hasStacks) {
48064                 return;
48065             }
48066
48067             try {
48068                 throw new Error();
48069             } catch (e) {
48070                 var lines = e.stack.split("\n");
48071                 var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
48072                 var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
48073                 if (!fileNameAndLineNumber) {
48074                     return;
48075                 }
48076
48077                 qFileName = fileNameAndLineNumber[0];
48078                 return fileNameAndLineNumber[1];
48079             }
48080         }
48081
48082         function deprecate(callback, name, alternative) {
48083             return function () {
48084                 if (typeof console !== "undefined" &&
48085                     typeof console.warn === "function") {
48086                     console.warn(name + " is deprecated, use " + alternative +
48087                                  " instead.", new Error("").stack);
48088                 }
48089                 return callback.apply(callback, arguments);
48090             };
48091         }
48092
48093         // end of shims
48094         // beginning of real work
48095
48096         /**
48097          * Constructs a promise for an immediate reference, passes promises through, or
48098          * coerces promises from different systems.
48099          * @param value immediate reference or promise
48100          */
48101         function Q(value) {
48102             // If the object is already a Promise, return it directly.  This enables
48103             // the resolve function to both be used to created references from objects,
48104             // but to tolerably coerce non-promises to promises.
48105             if (value instanceof Promise) {
48106                 return value;
48107             }
48108
48109             // assimilate thenables
48110             if (isPromiseAlike(value)) {
48111                 return coerce(value);
48112             } else {
48113                 return fulfill(value);
48114             }
48115         }
48116         Q.resolve = Q;
48117
48118         /**
48119          * Performs a task in a future turn of the event loop.
48120          * @param {Function} task
48121          */
48122         Q.nextTick = nextTick;
48123
48124         /**
48125          * Controls whether or not long stack traces will be on
48126          */
48127         Q.longStackSupport = false;
48128
48129         /**
48130          * The counter is used to determine the stopping point for building
48131          * long stack traces. In makeStackTraceLong we walk backwards through
48132          * the linked list of promises, only stacks which were created before
48133          * the rejection are concatenated.
48134          */
48135         var longStackCounter = 1;
48136
48137         // enable long stacks if Q_DEBUG is set
48138         if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
48139             Q.longStackSupport = true;
48140         }
48141
48142         /**
48143          * Constructs a {promise, resolve, reject} object.
48144          *
48145          * `resolve` is a callback to invoke with a more resolved value for the
48146          * promise. To fulfill the promise, invoke `resolve` with any value that is
48147          * not a thenable. To reject the promise, invoke `resolve` with a rejected
48148          * thenable, or invoke `reject` with the reason directly. To resolve the
48149          * promise to another thenable, thus putting it in the same state, invoke
48150          * `resolve` with that other thenable.
48151          */
48152         Q.defer = defer;
48153         function defer() {
48154             // if "messages" is an "Array", that indicates that the promise has not yet
48155             // been resolved.  If it is "undefined", it has been resolved.  Each
48156             // element of the messages array is itself an array of complete arguments to
48157             // forward to the resolved promise.  We coerce the resolution value to a
48158             // promise using the `resolve` function because it handles both fully
48159             // non-thenable values and other thenables gracefully.
48160             var messages = [], progressListeners = [], resolvedPromise;
48161
48162             var deferred = object_create(defer.prototype);
48163             var promise = object_create(Promise.prototype);
48164
48165             promise.promiseDispatch = function (resolve, op, operands) {
48166                 var args = array_slice(arguments);
48167                 if (messages) {
48168                     messages.push(args);
48169                     if (op === "when" && operands[1]) { // progress operand
48170                         progressListeners.push(operands[1]);
48171                     }
48172                 } else {
48173                     Q.nextTick(function () {
48174                         resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
48175                     });
48176                 }
48177             };
48178
48179             // XXX deprecated
48180             promise.valueOf = function () {
48181                 if (messages) {
48182                     return promise;
48183                 }
48184                 var nearerValue = nearer(resolvedPromise);
48185                 if (isPromise(nearerValue)) {
48186                     resolvedPromise = nearerValue; // shorten chain
48187                 }
48188                 return nearerValue;
48189             };
48190
48191             promise.inspect = function () {
48192                 if (!resolvedPromise) {
48193                     return { state: "pending" };
48194                 }
48195                 return resolvedPromise.inspect();
48196             };
48197
48198             if (Q.longStackSupport && hasStacks) {
48199                 try {
48200                     throw new Error();
48201                 } catch (e) {
48202                     // NOTE: don't try to use `Error.captureStackTrace` or transfer the
48203                     // accessor around; that causes memory leaks as per GH-111. Just
48204                     // reify the stack trace as a string ASAP.
48205                     //
48206                     // At the same time, cut off the first line; it's always just
48207                     // "[object Promise]\n", as per the `toString`.
48208                     promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
48209                     promise.stackCounter = longStackCounter++;
48210                 }
48211             }
48212
48213             // NOTE: we do the checks for `resolvedPromise` in each method, instead of
48214             // consolidating them into `become`, since otherwise we'd create new
48215             // promises with the lines `become(whatever(value))`. See e.g. GH-252.
48216
48217             function become(newPromise) {
48218                 resolvedPromise = newPromise;
48219
48220                 if (Q.longStackSupport && hasStacks) {
48221                     // Only hold a reference to the new promise if long stacks
48222                     // are enabled to reduce memory usage
48223                     promise.source = newPromise;
48224                 }
48225
48226                 array_reduce(messages, function (undefined$1, message) {
48227                     Q.nextTick(function () {
48228                         newPromise.promiseDispatch.apply(newPromise, message);
48229                     });
48230                 }, void 0);
48231
48232                 messages = void 0;
48233                 progressListeners = void 0;
48234             }
48235
48236             deferred.promise = promise;
48237             deferred.resolve = function (value) {
48238                 if (resolvedPromise) {
48239                     return;
48240                 }
48241
48242                 become(Q(value));
48243             };
48244
48245             deferred.fulfill = function (value) {
48246                 if (resolvedPromise) {
48247                     return;
48248                 }
48249
48250                 become(fulfill(value));
48251             };
48252             deferred.reject = function (reason) {
48253                 if (resolvedPromise) {
48254                     return;
48255                 }
48256
48257                 become(reject(reason));
48258             };
48259             deferred.notify = function (progress) {
48260                 if (resolvedPromise) {
48261                     return;
48262                 }
48263
48264                 array_reduce(progressListeners, function (undefined$1, progressListener) {
48265                     Q.nextTick(function () {
48266                         progressListener(progress);
48267                     });
48268                 }, void 0);
48269             };
48270
48271             return deferred;
48272         }
48273
48274         /**
48275          * Creates a Node-style callback that will resolve or reject the deferred
48276          * promise.
48277          * @returns a nodeback
48278          */
48279         defer.prototype.makeNodeResolver = function () {
48280             var self = this;
48281             return function (error, value) {
48282                 if (error) {
48283                     self.reject(error);
48284                 } else if (arguments.length > 2) {
48285                     self.resolve(array_slice(arguments, 1));
48286                 } else {
48287                     self.resolve(value);
48288                 }
48289             };
48290         };
48291
48292         /**
48293          * @param resolver {Function} a function that returns nothing and accepts
48294          * the resolve, reject, and notify functions for a deferred.
48295          * @returns a promise that may be resolved with the given resolve and reject
48296          * functions, or rejected by a thrown exception in resolver
48297          */
48298         Q.Promise = promise; // ES6
48299         Q.promise = promise;
48300         function promise(resolver) {
48301             if (typeof resolver !== "function") {
48302                 throw new TypeError("resolver must be a function.");
48303             }
48304             var deferred = defer();
48305             try {
48306                 resolver(deferred.resolve, deferred.reject, deferred.notify);
48307             } catch (reason) {
48308                 deferred.reject(reason);
48309             }
48310             return deferred.promise;
48311         }
48312
48313         promise.race = race; // ES6
48314         promise.all = all; // ES6
48315         promise.reject = reject; // ES6
48316         promise.resolve = Q; // ES6
48317
48318         // XXX experimental.  This method is a way to denote that a local value is
48319         // serializable and should be immediately dispatched to a remote upon request,
48320         // instead of passing a reference.
48321         Q.passByCopy = function (object) {
48322             //freeze(object);
48323             //passByCopies.set(object, true);
48324             return object;
48325         };
48326
48327         Promise.prototype.passByCopy = function () {
48328             //freeze(object);
48329             //passByCopies.set(object, true);
48330             return this;
48331         };
48332
48333         /**
48334          * If two promises eventually fulfill to the same value, promises that value,
48335          * but otherwise rejects.
48336          * @param x {Any*}
48337          * @param y {Any*}
48338          * @returns {Any*} a promise for x and y if they are the same, but a rejection
48339          * otherwise.
48340          *
48341          */
48342         Q.join = function (x, y) {
48343             return Q(x).join(y);
48344         };
48345
48346         Promise.prototype.join = function (that) {
48347             return Q([this, that]).spread(function (x, y) {
48348                 if (x === y) {
48349                     // TODO: "===" should be Object.is or equiv
48350                     return x;
48351                 } else {
48352                     throw new Error("Q can't join: not the same: " + x + " " + y);
48353                 }
48354             });
48355         };
48356
48357         /**
48358          * Returns a promise for the first of an array of promises to become settled.
48359          * @param answers {Array[Any*]} promises to race
48360          * @returns {Any*} the first promise to be settled
48361          */
48362         Q.race = race;
48363         function race(answerPs) {
48364             return promise(function (resolve, reject) {
48365                 // Switch to this once we can assume at least ES5
48366                 // answerPs.forEach(function (answerP) {
48367                 //     Q(answerP).then(resolve, reject);
48368                 // });
48369                 // Use this in the meantime
48370                 for (var i = 0, len = answerPs.length; i < len; i++) {
48371                     Q(answerPs[i]).then(resolve, reject);
48372                 }
48373             });
48374         }
48375
48376         Promise.prototype.race = function () {
48377             return this.then(Q.race);
48378         };
48379
48380         /**
48381          * Constructs a Promise with a promise descriptor object and optional fallback
48382          * function.  The descriptor contains methods like when(rejected), get(name),
48383          * set(name, value), post(name, args), and delete(name), which all
48384          * return either a value, a promise for a value, or a rejection.  The fallback
48385          * accepts the operation name, a resolver, and any further arguments that would
48386          * have been forwarded to the appropriate method above had a method been
48387          * provided with the proper name.  The API makes no guarantees about the nature
48388          * of the returned object, apart from that it is usable whereever promises are
48389          * bought and sold.
48390          */
48391         Q.makePromise = Promise;
48392         function Promise(descriptor, fallback, inspect) {
48393             if (fallback === void 0) {
48394                 fallback = function (op) {
48395                     return reject(new Error(
48396                         "Promise does not support operation: " + op
48397                     ));
48398                 };
48399             }
48400             if (inspect === void 0) {
48401                 inspect = function () {
48402                     return {state: "unknown"};
48403                 };
48404             }
48405
48406             var promise = object_create(Promise.prototype);
48407
48408             promise.promiseDispatch = function (resolve, op, args) {
48409                 var result;
48410                 try {
48411                     if (descriptor[op]) {
48412                         result = descriptor[op].apply(promise, args);
48413                     } else {
48414                         result = fallback.call(promise, op, args);
48415                     }
48416                 } catch (exception) {
48417                     result = reject(exception);
48418                 }
48419                 if (resolve) {
48420                     resolve(result);
48421                 }
48422             };
48423
48424             promise.inspect = inspect;
48425
48426             // XXX deprecated `valueOf` and `exception` support
48427             if (inspect) {
48428                 var inspected = inspect();
48429                 if (inspected.state === "rejected") {
48430                     promise.exception = inspected.reason;
48431                 }
48432
48433                 promise.valueOf = function () {
48434                     var inspected = inspect();
48435                     if (inspected.state === "pending" ||
48436                         inspected.state === "rejected") {
48437                         return promise;
48438                     }
48439                     return inspected.value;
48440                 };
48441             }
48442
48443             return promise;
48444         }
48445
48446         Promise.prototype.toString = function () {
48447             return "[object Promise]";
48448         };
48449
48450         Promise.prototype.then = function (fulfilled, rejected, progressed) {
48451             var self = this;
48452             var deferred = defer();
48453             var done = false;   // ensure the untrusted promise makes at most a
48454                                 // single call to one of the callbacks
48455
48456             function _fulfilled(value) {
48457                 try {
48458                     return typeof fulfilled === "function" ? fulfilled(value) : value;
48459                 } catch (exception) {
48460                     return reject(exception);
48461                 }
48462             }
48463
48464             function _rejected(exception) {
48465                 if (typeof rejected === "function") {
48466                     makeStackTraceLong(exception, self);
48467                     try {
48468                         return rejected(exception);
48469                     } catch (newException) {
48470                         return reject(newException);
48471                     }
48472                 }
48473                 return reject(exception);
48474             }
48475
48476             function _progressed(value) {
48477                 return typeof progressed === "function" ? progressed(value) : value;
48478             }
48479
48480             Q.nextTick(function () {
48481                 self.promiseDispatch(function (value) {
48482                     if (done) {
48483                         return;
48484                     }
48485                     done = true;
48486
48487                     deferred.resolve(_fulfilled(value));
48488                 }, "when", [function (exception) {
48489                     if (done) {
48490                         return;
48491                     }
48492                     done = true;
48493
48494                     deferred.resolve(_rejected(exception));
48495                 }]);
48496             });
48497
48498             // Progress propagator need to be attached in the current tick.
48499             self.promiseDispatch(void 0, "when", [void 0, function (value) {
48500                 var newValue;
48501                 var threw = false;
48502                 try {
48503                     newValue = _progressed(value);
48504                 } catch (e) {
48505                     threw = true;
48506                     if (Q.onerror) {
48507                         Q.onerror(e);
48508                     } else {
48509                         throw e;
48510                     }
48511                 }
48512
48513                 if (!threw) {
48514                     deferred.notify(newValue);
48515                 }
48516             }]);
48517
48518             return deferred.promise;
48519         };
48520
48521         Q.tap = function (promise, callback) {
48522             return Q(promise).tap(callback);
48523         };
48524
48525         /**
48526          * Works almost like "finally", but not called for rejections.
48527          * Original resolution value is passed through callback unaffected.
48528          * Callback may return a promise that will be awaited for.
48529          * @param {Function} callback
48530          * @returns {Q.Promise}
48531          * @example
48532          * doSomething()
48533          *   .then(...)
48534          *   .tap(console.log)
48535          *   .then(...);
48536          */
48537         Promise.prototype.tap = function (callback) {
48538             callback = Q(callback);
48539
48540             return this.then(function (value) {
48541                 return callback.fcall(value).thenResolve(value);
48542             });
48543         };
48544
48545         /**
48546          * Registers an observer on a promise.
48547          *
48548          * Guarantees:
48549          *
48550          * 1. that fulfilled and rejected will be called only once.
48551          * 2. that either the fulfilled callback or the rejected callback will be
48552          *    called, but not both.
48553          * 3. that fulfilled and rejected will not be called in this turn.
48554          *
48555          * @param value      promise or immediate reference to observe
48556          * @param fulfilled  function to be called with the fulfilled value
48557          * @param rejected   function to be called with the rejection exception
48558          * @param progressed function to be called on any progress notifications
48559          * @return promise for the return value from the invoked callback
48560          */
48561         Q.when = when;
48562         function when(value, fulfilled, rejected, progressed) {
48563             return Q(value).then(fulfilled, rejected, progressed);
48564         }
48565
48566         Promise.prototype.thenResolve = function (value) {
48567             return this.then(function () { return value; });
48568         };
48569
48570         Q.thenResolve = function (promise, value) {
48571             return Q(promise).thenResolve(value);
48572         };
48573
48574         Promise.prototype.thenReject = function (reason) {
48575             return this.then(function () { throw reason; });
48576         };
48577
48578         Q.thenReject = function (promise, reason) {
48579             return Q(promise).thenReject(reason);
48580         };
48581
48582         /**
48583          * If an object is not a promise, it is as "near" as possible.
48584          * If a promise is rejected, it is as "near" as possible too.
48585          * If it’s a fulfilled promise, the fulfillment value is nearer.
48586          * If it’s a deferred promise and the deferred has been resolved, the
48587          * resolution is "nearer".
48588          * @param object
48589          * @returns most resolved (nearest) form of the object
48590          */
48591
48592         // XXX should we re-do this?
48593         Q.nearer = nearer;
48594         function nearer(value) {
48595             if (isPromise(value)) {
48596                 var inspected = value.inspect();
48597                 if (inspected.state === "fulfilled") {
48598                     return inspected.value;
48599                 }
48600             }
48601             return value;
48602         }
48603
48604         /**
48605          * @returns whether the given object is a promise.
48606          * Otherwise it is a fulfilled value.
48607          */
48608         Q.isPromise = isPromise;
48609         function isPromise(object) {
48610             return object instanceof Promise;
48611         }
48612
48613         Q.isPromiseAlike = isPromiseAlike;
48614         function isPromiseAlike(object) {
48615             return isObject(object) && typeof object.then === "function";
48616         }
48617
48618         /**
48619          * @returns whether the given object is a pending promise, meaning not
48620          * fulfilled or rejected.
48621          */
48622         Q.isPending = isPending;
48623         function isPending(object) {
48624             return isPromise(object) && object.inspect().state === "pending";
48625         }
48626
48627         Promise.prototype.isPending = function () {
48628             return this.inspect().state === "pending";
48629         };
48630
48631         /**
48632          * @returns whether the given object is a value or fulfilled
48633          * promise.
48634          */
48635         Q.isFulfilled = isFulfilled;
48636         function isFulfilled(object) {
48637             return !isPromise(object) || object.inspect().state === "fulfilled";
48638         }
48639
48640         Promise.prototype.isFulfilled = function () {
48641             return this.inspect().state === "fulfilled";
48642         };
48643
48644         /**
48645          * @returns whether the given object is a rejected promise.
48646          */
48647         Q.isRejected = isRejected;
48648         function isRejected(object) {
48649             return isPromise(object) && object.inspect().state === "rejected";
48650         }
48651
48652         Promise.prototype.isRejected = function () {
48653             return this.inspect().state === "rejected";
48654         };
48655
48656         //// BEGIN UNHANDLED REJECTION TRACKING
48657
48658         // This promise library consumes exceptions thrown in handlers so they can be
48659         // handled by a subsequent promise.  The exceptions get added to this array when
48660         // they are created, and removed when they are handled.  Note that in ES6 or
48661         // shimmed environments, this would naturally be a `Set`.
48662         var unhandledReasons = [];
48663         var unhandledRejections = [];
48664         var reportedUnhandledRejections = [];
48665         var trackUnhandledRejections = true;
48666
48667         function resetUnhandledRejections() {
48668             unhandledReasons.length = 0;
48669             unhandledRejections.length = 0;
48670
48671             if (!trackUnhandledRejections) {
48672                 trackUnhandledRejections = true;
48673             }
48674         }
48675
48676         function trackRejection(promise, reason) {
48677             if (!trackUnhandledRejections) {
48678                 return;
48679             }
48680             if (typeof process === "object" && typeof process.emit === "function") {
48681                 Q.nextTick.runAfter(function () {
48682                     if (array_indexOf(unhandledRejections, promise) !== -1) {
48683                         process.emit("unhandledRejection", reason, promise);
48684                         reportedUnhandledRejections.push(promise);
48685                     }
48686                 });
48687             }
48688
48689             unhandledRejections.push(promise);
48690             if (reason && typeof reason.stack !== "undefined") {
48691                 unhandledReasons.push(reason.stack);
48692             } else {
48693                 unhandledReasons.push("(no stack) " + reason);
48694             }
48695         }
48696
48697         function untrackRejection(promise) {
48698             if (!trackUnhandledRejections) {
48699                 return;
48700             }
48701
48702             var at = array_indexOf(unhandledRejections, promise);
48703             if (at !== -1) {
48704                 if (typeof process === "object" && typeof process.emit === "function") {
48705                     Q.nextTick.runAfter(function () {
48706                         var atReport = array_indexOf(reportedUnhandledRejections, promise);
48707                         if (atReport !== -1) {
48708                             process.emit("rejectionHandled", unhandledReasons[at], promise);
48709                             reportedUnhandledRejections.splice(atReport, 1);
48710                         }
48711                     });
48712                 }
48713                 unhandledRejections.splice(at, 1);
48714                 unhandledReasons.splice(at, 1);
48715             }
48716         }
48717
48718         Q.resetUnhandledRejections = resetUnhandledRejections;
48719
48720         Q.getUnhandledReasons = function () {
48721             // Make a copy so that consumers can't interfere with our internal state.
48722             return unhandledReasons.slice();
48723         };
48724
48725         Q.stopUnhandledRejectionTracking = function () {
48726             resetUnhandledRejections();
48727             trackUnhandledRejections = false;
48728         };
48729
48730         resetUnhandledRejections();
48731
48732         //// END UNHANDLED REJECTION TRACKING
48733
48734         /**
48735          * Constructs a rejected promise.
48736          * @param reason value describing the failure
48737          */
48738         Q.reject = reject;
48739         function reject(reason) {
48740             var rejection = Promise({
48741                 "when": function (rejected) {
48742                     // note that the error has been handled
48743                     if (rejected) {
48744                         untrackRejection(this);
48745                     }
48746                     return rejected ? rejected(reason) : this;
48747                 }
48748             }, function fallback() {
48749                 return this;
48750             }, function inspect() {
48751                 return { state: "rejected", reason: reason };
48752             });
48753
48754             // Note that the reason has not been handled.
48755             trackRejection(rejection, reason);
48756
48757             return rejection;
48758         }
48759
48760         /**
48761          * Constructs a fulfilled promise for an immediate reference.
48762          * @param value immediate reference
48763          */
48764         Q.fulfill = fulfill;
48765         function fulfill(value) {
48766             return Promise({
48767                 "when": function () {
48768                     return value;
48769                 },
48770                 "get": function (name) {
48771                     return value[name];
48772                 },
48773                 "set": function (name, rhs) {
48774                     value[name] = rhs;
48775                 },
48776                 "delete": function (name) {
48777                     delete value[name];
48778                 },
48779                 "post": function (name, args) {
48780                     // Mark Miller proposes that post with no name should apply a
48781                     // promised function.
48782                     if (name === null || name === void 0) {
48783                         return value.apply(void 0, args);
48784                     } else {
48785                         return value[name].apply(value, args);
48786                     }
48787                 },
48788                 "apply": function (thisp, args) {
48789                     return value.apply(thisp, args);
48790                 },
48791                 "keys": function () {
48792                     return object_keys(value);
48793                 }
48794             }, void 0, function inspect() {
48795                 return { state: "fulfilled", value: value };
48796             });
48797         }
48798
48799         /**
48800          * Converts thenables to Q promises.
48801          * @param promise thenable promise
48802          * @returns a Q promise
48803          */
48804         function coerce(promise) {
48805             var deferred = defer();
48806             Q.nextTick(function () {
48807                 try {
48808                     promise.then(deferred.resolve, deferred.reject, deferred.notify);
48809                 } catch (exception) {
48810                     deferred.reject(exception);
48811                 }
48812             });
48813             return deferred.promise;
48814         }
48815
48816         /**
48817          * Annotates an object such that it will never be
48818          * transferred away from this process over any promise
48819          * communication channel.
48820          * @param object
48821          * @returns promise a wrapping of that object that
48822          * additionally responds to the "isDef" message
48823          * without a rejection.
48824          */
48825         Q.master = master;
48826         function master(object) {
48827             return Promise({
48828                 "isDef": function () {}
48829             }, function fallback(op, args) {
48830                 return dispatch(object, op, args);
48831             }, function () {
48832                 return Q(object).inspect();
48833             });
48834         }
48835
48836         /**
48837          * Spreads the values of a promised array of arguments into the
48838          * fulfillment callback.
48839          * @param fulfilled callback that receives variadic arguments from the
48840          * promised array
48841          * @param rejected callback that receives the exception if the promise
48842          * is rejected.
48843          * @returns a promise for the return value or thrown exception of
48844          * either callback.
48845          */
48846         Q.spread = spread;
48847         function spread(value, fulfilled, rejected) {
48848             return Q(value).spread(fulfilled, rejected);
48849         }
48850
48851         Promise.prototype.spread = function (fulfilled, rejected) {
48852             return this.all().then(function (array) {
48853                 return fulfilled.apply(void 0, array);
48854             }, rejected);
48855         };
48856
48857         /**
48858          * The async function is a decorator for generator functions, turning
48859          * them into asynchronous generators.  Although generators are only part
48860          * of the newest ECMAScript 6 drafts, this code does not cause syntax
48861          * errors in older engines.  This code should continue to work and will
48862          * in fact improve over time as the language improves.
48863          *
48864          * ES6 generators are currently part of V8 version 3.19 with the
48865          * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
48866          * for longer, but under an older Python-inspired form.  This function
48867          * works on both kinds of generators.
48868          *
48869          * Decorates a generator function such that:
48870          *  - it may yield promises
48871          *  - execution will continue when that promise is fulfilled
48872          *  - the value of the yield expression will be the fulfilled value
48873          *  - it returns a promise for the return value (when the generator
48874          *    stops iterating)
48875          *  - the decorated function returns a promise for the return value
48876          *    of the generator or the first rejected promise among those
48877          *    yielded.
48878          *  - if an error is thrown in the generator, it propagates through
48879          *    every following yield until it is caught, or until it escapes
48880          *    the generator function altogether, and is translated into a
48881          *    rejection for the promise returned by the decorated generator.
48882          */
48883         Q.async = async;
48884         function async(makeGenerator) {
48885             return function () {
48886                 // when verb is "send", arg is a value
48887                 // when verb is "throw", arg is an exception
48888                 function continuer(verb, arg) {
48889                     var result;
48890
48891                     // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
48892                     // engine that has a deployed base of browsers that support generators.
48893                     // However, SM's generators use the Python-inspired semantics of
48894                     // outdated ES6 drafts.  We would like to support ES6, but we'd also
48895                     // like to make it possible to use generators in deployed browsers, so
48896                     // we also support Python-style generators.  At some point we can remove
48897                     // this block.
48898
48899                     if (typeof StopIteration === "undefined") {
48900                         // ES6 Generators
48901                         try {
48902                             result = generator[verb](arg);
48903                         } catch (exception) {
48904                             return reject(exception);
48905                         }
48906                         if (result.done) {
48907                             return Q(result.value);
48908                         } else {
48909                             return when(result.value, callback, errback);
48910                         }
48911                     } else {
48912                         // SpiderMonkey Generators
48913                         // FIXME: Remove this case when SM does ES6 generators.
48914                         try {
48915                             result = generator[verb](arg);
48916                         } catch (exception) {
48917                             if (isStopIteration(exception)) {
48918                                 return Q(exception.value);
48919                             } else {
48920                                 return reject(exception);
48921                             }
48922                         }
48923                         return when(result, callback, errback);
48924                     }
48925                 }
48926                 var generator = makeGenerator.apply(this, arguments);
48927                 var callback = continuer.bind(continuer, "next");
48928                 var errback = continuer.bind(continuer, "throw");
48929                 return callback();
48930             };
48931         }
48932
48933         /**
48934          * The spawn function is a small wrapper around async that immediately
48935          * calls the generator and also ends the promise chain, so that any
48936          * unhandled errors are thrown instead of forwarded to the error
48937          * handler. This is useful because it's extremely common to run
48938          * generators at the top-level to work with libraries.
48939          */
48940         Q.spawn = spawn;
48941         function spawn(makeGenerator) {
48942             Q.done(Q.async(makeGenerator)());
48943         }
48944
48945         // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
48946         /**
48947          * Throws a ReturnValue exception to stop an asynchronous generator.
48948          *
48949          * This interface is a stop-gap measure to support generator return
48950          * values in older Firefox/SpiderMonkey.  In browsers that support ES6
48951          * generators like Chromium 29, just use "return" in your generator
48952          * functions.
48953          *
48954          * @param value the return value for the surrounding generator
48955          * @throws ReturnValue exception with the value.
48956          * @example
48957          * // ES6 style
48958          * Q.async(function* () {
48959          *      var foo = yield getFooPromise();
48960          *      var bar = yield getBarPromise();
48961          *      return foo + bar;
48962          * })
48963          * // Older SpiderMonkey style
48964          * Q.async(function () {
48965          *      var foo = yield getFooPromise();
48966          *      var bar = yield getBarPromise();
48967          *      Q.return(foo + bar);
48968          * })
48969          */
48970         Q["return"] = _return;
48971         function _return(value) {
48972             throw new QReturnValue(value);
48973         }
48974
48975         /**
48976          * The promised function decorator ensures that any promise arguments
48977          * are settled and passed as values (`this` is also settled and passed
48978          * as a value).  It will also ensure that the result of a function is
48979          * always a promise.
48980          *
48981          * @example
48982          * var add = Q.promised(function (a, b) {
48983          *     return a + b;
48984          * });
48985          * add(Q(a), Q(B));
48986          *
48987          * @param {function} callback The function to decorate
48988          * @returns {function} a function that has been decorated.
48989          */
48990         Q.promised = promised;
48991         function promised(callback) {
48992             return function () {
48993                 return spread([this, all(arguments)], function (self, args) {
48994                     return callback.apply(self, args);
48995                 });
48996             };
48997         }
48998
48999         /**
49000          * sends a message to a value in a future turn
49001          * @param object* the recipient
49002          * @param op the name of the message operation, e.g., "when",
49003          * @param args further arguments to be forwarded to the operation
49004          * @returns result {Promise} a promise for the result of the operation
49005          */
49006         Q.dispatch = dispatch;
49007         function dispatch(object, op, args) {
49008             return Q(object).dispatch(op, args);
49009         }
49010
49011         Promise.prototype.dispatch = function (op, args) {
49012             var self = this;
49013             var deferred = defer();
49014             Q.nextTick(function () {
49015                 self.promiseDispatch(deferred.resolve, op, args);
49016             });
49017             return deferred.promise;
49018         };
49019
49020         /**
49021          * Gets the value of a property in a future turn.
49022          * @param object    promise or immediate reference for target object
49023          * @param name      name of property to get
49024          * @return promise for the property value
49025          */
49026         Q.get = function (object, key) {
49027             return Q(object).dispatch("get", [key]);
49028         };
49029
49030         Promise.prototype.get = function (key) {
49031             return this.dispatch("get", [key]);
49032         };
49033
49034         /**
49035          * Sets the value of a property in a future turn.
49036          * @param object    promise or immediate reference for object object
49037          * @param name      name of property to set
49038          * @param value     new value of property
49039          * @return promise for the return value
49040          */
49041         Q.set = function (object, key, value) {
49042             return Q(object).dispatch("set", [key, value]);
49043         };
49044
49045         Promise.prototype.set = function (key, value) {
49046             return this.dispatch("set", [key, value]);
49047         };
49048
49049         /**
49050          * Deletes a property in a future turn.
49051          * @param object    promise or immediate reference for target object
49052          * @param name      name of property to delete
49053          * @return promise for the return value
49054          */
49055         Q.del = // XXX legacy
49056         Q["delete"] = function (object, key) {
49057             return Q(object).dispatch("delete", [key]);
49058         };
49059
49060         Promise.prototype.del = // XXX legacy
49061         Promise.prototype["delete"] = function (key) {
49062             return this.dispatch("delete", [key]);
49063         };
49064
49065         /**
49066          * Invokes a method in a future turn.
49067          * @param object    promise or immediate reference for target object
49068          * @param name      name of method to invoke
49069          * @param value     a value to post, typically an array of
49070          *                  invocation arguments for promises that
49071          *                  are ultimately backed with `resolve` values,
49072          *                  as opposed to those backed with URLs
49073          *                  wherein the posted value can be any
49074          *                  JSON serializable object.
49075          * @return promise for the return value
49076          */
49077         // bound locally because it is used by other methods
49078         Q.mapply = // XXX As proposed by "Redsandro"
49079         Q.post = function (object, name, args) {
49080             return Q(object).dispatch("post", [name, args]);
49081         };
49082
49083         Promise.prototype.mapply = // XXX As proposed by "Redsandro"
49084         Promise.prototype.post = function (name, args) {
49085             return this.dispatch("post", [name, args]);
49086         };
49087
49088         /**
49089          * Invokes a method in a future turn.
49090          * @param object    promise or immediate reference for target object
49091          * @param name      name of method to invoke
49092          * @param ...args   array of invocation arguments
49093          * @return promise for the return value
49094          */
49095         Q.send = // XXX Mark Miller's proposed parlance
49096         Q.mcall = // XXX As proposed by "Redsandro"
49097         Q.invoke = function (object, name /*...args*/) {
49098             return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
49099         };
49100
49101         Promise.prototype.send = // XXX Mark Miller's proposed parlance
49102         Promise.prototype.mcall = // XXX As proposed by "Redsandro"
49103         Promise.prototype.invoke = function (name /*...args*/) {
49104             return this.dispatch("post", [name, array_slice(arguments, 1)]);
49105         };
49106
49107         /**
49108          * Applies the promised function in a future turn.
49109          * @param object    promise or immediate reference for target function
49110          * @param args      array of application arguments
49111          */
49112         Q.fapply = function (object, args) {
49113             return Q(object).dispatch("apply", [void 0, args]);
49114         };
49115
49116         Promise.prototype.fapply = function (args) {
49117             return this.dispatch("apply", [void 0, args]);
49118         };
49119
49120         /**
49121          * Calls the promised function in a future turn.
49122          * @param object    promise or immediate reference for target function
49123          * @param ...args   array of application arguments
49124          */
49125         Q["try"] =
49126         Q.fcall = function (object /* ...args*/) {
49127             return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
49128         };
49129
49130         Promise.prototype.fcall = function (/*...args*/) {
49131             return this.dispatch("apply", [void 0, array_slice(arguments)]);
49132         };
49133
49134         /**
49135          * Binds the promised function, transforming return values into a fulfilled
49136          * promise and thrown errors into a rejected one.
49137          * @param object    promise or immediate reference for target function
49138          * @param ...args   array of application arguments
49139          */
49140         Q.fbind = function (object /*...args*/) {
49141             var promise = Q(object);
49142             var args = array_slice(arguments, 1);
49143             return function fbound() {
49144                 return promise.dispatch("apply", [
49145                     this,
49146                     args.concat(array_slice(arguments))
49147                 ]);
49148             };
49149         };
49150         Promise.prototype.fbind = function (/*...args*/) {
49151             var promise = this;
49152             var args = array_slice(arguments);
49153             return function fbound() {
49154                 return promise.dispatch("apply", [
49155                     this,
49156                     args.concat(array_slice(arguments))
49157                 ]);
49158             };
49159         };
49160
49161         /**
49162          * Requests the names of the owned properties of a promised
49163          * object in a future turn.
49164          * @param object    promise or immediate reference for target object
49165          * @return promise for the keys of the eventually settled object
49166          */
49167         Q.keys = function (object) {
49168             return Q(object).dispatch("keys", []);
49169         };
49170
49171         Promise.prototype.keys = function () {
49172             return this.dispatch("keys", []);
49173         };
49174
49175         /**
49176          * Turns an array of promises into a promise for an array.  If any of
49177          * the promises gets rejected, the whole array is rejected immediately.
49178          * @param {Array*} an array (or promise for an array) of values (or
49179          * promises for values)
49180          * @returns a promise for an array of the corresponding values
49181          */
49182         // By Mark Miller
49183         // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
49184         Q.all = all;
49185         function all(promises) {
49186             return when(promises, function (promises) {
49187                 var pendingCount = 0;
49188                 var deferred = defer();
49189                 array_reduce(promises, function (undefined$1, promise, index) {
49190                     var snapshot;
49191                     if (
49192                         isPromise(promise) &&
49193                         (snapshot = promise.inspect()).state === "fulfilled"
49194                     ) {
49195                         promises[index] = snapshot.value;
49196                     } else {
49197                         ++pendingCount;
49198                         when(
49199                             promise,
49200                             function (value) {
49201                                 promises[index] = value;
49202                                 if (--pendingCount === 0) {
49203                                     deferred.resolve(promises);
49204                                 }
49205                             },
49206                             deferred.reject,
49207                             function (progress) {
49208                                 deferred.notify({ index: index, value: progress });
49209                             }
49210                         );
49211                     }
49212                 }, void 0);
49213                 if (pendingCount === 0) {
49214                     deferred.resolve(promises);
49215                 }
49216                 return deferred.promise;
49217             });
49218         }
49219
49220         Promise.prototype.all = function () {
49221             return all(this);
49222         };
49223
49224         /**
49225          * Returns the first resolved promise of an array. Prior rejected promises are
49226          * ignored.  Rejects only if all promises are rejected.
49227          * @param {Array*} an array containing values or promises for values
49228          * @returns a promise fulfilled with the value of the first resolved promise,
49229          * or a rejected promise if all promises are rejected.
49230          */
49231         Q.any = any;
49232
49233         function any(promises) {
49234             if (promises.length === 0) {
49235                 return Q.resolve();
49236             }
49237
49238             var deferred = Q.defer();
49239             var pendingCount = 0;
49240             array_reduce(promises, function (prev, current, index) {
49241                 var promise = promises[index];
49242
49243                 pendingCount++;
49244
49245                 when(promise, onFulfilled, onRejected, onProgress);
49246                 function onFulfilled(result) {
49247                     deferred.resolve(result);
49248                 }
49249                 function onRejected(err) {
49250                     pendingCount--;
49251                     if (pendingCount === 0) {
49252                         var rejection = err || new Error("" + err);
49253
49254                         rejection.message = ("Q can't get fulfillment value from any promise, all " +
49255                             "promises were rejected. Last error message: " + rejection.message);
49256
49257                         deferred.reject(rejection);
49258                     }
49259                 }
49260                 function onProgress(progress) {
49261                     deferred.notify({
49262                         index: index,
49263                         value: progress
49264                     });
49265                 }
49266             }, undefined);
49267
49268             return deferred.promise;
49269         }
49270
49271         Promise.prototype.any = function () {
49272             return any(this);
49273         };
49274
49275         /**
49276          * Waits for all promises to be settled, either fulfilled or
49277          * rejected.  This is distinct from `all` since that would stop
49278          * waiting at the first rejection.  The promise returned by
49279          * `allResolved` will never be rejected.
49280          * @param promises a promise for an array (or an array) of promises
49281          * (or values)
49282          * @return a promise for an array of promises
49283          */
49284         Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
49285         function allResolved(promises) {
49286             return when(promises, function (promises) {
49287                 promises = array_map(promises, Q);
49288                 return when(all(array_map(promises, function (promise) {
49289                     return when(promise, noop, noop);
49290                 })), function () {
49291                     return promises;
49292                 });
49293             });
49294         }
49295
49296         Promise.prototype.allResolved = function () {
49297             return allResolved(this);
49298         };
49299
49300         /**
49301          * @see Promise#allSettled
49302          */
49303         Q.allSettled = allSettled;
49304         function allSettled(promises) {
49305             return Q(promises).allSettled();
49306         }
49307
49308         /**
49309          * Turns an array of promises into a promise for an array of their states (as
49310          * returned by `inspect`) when they have all settled.
49311          * @param {Array[Any*]} values an array (or promise for an array) of values (or
49312          * promises for values)
49313          * @returns {Array[State]} an array of states for the respective values.
49314          */
49315         Promise.prototype.allSettled = function () {
49316             return this.then(function (promises) {
49317                 return all(array_map(promises, function (promise) {
49318                     promise = Q(promise);
49319                     function regardless() {
49320                         return promise.inspect();
49321                     }
49322                     return promise.then(regardless, regardless);
49323                 }));
49324             });
49325         };
49326
49327         /**
49328          * Captures the failure of a promise, giving an oportunity to recover
49329          * with a callback.  If the given promise is fulfilled, the returned
49330          * promise is fulfilled.
49331          * @param {Any*} promise for something
49332          * @param {Function} callback to fulfill the returned promise if the
49333          * given promise is rejected
49334          * @returns a promise for the return value of the callback
49335          */
49336         Q.fail = // XXX legacy
49337         Q["catch"] = function (object, rejected) {
49338             return Q(object).then(void 0, rejected);
49339         };
49340
49341         Promise.prototype.fail = // XXX legacy
49342         Promise.prototype["catch"] = function (rejected) {
49343             return this.then(void 0, rejected);
49344         };
49345
49346         /**
49347          * Attaches a listener that can respond to progress notifications from a
49348          * promise's originating deferred. This listener receives the exact arguments
49349          * passed to ``deferred.notify``.
49350          * @param {Any*} promise for something
49351          * @param {Function} callback to receive any progress notifications
49352          * @returns the given promise, unchanged
49353          */
49354         Q.progress = progress;
49355         function progress(object, progressed) {
49356             return Q(object).then(void 0, void 0, progressed);
49357         }
49358
49359         Promise.prototype.progress = function (progressed) {
49360             return this.then(void 0, void 0, progressed);
49361         };
49362
49363         /**
49364          * Provides an opportunity to observe the settling of a promise,
49365          * regardless of whether the promise is fulfilled or rejected.  Forwards
49366          * the resolution to the returned promise when the callback is done.
49367          * The callback can return a promise to defer completion.
49368          * @param {Any*} promise
49369          * @param {Function} callback to observe the resolution of the given
49370          * promise, takes no arguments.
49371          * @returns a promise for the resolution of the given promise when
49372          * ``fin`` is done.
49373          */
49374         Q.fin = // XXX legacy
49375         Q["finally"] = function (object, callback) {
49376             return Q(object)["finally"](callback);
49377         };
49378
49379         Promise.prototype.fin = // XXX legacy
49380         Promise.prototype["finally"] = function (callback) {
49381             if (!callback || typeof callback.apply !== "function") {
49382                 throw new Error("Q can't apply finally callback");
49383             }
49384             callback = Q(callback);
49385             return this.then(function (value) {
49386                 return callback.fcall().then(function () {
49387                     return value;
49388                 });
49389             }, function (reason) {
49390                 // TODO attempt to recycle the rejection with "this".
49391                 return callback.fcall().then(function () {
49392                     throw reason;
49393                 });
49394             });
49395         };
49396
49397         /**
49398          * Terminates a chain of promises, forcing rejections to be
49399          * thrown as exceptions.
49400          * @param {Any*} promise at the end of a chain of promises
49401          * @returns nothing
49402          */
49403         Q.done = function (object, fulfilled, rejected, progress) {
49404             return Q(object).done(fulfilled, rejected, progress);
49405         };
49406
49407         Promise.prototype.done = function (fulfilled, rejected, progress) {
49408             var onUnhandledError = function (error) {
49409                 // forward to a future turn so that ``when``
49410                 // does not catch it and turn it into a rejection.
49411                 Q.nextTick(function () {
49412                     makeStackTraceLong(error, promise);
49413                     if (Q.onerror) {
49414                         Q.onerror(error);
49415                     } else {
49416                         throw error;
49417                     }
49418                 });
49419             };
49420
49421             // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
49422             var promise = fulfilled || rejected || progress ?
49423                 this.then(fulfilled, rejected, progress) :
49424                 this;
49425
49426             if (typeof process === "object" && process && process.domain) {
49427                 onUnhandledError = process.domain.bind(onUnhandledError);
49428             }
49429
49430             promise.then(void 0, onUnhandledError);
49431         };
49432
49433         /**
49434          * Causes a promise to be rejected if it does not get fulfilled before
49435          * some milliseconds time out.
49436          * @param {Any*} promise
49437          * @param {Number} milliseconds timeout
49438          * @param {Any*} custom error message or Error object (optional)
49439          * @returns a promise for the resolution of the given promise if it is
49440          * fulfilled before the timeout, otherwise rejected.
49441          */
49442         Q.timeout = function (object, ms, error) {
49443             return Q(object).timeout(ms, error);
49444         };
49445
49446         Promise.prototype.timeout = function (ms, error) {
49447             var deferred = defer();
49448             var timeoutId = setTimeout(function () {
49449                 if (!error || "string" === typeof error) {
49450                     error = new Error(error || "Timed out after " + ms + " ms");
49451                     error.code = "ETIMEDOUT";
49452                 }
49453                 deferred.reject(error);
49454             }, ms);
49455
49456             this.then(function (value) {
49457                 clearTimeout(timeoutId);
49458                 deferred.resolve(value);
49459             }, function (exception) {
49460                 clearTimeout(timeoutId);
49461                 deferred.reject(exception);
49462             }, deferred.notify);
49463
49464             return deferred.promise;
49465         };
49466
49467         /**
49468          * Returns a promise for the given value (or promised value), some
49469          * milliseconds after it resolved. Passes rejections immediately.
49470          * @param {Any*} promise
49471          * @param {Number} milliseconds
49472          * @returns a promise for the resolution of the given promise after milliseconds
49473          * time has elapsed since the resolution of the given promise.
49474          * If the given promise rejects, that is passed immediately.
49475          */
49476         Q.delay = function (object, timeout) {
49477             if (timeout === void 0) {
49478                 timeout = object;
49479                 object = void 0;
49480             }
49481             return Q(object).delay(timeout);
49482         };
49483
49484         Promise.prototype.delay = function (timeout) {
49485             return this.then(function (value) {
49486                 var deferred = defer();
49487                 setTimeout(function () {
49488                     deferred.resolve(value);
49489                 }, timeout);
49490                 return deferred.promise;
49491             });
49492         };
49493
49494         /**
49495          * Passes a continuation to a Node function, which is called with the given
49496          * arguments provided as an array, and returns a promise.
49497          *
49498          *      Q.nfapply(FS.readFile, [__filename])
49499          *      .then(function (content) {
49500          *      })
49501          *
49502          */
49503         Q.nfapply = function (callback, args) {
49504             return Q(callback).nfapply(args);
49505         };
49506
49507         Promise.prototype.nfapply = function (args) {
49508             var deferred = defer();
49509             var nodeArgs = array_slice(args);
49510             nodeArgs.push(deferred.makeNodeResolver());
49511             this.fapply(nodeArgs).fail(deferred.reject);
49512             return deferred.promise;
49513         };
49514
49515         /**
49516          * Passes a continuation to a Node function, which is called with the given
49517          * arguments provided individually, and returns a promise.
49518          * @example
49519          * Q.nfcall(FS.readFile, __filename)
49520          * .then(function (content) {
49521          * })
49522          *
49523          */
49524         Q.nfcall = function (callback /*...args*/) {
49525             var args = array_slice(arguments, 1);
49526             return Q(callback).nfapply(args);
49527         };
49528
49529         Promise.prototype.nfcall = function (/*...args*/) {
49530             var nodeArgs = array_slice(arguments);
49531             var deferred = defer();
49532             nodeArgs.push(deferred.makeNodeResolver());
49533             this.fapply(nodeArgs).fail(deferred.reject);
49534             return deferred.promise;
49535         };
49536
49537         /**
49538          * Wraps a NodeJS continuation passing function and returns an equivalent
49539          * version that returns a promise.
49540          * @example
49541          * Q.nfbind(FS.readFile, __filename)("utf-8")
49542          * .then(console.log)
49543          * .done()
49544          */
49545         Q.nfbind =
49546         Q.denodeify = function (callback /*...args*/) {
49547             if (callback === undefined) {
49548                 throw new Error("Q can't wrap an undefined function");
49549             }
49550             var baseArgs = array_slice(arguments, 1);
49551             return function () {
49552                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49553                 var deferred = defer();
49554                 nodeArgs.push(deferred.makeNodeResolver());
49555                 Q(callback).fapply(nodeArgs).fail(deferred.reject);
49556                 return deferred.promise;
49557             };
49558         };
49559
49560         Promise.prototype.nfbind =
49561         Promise.prototype.denodeify = function (/*...args*/) {
49562             var args = array_slice(arguments);
49563             args.unshift(this);
49564             return Q.denodeify.apply(void 0, args);
49565         };
49566
49567         Q.nbind = function (callback, thisp /*...args*/) {
49568             var baseArgs = array_slice(arguments, 2);
49569             return function () {
49570                 var nodeArgs = baseArgs.concat(array_slice(arguments));
49571                 var deferred = defer();
49572                 nodeArgs.push(deferred.makeNodeResolver());
49573                 function bound() {
49574                     return callback.apply(thisp, arguments);
49575                 }
49576                 Q(bound).fapply(nodeArgs).fail(deferred.reject);
49577                 return deferred.promise;
49578             };
49579         };
49580
49581         Promise.prototype.nbind = function (/*thisp, ...args*/) {
49582             var args = array_slice(arguments, 0);
49583             args.unshift(this);
49584             return Q.nbind.apply(void 0, args);
49585         };
49586
49587         /**
49588          * Calls a method of a Node-style object that accepts a Node-style
49589          * callback with a given array of arguments, plus a provided callback.
49590          * @param object an object that has the named method
49591          * @param {String} name name of the method of object
49592          * @param {Array} args arguments to pass to the method; the callback
49593          * will be provided by Q and appended to these arguments.
49594          * @returns a promise for the value or error
49595          */
49596         Q.nmapply = // XXX As proposed by "Redsandro"
49597         Q.npost = function (object, name, args) {
49598             return Q(object).npost(name, args);
49599         };
49600
49601         Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
49602         Promise.prototype.npost = function (name, args) {
49603             var nodeArgs = array_slice(args || []);
49604             var deferred = defer();
49605             nodeArgs.push(deferred.makeNodeResolver());
49606             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49607             return deferred.promise;
49608         };
49609
49610         /**
49611          * Calls a method of a Node-style object that accepts a Node-style
49612          * callback, forwarding the given variadic arguments, plus a provided
49613          * callback argument.
49614          * @param object an object that has the named method
49615          * @param {String} name name of the method of object
49616          * @param ...args arguments to pass to the method; the callback will
49617          * be provided by Q and appended to these arguments.
49618          * @returns a promise for the value or error
49619          */
49620         Q.nsend = // XXX Based on Mark Miller's proposed "send"
49621         Q.nmcall = // XXX Based on "Redsandro's" proposal
49622         Q.ninvoke = function (object, name /*...args*/) {
49623             var nodeArgs = array_slice(arguments, 2);
49624             var deferred = defer();
49625             nodeArgs.push(deferred.makeNodeResolver());
49626             Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49627             return deferred.promise;
49628         };
49629
49630         Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
49631         Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
49632         Promise.prototype.ninvoke = function (name /*...args*/) {
49633             var nodeArgs = array_slice(arguments, 1);
49634             var deferred = defer();
49635             nodeArgs.push(deferred.makeNodeResolver());
49636             this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
49637             return deferred.promise;
49638         };
49639
49640         /**
49641          * If a function would like to support both Node continuation-passing-style and
49642          * promise-returning-style, it can end its internal promise chain with
49643          * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
49644          * elects to use a nodeback, the result will be sent there.  If they do not
49645          * pass a nodeback, they will receive the result promise.
49646          * @param object a result (or a promise for a result)
49647          * @param {Function} nodeback a Node.js-style callback
49648          * @returns either the promise or nothing
49649          */
49650         Q.nodeify = nodeify;
49651         function nodeify(object, nodeback) {
49652             return Q(object).nodeify(nodeback);
49653         }
49654
49655         Promise.prototype.nodeify = function (nodeback) {
49656             if (nodeback) {
49657                 this.then(function (value) {
49658                     Q.nextTick(function () {
49659                         nodeback(null, value);
49660                     });
49661                 }, function (error) {
49662                     Q.nextTick(function () {
49663                         nodeback(error);
49664                     });
49665                 });
49666             } else {
49667                 return this;
49668             }
49669         };
49670
49671         Q.noConflict = function() {
49672             throw new Error("Q.noConflict only works when Q is used as a global");
49673         };
49674
49675         // All code before this point will be filtered from stack traces.
49676         var qEndingLine = captureLine();
49677
49678         return Q;
49679
49680         });
49681         });
49682
49683         var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
49684         var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
49685         var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
49686         var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
49687         var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
49688         var maxResults$2 = 2000;
49689         var tileZoom$2 = 16.5;
49690         var tiler$5 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
49691         var dispatch$6 = dispatch('loadedBubbles', 'viewerChanged');
49692         var minHfov = 10;         // zoom in degrees:  20, 10, 5
49693         var maxHfov = 90;         // zoom out degrees
49694         var defaultHfov = 45;
49695
49696         var _hires = false;
49697         var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
49698         var _currScene = 0;
49699         var _ssCache;
49700         var _pannellumViewer;
49701         var _sceneOptions;
49702         var _dataUrlArray = [];
49703
49704
49705         /**
49706          * abortRequest().
49707          */
49708         function abortRequest$5(i) {
49709             i.abort();
49710         }
49711
49712
49713         /**
49714          * localeTimeStamp().
49715          */
49716         function localeTimestamp(s) {
49717             if (!s) return null;
49718             var detected = utilDetect();
49719             var options = { day: 'numeric', month: 'short', year: 'numeric' };
49720             var d = new Date(s);
49721             if (isNaN(d.getTime())) return null;
49722             return d.toLocaleString(detected.locale, options);
49723         }
49724
49725
49726         /**
49727          * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
49728          */
49729         function loadTiles$2(which, url, projection, margin) {
49730             var tiles = tiler$5.margin(margin).getTiles(projection);
49731
49732             // abort inflight requests that are no longer needed
49733             var cache = _ssCache[which];
49734             Object.keys(cache.inflight).forEach(function(k) {
49735                 var wanted = tiles.find(function(tile) { return k.indexOf(tile.id + ',') === 0; });
49736                 if (!wanted) {
49737                     abortRequest$5(cache.inflight[k]);
49738                     delete cache.inflight[k];
49739                 }
49740             });
49741
49742             tiles.forEach(function (tile) {
49743                loadNextTilePage$2(which, url, tile);
49744             });
49745         }
49746
49747         /**
49748          * loadNextTilePage() load data for the next tile page in line.
49749          */
49750         function loadNextTilePage$2(which, url, tile) {
49751             var cache = _ssCache[which];
49752             var nextPage = cache.nextPage[tile.id] || 0;
49753             var id = tile.id + ',' + String(nextPage);
49754             if (cache.loaded[id] || cache.inflight[id]) return;
49755
49756             cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
49757                 cache.loaded[id] = true;
49758                 delete cache.inflight[id];
49759                 if (!bubbles) return;
49760
49761                 // [].shift() removes the first element, some statistics info, not a bubble point
49762                 bubbles.shift();
49763
49764                 var features = bubbles.map(function(bubble) {
49765                     if (cache.points[bubble.id]) return null;  // skip duplicates
49766
49767                     var loc = [bubble.lo, bubble.la];
49768                     var d = {
49769                         loc: loc,
49770                         key: bubble.id,
49771                         ca: bubble.he,
49772                         captured_at: bubble.cd,
49773                         captured_by: 'microsoft',
49774                         // nbn: bubble.nbn,
49775                         // pbn: bubble.pbn,
49776                         // ad: bubble.ad,
49777                         // rn: bubble.rn,
49778                         pr: bubble.pr,  // previous
49779                         ne: bubble.ne,  // next
49780                         pano: true,
49781                         sequenceKey: null
49782                     };
49783
49784                     cache.points[bubble.id] = d;
49785
49786                     // a sequence starts here
49787                     if (bubble.pr === undefined) {
49788                         cache.leaders.push(bubble.id);
49789                     }
49790
49791                     return {
49792                         minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
49793                     };
49794
49795                 }).filter(Boolean);
49796
49797                 cache.rtree.load(features);
49798
49799                 connectSequences();
49800
49801                 if (which === 'bubbles') {
49802                     dispatch$6.call('loadedBubbles');
49803                 }
49804             });
49805         }
49806
49807
49808         // call this sometimes to connect the bubbles into sequences
49809         function connectSequences() {
49810             var cache = _ssCache.bubbles;
49811             var keepLeaders = [];
49812
49813             for (var i = 0; i < cache.leaders.length; i++) {
49814                 var bubble = cache.points[cache.leaders[i]];
49815                 var seen = {};
49816
49817                 // try to make a sequence.. use the key of the leader bubble.
49818                 var sequence = { key: bubble.key, bubbles: [] };
49819                 var complete = false;
49820
49821                 do {
49822                     sequence.bubbles.push(bubble);
49823                     seen[bubble.key] = true;
49824
49825                     if (bubble.ne === undefined) {
49826                         complete = true;
49827                     } else {
49828                         bubble = cache.points[bubble.ne];  // advance to next
49829                     }
49830                 } while (bubble && !seen[bubble.key] && !complete);
49831
49832
49833                 if (complete) {
49834                     _ssCache.sequences[sequence.key] = sequence;
49835
49836                     // assign bubbles to the sequence
49837                     for (var j = 0; j < sequence.bubbles.length; j++) {
49838                         sequence.bubbles[j].sequenceKey = sequence.key;
49839                     }
49840
49841                     // create a GeoJSON LineString
49842                     sequence.geojson = {
49843                         type: 'LineString',
49844                         properties: { key: sequence.key },
49845                         coordinates: sequence.bubbles.map(function (d) { return d.loc; })
49846                     };
49847
49848                 } else {
49849                     keepLeaders.push(cache.leaders[i]);
49850                 }
49851             }
49852
49853             // couldn't complete these, save for later
49854             cache.leaders = keepLeaders;
49855         }
49856
49857         /**
49858          * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
49859          */
49860         function getBubbles(url, tile, callback) {
49861             var rect = tile.extent.rectangle();
49862             var urlForRequest = url + utilQsString({
49863                 n: rect[3],
49864                 s: rect[1],
49865                 e: rect[2],
49866                 w: rect[0],
49867                 c: maxResults$2,
49868                 appkey: bubbleAppKey,
49869                 jsCallback: '{callback}'
49870             });
49871
49872             return jsonpRequest(urlForRequest, function (data) {
49873                 if (!data || data.error) {
49874                     callback(null);
49875                 } else {
49876                     callback(data);
49877                 }
49878             });
49879         }
49880
49881
49882         // partition viewport into higher zoom tiles
49883         function partitionViewport$2(projection) {
49884             var z = geoScaleToZoom(projection.scale());
49885             var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
49886             var tiler = utilTiler().zoomExtent([z2, z2]);
49887
49888             return tiler.getTiles(projection)
49889                 .map(function(tile) { return tile.extent; });
49890         }
49891
49892
49893         // no more than `limit` results per partition.
49894         function searchLimited$2(limit, projection, rtree) {
49895             limit = limit || 5;
49896
49897             return partitionViewport$2(projection)
49898                 .reduce(function(result, extent) {
49899                     var found = rtree.search(extent.bbox())
49900                         .slice(0, limit)
49901                         .map(function(d) { return d.data; });
49902
49903                     return (found.length ? result.concat(found) : result);
49904                 }, []);
49905         }
49906
49907
49908         /**
49909          * getImage()
49910          */
49911         function getImage(imgInfo) {
49912             var response = q.defer();
49913             var img = new Image();
49914
49915             img.onload = function() {
49916                 var canvas = document.getElementById('canvas' + imgInfo.face);
49917                 var ctx = canvas.getContext('2d');
49918                 ctx.drawImage(img, imgInfo.x, imgInfo.y);
49919                 response.resolve({imgInfo:imgInfo, status: 'ok'});
49920             };
49921             img.onerror = function() {
49922                 response.resolve({data: imgInfo, status: 'error'});
49923             };
49924             img.setAttribute('crossorigin', '');
49925             img.src = imgInfo.url;
49926
49927             return response.promise;
49928         }
49929
49930
49931         /**
49932          * loadCanvas()
49933          */
49934         function loadCanvas(imgInfoGroup) {
49935             var response = q.defer();
49936             var getImagePromises = imgInfoGroup.map(function(imgInfo) {
49937                 return getImage(imgInfo);
49938             });
49939
49940             q.all(getImagePromises).then(function(data) {
49941                 var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
49942                 switch (data[0].imgInfo.face) {
49943                     case '01':
49944                         _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
49945                         break;
49946                     case '02':
49947                         _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
49948                         break;
49949                     case '03':
49950                         _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
49951                         break;
49952                     case '10':
49953                         _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
49954                         break;
49955                     case '11':
49956                         _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
49957                         break;
49958                     case '12':
49959                         _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
49960                         break;
49961                 }
49962                 response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
49963             });
49964
49965             return response.promise;
49966         }
49967
49968
49969         function setupCanvas(selection, reset) {
49970             if (reset) {
49971                 selection.selectAll('#divForCanvasWork')
49972                     .remove();
49973             }
49974
49975             // Add the Streetside working canvases. These are used for 'stitching', or combining,
49976             // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
49977             selection.selectAll('#divForCanvasWork')
49978                 .data([0])
49979                 .enter()
49980                 .append('div')
49981                 .attr('id', 'divForCanvasWork')
49982                 .attr('display', 'none')
49983                 .selectAll('canvas')
49984                 .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
49985                 .enter()
49986                 .append('canvas')
49987                 .attr('id', function(d) { return d; })
49988                 .attr('width', _resolution)
49989                 .attr('height', _resolution);
49990         }
49991
49992
49993         /**
49994          * processFaces()
49995          */
49996         function processFaces(imgFaceInfoGroups) {
49997             var response = q.defer();
49998             var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
49999                 return loadCanvas(faceImgGroup);
50000             });
50001
50002             q.all(loadCanvasPromises).then(function() {
50003                 response.resolve({status: 'processFaces done'});
50004             });
50005
50006             return response.promise;
50007         }
50008
50009
50010
50011         function qkToXY(qk) {
50012             var x = 0;
50013             var y = 0;
50014             var scale = 256;
50015             for (var i = qk.length; i > 0; i--) {
50016                 var key = qk[i-1];
50017                 x += (+(key === '1' || key === '3')) * scale;
50018                 y += (+(key === '2' || key === '3')) * scale;
50019                 scale *= 2;
50020             }
50021             return [x, y];
50022         }
50023
50024
50025         function getQuadKeys() {
50026             var dim = _resolution / 256;
50027             var quadKeys;
50028
50029             if (dim === 16) {
50030                 quadKeys = [
50031                     '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
50032                     '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
50033                     '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
50034                     '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
50035                     '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
50036                     '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
50037                     '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
50038                     '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
50039
50040                     '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
50041                     '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
50042                     '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
50043                     '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
50044                     '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
50045                     '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
50046                     '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
50047                     '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
50048                 ];
50049
50050             } else if (dim === 8) {
50051                 quadKeys = [
50052                     '000','001','010','011',  '100','101','110','111',
50053                     '002','003','012','013',  '102','103','112','113',
50054                     '020','021','030','031',  '120','121','130','131',
50055                     '022','023','032','033',  '122','123','132','133',
50056
50057                     '200','201','210','211',  '300','301','310','311',
50058                     '202','203','212','213',  '302','303','312','313',
50059                     '220','221','230','231',  '320','321','330','331',
50060                     '222','223','232','233',  '322','323','332','333'
50061                 ];
50062
50063             } else if (dim === 4) {
50064                 quadKeys = [
50065                     '00','01',  '10','11',
50066                     '02','03',  '12','13',
50067
50068                     '20','21',  '30','31',
50069                     '22','23',  '32','33'
50070                 ];
50071
50072             } else {  // dim === 2
50073                 quadKeys = [
50074                     '0', '1',
50075                     '2', '3'
50076                 ];
50077             }
50078
50079             return quadKeys;
50080         }
50081
50082
50083
50084         var serviceStreetside = {
50085             /**
50086              * init() initialize streetside.
50087              */
50088             init: function () {
50089                 if (!_ssCache) {
50090                     this.reset();
50091                 }
50092
50093                 this.event = utilRebind(this, dispatch$6, 'on');
50094             },
50095
50096             /**
50097              * reset() reset the cache.
50098              */
50099             reset: function () {
50100                 if (_ssCache) {
50101                     Object.values(_ssCache.bubbles.inflight).forEach(abortRequest$5);
50102                 }
50103
50104                 _ssCache = {
50105                     bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
50106                     sequences: {}
50107                 };
50108             },
50109
50110             /**
50111              * bubbles()
50112              */
50113             bubbles: function (projection) {
50114                 var limit = 5;
50115                 return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
50116             },
50117
50118
50119             sequences: function(projection) {
50120                 var viewport = projection.clipExtent();
50121                 var min = [viewport[0][0], viewport[1][1]];
50122                 var max = [viewport[1][0], viewport[0][1]];
50123                 var bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox();
50124                 var seen = {};
50125                 var results = [];
50126
50127                 // all sequences for bubbles in viewport
50128                 _ssCache.bubbles.rtree.search(bbox)
50129                     .forEach(function(d) {
50130                         var key = d.data.sequenceKey;
50131                         if (key && !seen[key]) {
50132                             seen[key] = true;
50133                             results.push(_ssCache.sequences[key].geojson);
50134                         }
50135                     });
50136
50137                 return results;
50138             },
50139
50140
50141             /**
50142              * loadBubbles()
50143              */
50144             loadBubbles: function (projection, margin) {
50145                 // by default: request 2 nearby tiles so we can connect sequences.
50146                 if (margin === undefined) margin = 2;
50147
50148                 loadTiles$2('bubbles', bubbleApi, projection, margin);
50149             },
50150
50151
50152             viewer: function() {
50153                 return _pannellumViewer;
50154             },
50155
50156
50157             initViewer: function () {
50158                 if (!window.pannellum) return;
50159                 if (_pannellumViewer) return;
50160
50161                 var sceneID = ++_currScene + '';
50162                 var options = {
50163                     'default': { firstScene: sceneID },
50164                     scenes: {}
50165                 };
50166                 options.scenes[sceneID] = _sceneOptions;
50167
50168                 _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
50169
50170                 _pannellumViewer
50171                     .on('mousedown', function() {
50172                         d3_select(window).on('mousemove.pannellum', function() {
50173                             dispatch$6.call('viewerChanged');
50174                         });
50175                     })
50176                     .on('mouseup', function() {
50177                         d3_select(window).on('mousemove.pannellum', null);
50178                         // continue dispatching events for a few seconds, in case viewer has inertia.
50179                         var t = timer(function(elapsed) {
50180                             dispatch$6.call('viewerChanged');
50181                             if (elapsed > 2000) {
50182                                 t.stop();
50183                             }
50184                         });
50185                     });
50186             },
50187
50188
50189             /**
50190              * loadViewer() create the streeside viewer.
50191              */
50192             loadViewer: function (context) {
50193                 var that = this;
50194
50195                 // create ms-wrapper, a photo wrapper class
50196                 var wrap = d3_select('#photoviewer').selectAll('.ms-wrapper')
50197                     .data([0]);
50198
50199                 // inject ms-wrapper into the photoviewer div
50200                 // (used by all to house each custom photo viewer)
50201                 var wrapEnter = wrap.enter()
50202                     .append('div')
50203                     .attr('id', 'ms')
50204                     .attr('class', 'photo-wrapper ms-wrapper')
50205                     .classed('hide', true);
50206
50207                 // inject div to support streetside viewer (pannellum) and attribution line
50208                 wrapEnter
50209                     .append('div')
50210                     .attr('id', 'viewer-streetside')
50211                     .append('div')
50212                     .attr('class', 'photo-attribution fillD');
50213
50214                 var controlsEnter = wrapEnter
50215                     .append('div')
50216                     .attr('class', 'photo-controls-wrap')
50217                     .append('div')
50218                     .attr('class', 'photo-controls');
50219
50220                 controlsEnter
50221                     .append('button')
50222                     .on('click.back', step(-1))
50223                     .text('◄');
50224
50225                 controlsEnter
50226                     .append('button')
50227                     .on('click.forward', step(1))
50228                     .text('►');
50229
50230
50231                 // create working canvas for stitching together images
50232                 wrap = wrap
50233                     .merge(wrapEnter)
50234                     .call(setupCanvas, true);
50235
50236                 // load streetside pannellum viewer css
50237                 d3_select('head').selectAll('#streetside-viewercss')
50238                     .data([0])
50239                     .enter()
50240                     .append('link')
50241                     .attr('id', 'streetside-viewercss')
50242                     .attr('rel', 'stylesheet')
50243                     .attr('href', context.asset(pannellumViewerCSS));
50244
50245                 // load streetside pannellum viewer js
50246                 d3_select('head').selectAll('#streetside-viewerjs')
50247                     .data([0])
50248                     .enter()
50249                     .append('script')
50250                     .attr('id', 'streetside-viewerjs')
50251                     .attr('src', context.asset(pannellumViewerJS));
50252
50253
50254                 // Register viewer resize handler
50255                 context.ui().photoviewer.on('resize', function() {
50256                     if (_pannellumViewer) {
50257                         _pannellumViewer.resize();
50258                     }
50259                 });
50260
50261
50262                 function step(stepBy) {
50263                     return function() {
50264                         var viewer = d3_select('#photoviewer');
50265                         var selected = viewer.empty() ? undefined : viewer.datum();
50266                         if (!selected) return;
50267
50268                         var nextID = (stepBy === 1 ? selected.ne : selected.pr);
50269                         var yaw = _pannellumViewer.getYaw();
50270                         var ca = selected.ca + yaw;
50271                         var origin = selected.loc;
50272
50273                         // construct a search trapezoid pointing out from current bubble
50274                         var meters = 35;
50275                         var p1 = [
50276                             origin[0] + geoMetersToLon(meters / 5, origin[1]),
50277                             origin[1]
50278                         ];
50279                         var p2 = [
50280                             origin[0] + geoMetersToLon(meters / 2, origin[1]),
50281                             origin[1] + geoMetersToLat(meters)
50282                         ];
50283                         var p3 = [
50284                             origin[0] - geoMetersToLon(meters / 2, origin[1]),
50285                             origin[1] + geoMetersToLat(meters)
50286                         ];
50287                         var p4 = [
50288                             origin[0] - geoMetersToLon(meters / 5, origin[1]),
50289                             origin[1]
50290                         ];
50291
50292                         var poly = [p1, p2, p3, p4, p1];
50293
50294                         // rotate it to face forward/backward
50295                         var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
50296                         poly = geoRotate(poly, -angle, origin);
50297
50298                         var extent = poly.reduce(function(extent, point) {
50299                             return extent.extend(geoExtent(point));
50300                         }, geoExtent());
50301
50302                         // find nearest other bubble in the search polygon
50303                         var minDist = Infinity;
50304                         _ssCache.bubbles.rtree.search(extent.bbox())
50305                             .forEach(function(d) {
50306                                 if (d.data.key === selected.key) return;
50307                                 if (!geoPointInPolygon(d.data.loc, poly)) return;
50308
50309                                 var dist = geoVecLength(d.data.loc, selected.loc);
50310                                 var theta = selected.ca - d.data.ca;
50311                                 var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
50312                                 if (minTheta > 20) {
50313                                     dist += 5;  // penalize distance if camera angles don't match
50314                                 }
50315
50316                                 if (dist < minDist) {
50317                                     nextID = d.data.key;
50318                                     minDist = dist;
50319                                 }
50320                             });
50321
50322                         var nextBubble = nextID && _ssCache.bubbles.points[nextID];
50323                         if (!nextBubble) return;
50324
50325                         context.map().centerEase(nextBubble.loc);
50326
50327                         that.selectImage(nextBubble)
50328                             .then(function(r) {
50329                                 if (r.status === 'ok') {
50330                                     _sceneOptions.yaw = yaw;
50331                                     that.showViewer();
50332                                 }
50333                             });
50334                     };
50335                 }
50336             },
50337
50338             /**
50339              * showViewer()
50340              */
50341             showViewer: function (yaw) {
50342                 if (!_sceneOptions) return;
50343
50344                 if (yaw !== undefined) {
50345                     _sceneOptions.yaw = yaw;
50346                 }
50347
50348                 if (!_pannellumViewer) {
50349                     this.initViewer();
50350                 } else {
50351                     // make a new scene
50352                     var sceneID = ++_currScene + '';
50353                     _pannellumViewer
50354                         .addScene(sceneID, _sceneOptions)
50355                         .loadScene(sceneID);
50356
50357                     // remove previous scene
50358                     if (_currScene > 2) {
50359                         sceneID = (_currScene - 1) + '';
50360                         _pannellumViewer
50361                             .removeScene(sceneID);
50362                     }
50363                 }
50364
50365                 var wrap = d3_select('#photoviewer')
50366                     .classed('hide', false);
50367
50368                 var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
50369
50370                 if (isHidden) {
50371                     wrap
50372                         .selectAll('.photo-wrapper:not(.ms-wrapper)')
50373                         .classed('hide', true);
50374
50375                     wrap
50376                         .selectAll('.photo-wrapper.ms-wrapper')
50377                         .classed('hide', false);
50378                 }
50379
50380                 return this;
50381             },
50382
50383             /**
50384              * hideViewer()
50385              */
50386             hideViewer: function () {
50387                 var viewer = d3_select('#photoviewer');
50388                 if (!viewer.empty()) viewer.datum(null);
50389
50390                 viewer
50391                     .classed('hide', true)
50392                     .selectAll('.photo-wrapper')
50393                     .classed('hide', true);
50394
50395                 d3_selectAll('.viewfield-group, .sequence, .icon-sign')
50396                     .classed('currentView', false);
50397
50398                 return this.setStyles(null, true);
50399             },
50400
50401             /**
50402              * selectImage().
50403              */
50404             selectImage: function (d) {
50405                 var response = q.defer();
50406                 var that = this;
50407
50408                 var viewer = d3_select('#photoviewer');
50409                 if (!viewer.empty()) viewer.datum(d);
50410
50411                 this.setStyles(null, true);
50412
50413                 var wrap = d3_select('#photoviewer .ms-wrapper');
50414                 var attribution = wrap.selectAll('.photo-attribution').html('');
50415
50416                 wrap.selectAll('.pnlm-load-box')   // display "loading.."
50417                     .style('display', 'block');
50418
50419                 if (!d) {
50420                     response.resolve({status: 'ok'});
50421                     return response.promise;
50422                 }
50423
50424                 var line1 = attribution
50425                     .append('div')
50426                     .attr('class', 'attribution-row');
50427
50428                 // Add hires checkbox
50429                 var label = line1
50430                     .append('label')
50431                     .attr('class', 'streetside-hires');
50432
50433                 label
50434                     .append('input')
50435                     .attr('type', 'checkbox')
50436                     .attr('id', 'streetside-hires-input')
50437                     .property('checked', _hires)
50438                     .on('click', function() {
50439                         event.stopPropagation();
50440
50441                         _hires = !_hires;
50442                         _resolution = _hires ? 1024 : 512;
50443                         wrap.call(setupCanvas, true);
50444
50445                         var viewstate = {
50446                             yaw: _pannellumViewer.getYaw(),
50447                             pitch: _pannellumViewer.getPitch(),
50448                             hfov: _pannellumViewer.getHfov()
50449                         };
50450
50451                         that.selectImage(d)
50452                             .then(function(r) {
50453                                 if (r.status === 'ok') {
50454                                     _sceneOptions = Object.assign(_sceneOptions, viewstate);
50455                                     that.showViewer();
50456                                 }
50457                             });
50458                     });
50459
50460                 label
50461                     .append('span')
50462                     .text(t('streetside.hires'));
50463
50464
50465                 var captureInfo = line1
50466                     .append('div')
50467                     .attr('class', 'attribution-capture-info');
50468
50469                 // Add capture date
50470                 if (d.captured_by) {
50471                     var yyyy = (new Date()).getFullYear();
50472
50473                     captureInfo
50474                         .append('a')
50475                         .attr('class', 'captured_by')
50476                         .attr('target', '_blank')
50477                         .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
50478                         .text('©' + yyyy + ' Microsoft');
50479
50480                     captureInfo
50481                         .append('span')
50482                         .text('|');
50483                 }
50484
50485                 if (d.captured_at) {
50486                     captureInfo
50487                         .append('span')
50488                         .attr('class', 'captured_at')
50489                         .text(localeTimestamp(d.captured_at));
50490                 }
50491
50492                 // Add image links
50493                 var line2 = attribution
50494                     .append('div')
50495                     .attr('class', 'attribution-row');
50496
50497                 line2
50498                     .append('a')
50499                     .attr('class', 'image-view-link')
50500                     .attr('target', '_blank')
50501                     .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
50502                         '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
50503                     .text(t('streetside.view_on_bing'));
50504
50505                 line2
50506                     .append('a')
50507                     .attr('class', 'image-report-link')
50508                     .attr('target', '_blank')
50509                     .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
50510                         '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
50511                     .text(t('streetside.report'));
50512
50513
50514                 var bubbleIdQuadKey = d.key.toString(4);
50515                 var paddingNeeded = 16 - bubbleIdQuadKey.length;
50516                 for (var i = 0; i < paddingNeeded; i++) {
50517                     bubbleIdQuadKey = '0' + bubbleIdQuadKey;
50518                 }
50519                 var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
50520                 var imgUrlSuffix = '.jpg?g=6338&n=z';
50521
50522                 // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
50523                 var faceKeys = ['01','02','03','10','11','12'];
50524
50525                 // Map images to cube faces
50526                 var quadKeys = getQuadKeys();
50527                 var faces = faceKeys.map(function(faceKey) {
50528                     return quadKeys.map(function(quadKey) {
50529                         var xy = qkToXY(quadKey);
50530                         return {
50531                             face: faceKey,
50532                             url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
50533                             x: xy[0],
50534                             y: xy[1]
50535                         };
50536                     });
50537                 });
50538
50539                 processFaces(faces).then(function() {
50540                     _sceneOptions = {
50541                         showFullscreenCtrl: false,
50542                         autoLoad: true,
50543                         compass: true,
50544                         northOffset: d.ca,
50545                         yaw: 0,
50546                         minHfov: minHfov,
50547                         maxHfov: maxHfov,
50548                         hfov: defaultHfov,
50549                         type: 'cubemap',
50550                         cubeMap: [
50551                             _dataUrlArray[0],
50552                             _dataUrlArray[1],
50553                             _dataUrlArray[2],
50554                             _dataUrlArray[3],
50555                             _dataUrlArray[4],
50556                             _dataUrlArray[5]
50557                         ]
50558                     };
50559                     response.resolve({status: 'ok'});
50560                 });
50561
50562                 return response.promise;
50563             },
50564
50565
50566             getSequenceKeyForBubble: function(d) {
50567                 return d && d.sequenceKey;
50568             },
50569
50570
50571             // Updates the currently highlighted sequence and selected bubble.
50572             // Reset is only necessary when interacting with the viewport because
50573             // this implicitly changes the currently selected bubble/sequence
50574             setStyles: function (hovered, reset) {
50575                 if (reset) {  // reset all layers
50576                     d3_selectAll('.viewfield-group')
50577                         .classed('highlighted', false)
50578                         .classed('hovered', false)
50579                         .classed('currentView', false);
50580
50581                     d3_selectAll('.sequence')
50582                         .classed('highlighted', false)
50583                         .classed('currentView', false);
50584                 }
50585
50586                 var hoveredBubbleKey = hovered && hovered.key;
50587                 var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
50588                 var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
50589                 var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
50590
50591                 var viewer = d3_select('#photoviewer');
50592                 var selected = viewer.empty() ? undefined : viewer.datum();
50593                 var selectedBubbleKey = selected && selected.key;
50594                 var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
50595                 var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
50596                 var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
50597
50598                 // highlight sibling viewfields on either the selected or the hovered sequences
50599                 var highlightedBubbleKeys = utilArrayUnion(hoveredBubbleKeys, selectedBubbleKeys);
50600
50601                 d3_selectAll('.layer-streetside-images .viewfield-group')
50602                     .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
50603                     .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
50604                     .classed('currentView', function (d) { return d.key === selectedBubbleKey; });
50605
50606                 d3_selectAll('.layer-streetside-images .sequence')
50607                     .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
50608                     .classed('currentView', function (d) { return d.properties.key === selectedSequenceKey; });
50609
50610                 // update viewfields if needed
50611                 d3_selectAll('.viewfield-group .viewfield')
50612                     .attr('d', viewfieldPath);
50613
50614                 function viewfieldPath() {
50615                     var d = this.parentNode.__data__;
50616                     if (d.pano && d.key !== selectedBubbleKey) {
50617                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
50618                     } else {
50619                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
50620                     }
50621                 }
50622
50623                 return this;
50624             },
50625
50626             /**
50627              * cache().
50628              */
50629             cache: function () {
50630                 return _ssCache;
50631             }
50632         };
50633
50634         var apibase$4 = 'https://taginfo.openstreetmap.org/api/4/';
50635         var _inflight$2 = {};
50636         var _popularKeys = {};
50637         var _taginfoCache = {};
50638
50639         var tag_sorts = {
50640             point: 'count_nodes',
50641             vertex: 'count_nodes',
50642             area: 'count_ways',
50643             line: 'count_ways'
50644         };
50645         var tag_sort_members = {
50646             point: 'count_node_members',
50647             vertex: 'count_node_members',
50648             area: 'count_way_members',
50649             line: 'count_way_members',
50650             relation: 'count_relation_members'
50651         };
50652         var tag_filters = {
50653             point: 'nodes',
50654             vertex: 'nodes',
50655             area: 'ways',
50656             line: 'ways'
50657         };
50658         var tag_members_fractions = {
50659             point: 'count_node_members_fraction',
50660             vertex: 'count_node_members_fraction',
50661             area: 'count_way_members_fraction',
50662             line: 'count_way_members_fraction',
50663             relation: 'count_relation_members_fraction'
50664         };
50665
50666
50667         function sets(params, n, o) {
50668             if (params.geometry && o[params.geometry]) {
50669                 params[n] = o[params.geometry];
50670             }
50671             return params;
50672         }
50673
50674
50675         function setFilter(params) {
50676             return sets(params, 'filter', tag_filters);
50677         }
50678
50679
50680         function setSort(params) {
50681             return sets(params, 'sortname', tag_sorts);
50682         }
50683
50684
50685         function setSortMembers(params) {
50686             return sets(params, 'sortname', tag_sort_members);
50687         }
50688
50689
50690         function clean(params) {
50691             return utilObjectOmit(params, ['geometry', 'debounce']);
50692         }
50693
50694
50695         function filterKeys(type) {
50696             var count_type = type ? 'count_' + type : 'count_all';
50697             return function(d) {
50698                 return parseFloat(d[count_type]) > 2500 || d.in_wiki;
50699             };
50700         }
50701
50702
50703         function filterMultikeys(prefix) {
50704             return function(d) {
50705                 // d.key begins with prefix, and d.key contains no additional ':'s
50706                 var re = new RegExp('^' + prefix + '(.*)$');
50707                 var matches = d.key.match(re) || [];
50708                 return (matches.length === 2 && matches[1].indexOf(':') === -1);
50709             };
50710         }
50711
50712
50713         function filterValues(allowUpperCase) {
50714             return function(d) {
50715                 if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
50716                 if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
50717                 return parseFloat(d.fraction) > 0.0;
50718             };
50719         }
50720
50721
50722         function filterRoles(geometry) {
50723             return function(d) {
50724                 if (d.role === '') return false; // exclude empty role
50725                 if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
50726                 return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
50727             };
50728         }
50729
50730
50731         function valKey(d) {
50732             return {
50733                 value: d.key,
50734                 title: d.key
50735             };
50736         }
50737
50738
50739         function valKeyDescription(d) {
50740             return {
50741                 value: d.value,
50742                 title: d.description || d.value
50743             };
50744         }
50745
50746
50747         function roleKey(d) {
50748             return {
50749                 value: d.role,
50750                 title: d.role
50751             };
50752         }
50753
50754
50755         // sort keys with ':' lower than keys without ':'
50756         function sortKeys(a, b) {
50757             return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
50758                 : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
50759                 : 0;
50760         }
50761
50762
50763         var debouncedRequest$1 = debounce(request$1, 300, { leading: false });
50764
50765         function request$1(url, params, exactMatch, callback, loaded) {
50766             if (_inflight$2[url]) return;
50767
50768             if (checkCache(url, params, exactMatch, callback)) return;
50769
50770             var controller = new AbortController();
50771             _inflight$2[url] = controller;
50772
50773             d3_json(url, { signal: controller.signal })
50774                 .then(function(result) {
50775                     delete _inflight$2[url];
50776                     if (loaded) loaded(null, result);
50777                 })
50778                 .catch(function(err) {
50779                     delete _inflight$2[url];
50780                     if (err.name === 'AbortError') return;
50781                     if (loaded) loaded(err.message);
50782                 });
50783         }
50784
50785
50786         function checkCache(url, params, exactMatch, callback) {
50787             var rp = params.rp || 25;
50788             var testQuery = params.query || '';
50789             var testUrl = url;
50790
50791             do {
50792                 var hit = _taginfoCache[testUrl];
50793
50794                 // exact match, or shorter match yielding fewer than max results (rp)
50795                 if (hit && (url === testUrl || hit.length < rp)) {
50796                     callback(null, hit);
50797                     return true;
50798                 }
50799
50800                 // don't try to shorten the query
50801                 if (exactMatch || !testQuery.length) return false;
50802
50803                 // do shorten the query to see if we already have a cached result
50804                 // that has returned fewer than max results (rp)
50805                 testQuery = testQuery.slice(0, -1);
50806                 testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
50807             } while (testQuery.length >= 0);
50808
50809             return false;
50810         }
50811
50812
50813         var serviceTaginfo = {
50814
50815             init: function() {
50816                 _inflight$2 = {};
50817                 _taginfoCache = {};
50818                 _popularKeys = {
50819                     postal_code: true   // #5377
50820                 };
50821
50822                 // Fetch popular keys.  We'll exclude these from `values`
50823                 // lookups because they stress taginfo, and they aren't likely
50824                 // to yield meaningful autocomplete results.. see #3955
50825                 var params = {
50826                     rp: 100,
50827                     sortname: 'values_all',
50828                     sortorder: 'desc',
50829                     page: 1,
50830                     debounce: false,
50831                     lang: currentLocale
50832                 };
50833                 this.keys(params, function(err, data) {
50834                     if (err) return;
50835                     data.forEach(function(d) {
50836                         if (d.value === 'opening_hours') return;  // exception
50837                         _popularKeys[d.value] = true;
50838                     });
50839                 });
50840             },
50841
50842
50843             reset: function() {
50844                 Object.values(_inflight$2).forEach(function(controller) { controller.abort(); });
50845                 _inflight$2 = {};
50846             },
50847
50848
50849             keys: function(params, callback) {
50850                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50851                 params = clean(setSort(params));
50852                 params = Object.assign({
50853                     rp: 10,
50854                     sortname: 'count_all',
50855                     sortorder: 'desc',
50856                     page: 1,
50857                     lang: currentLocale
50858                 }, params);
50859
50860                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50861                 doRequest(url, params, false, callback, function(err, d) {
50862                     if (err) {
50863                         callback(err);
50864                     } else {
50865                         var f = filterKeys(params.filter);
50866                         var result = d.data.filter(f).sort(sortKeys).map(valKey);
50867                         _taginfoCache[url] = result;
50868                         callback(null, result);
50869                     }
50870                 });
50871             },
50872
50873
50874             multikeys: function(params, callback) {
50875                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50876                 params = clean(setSort(params));
50877                 params = Object.assign({
50878                     rp: 25,
50879                     sortname: 'count_all',
50880                     sortorder: 'desc',
50881                     page: 1,
50882                     lang: currentLocale
50883                 }, params);
50884
50885                 var prefix = params.query;
50886                 var url = apibase$4 + 'keys/all?' + utilQsString(params);
50887                 doRequest(url, params, true, callback, function(err, d) {
50888                     if (err) {
50889                         callback(err);
50890                     } else {
50891                         var f = filterMultikeys(prefix);
50892                         var result = d.data.filter(f).map(valKey);
50893                         _taginfoCache[url] = result;
50894                         callback(null, result);
50895                     }
50896                 });
50897             },
50898
50899
50900             values: function(params, callback) {
50901                 // Exclude popular keys from values lookups.. see #3955
50902                 var key = params.key;
50903                 if (key && _popularKeys[key]) {
50904                     callback(null, []);
50905                     return;
50906                 }
50907
50908                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50909                 params = clean(setSort(setFilter(params)));
50910                 params = Object.assign({
50911                     rp: 25,
50912                     sortname: 'count_all',
50913                     sortorder: 'desc',
50914                     page: 1,
50915                     lang: currentLocale
50916                 }, params);
50917
50918                 var url = apibase$4 + 'key/values?' + utilQsString(params);
50919                 doRequest(url, params, false, callback, function(err, d) {
50920                     if (err) {
50921                         callback(err);
50922                     } else {
50923                         // In most cases we prefer taginfo value results with lowercase letters.
50924                         // A few OSM keys expect values to contain uppercase values (see #3377).
50925                         // This is not an exhaustive list (e.g. `name` also has uppercase values)
50926                         // but these are the fields where taginfo value lookup is most useful.
50927                         var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times|_ref|manufacturer/;
50928                         var allowUpperCase = re.test(params.key);
50929                         var f = filterValues(allowUpperCase);
50930
50931                         var result = d.data.filter(f).map(valKeyDescription);
50932                         _taginfoCache[url] = result;
50933                         callback(null, result);
50934                     }
50935                 });
50936             },
50937
50938
50939             roles: function(params, callback) {
50940                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50941                 var geometry = params.geometry;
50942                 params = clean(setSortMembers(params));
50943                 params = Object.assign({
50944                     rp: 25,
50945                     sortname: 'count_all_members',
50946                     sortorder: 'desc',
50947                     page: 1,
50948                     lang: currentLocale
50949                 }, params);
50950
50951                 var url = apibase$4 + 'relation/roles?' + utilQsString(params);
50952                 doRequest(url, params, true, callback, function(err, d) {
50953                     if (err) {
50954                         callback(err);
50955                     } else {
50956                         var f = filterRoles(geometry);
50957                         var result = d.data.filter(f).map(roleKey);
50958                         _taginfoCache[url] = result;
50959                         callback(null, result);
50960                     }
50961                 });
50962             },
50963
50964
50965             docs: function(params, callback) {
50966                 var doRequest = params.debounce ? debouncedRequest$1 : request$1;
50967                 params = clean(setSort(params));
50968
50969                 var path = 'key/wiki_pages?';
50970                 if (params.value) {
50971                     path = 'tag/wiki_pages?';
50972                 } else if (params.rtype) {
50973                     path = 'relation/wiki_pages?';
50974                 }
50975
50976                 var url = apibase$4 + path + utilQsString(params);
50977                 doRequest(url, params, true, callback, function(err, d) {
50978                     if (err) {
50979                         callback(err);
50980                     } else {
50981                         _taginfoCache[url] = d.data;
50982                         callback(null, d.data);
50983                     }
50984                 });
50985             },
50986
50987
50988             apibase: function(_) {
50989                 if (!arguments.length) return apibase$4;
50990                 apibase$4 = _;
50991                 return this;
50992             }
50993
50994         };
50995
50996         var helpers = createCommonjsModule(function (module, exports) {
50997         Object.defineProperty(exports, "__esModule", { value: true });
50998         /**
50999          * @module helpers
51000          */
51001         /**
51002          * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
51003          *
51004          * @memberof helpers
51005          * @type {number}
51006          */
51007         exports.earthRadius = 6371008.8;
51008         /**
51009          * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
51010          *
51011          * @memberof helpers
51012          * @type {Object}
51013          */
51014         exports.factors = {
51015             centimeters: exports.earthRadius * 100,
51016             centimetres: exports.earthRadius * 100,
51017             degrees: exports.earthRadius / 111325,
51018             feet: exports.earthRadius * 3.28084,
51019             inches: exports.earthRadius * 39.370,
51020             kilometers: exports.earthRadius / 1000,
51021             kilometres: exports.earthRadius / 1000,
51022             meters: exports.earthRadius,
51023             metres: exports.earthRadius,
51024             miles: exports.earthRadius / 1609.344,
51025             millimeters: exports.earthRadius * 1000,
51026             millimetres: exports.earthRadius * 1000,
51027             nauticalmiles: exports.earthRadius / 1852,
51028             radians: 1,
51029             yards: exports.earthRadius / 1.0936,
51030         };
51031         /**
51032          * Units of measurement factors based on 1 meter.
51033          *
51034          * @memberof helpers
51035          * @type {Object}
51036          */
51037         exports.unitsFactors = {
51038             centimeters: 100,
51039             centimetres: 100,
51040             degrees: 1 / 111325,
51041             feet: 3.28084,
51042             inches: 39.370,
51043             kilometers: 1 / 1000,
51044             kilometres: 1 / 1000,
51045             meters: 1,
51046             metres: 1,
51047             miles: 1 / 1609.344,
51048             millimeters: 1000,
51049             millimetres: 1000,
51050             nauticalmiles: 1 / 1852,
51051             radians: 1 / exports.earthRadius,
51052             yards: 1 / 1.0936,
51053         };
51054         /**
51055          * Area of measurement factors based on 1 square meter.
51056          *
51057          * @memberof helpers
51058          * @type {Object}
51059          */
51060         exports.areaFactors = {
51061             acres: 0.000247105,
51062             centimeters: 10000,
51063             centimetres: 10000,
51064             feet: 10.763910417,
51065             inches: 1550.003100006,
51066             kilometers: 0.000001,
51067             kilometres: 0.000001,
51068             meters: 1,
51069             metres: 1,
51070             miles: 3.86e-7,
51071             millimeters: 1000000,
51072             millimetres: 1000000,
51073             yards: 1.195990046,
51074         };
51075         /**
51076          * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
51077          *
51078          * @name feature
51079          * @param {Geometry} geometry input geometry
51080          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51081          * @param {Object} [options={}] Optional Parameters
51082          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51083          * @param {string|number} [options.id] Identifier associated with the Feature
51084          * @returns {Feature} a GeoJSON Feature
51085          * @example
51086          * var geometry = {
51087          *   "type": "Point",
51088          *   "coordinates": [110, 50]
51089          * };
51090          *
51091          * var feature = turf.feature(geometry);
51092          *
51093          * //=feature
51094          */
51095         function feature(geom, properties, options) {
51096             if (options === void 0) { options = {}; }
51097             var feat = { type: "Feature" };
51098             if (options.id === 0 || options.id) {
51099                 feat.id = options.id;
51100             }
51101             if (options.bbox) {
51102                 feat.bbox = options.bbox;
51103             }
51104             feat.properties = properties || {};
51105             feat.geometry = geom;
51106             return feat;
51107         }
51108         exports.feature = feature;
51109         /**
51110          * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
51111          * For GeometryCollection type use `helpers.geometryCollection`
51112          *
51113          * @name geometry
51114          * @param {string} type Geometry Type
51115          * @param {Array<any>} coordinates Coordinates
51116          * @param {Object} [options={}] Optional Parameters
51117          * @returns {Geometry} a GeoJSON Geometry
51118          * @example
51119          * var type = "Point";
51120          * var coordinates = [110, 50];
51121          * var geometry = turf.geometry(type, coordinates);
51122          * // => geometry
51123          */
51124         function geometry(type, coordinates, options) {
51125             if (options === void 0) { options = {}; }
51126             switch (type) {
51127                 case "Point": return point(coordinates).geometry;
51128                 case "LineString": return lineString(coordinates).geometry;
51129                 case "Polygon": return polygon(coordinates).geometry;
51130                 case "MultiPoint": return multiPoint(coordinates).geometry;
51131                 case "MultiLineString": return multiLineString(coordinates).geometry;
51132                 case "MultiPolygon": return multiPolygon(coordinates).geometry;
51133                 default: throw new Error(type + " is invalid");
51134             }
51135         }
51136         exports.geometry = geometry;
51137         /**
51138          * Creates a {@link Point} {@link Feature} from a Position.
51139          *
51140          * @name point
51141          * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
51142          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51143          * @param {Object} [options={}] Optional Parameters
51144          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51145          * @param {string|number} [options.id] Identifier associated with the Feature
51146          * @returns {Feature<Point>} a Point feature
51147          * @example
51148          * var point = turf.point([-75.343, 39.984]);
51149          *
51150          * //=point
51151          */
51152         function point(coordinates, properties, options) {
51153             if (options === void 0) { options = {}; }
51154             var geom = {
51155                 type: "Point",
51156                 coordinates: coordinates,
51157             };
51158             return feature(geom, properties, options);
51159         }
51160         exports.point = point;
51161         /**
51162          * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
51163          *
51164          * @name points
51165          * @param {Array<Array<number>>} coordinates an array of Points
51166          * @param {Object} [properties={}] Translate these properties to each Feature
51167          * @param {Object} [options={}] Optional Parameters
51168          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51169          * associated with the FeatureCollection
51170          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51171          * @returns {FeatureCollection<Point>} Point Feature
51172          * @example
51173          * var points = turf.points([
51174          *   [-75, 39],
51175          *   [-80, 45],
51176          *   [-78, 50]
51177          * ]);
51178          *
51179          * //=points
51180          */
51181         function points(coordinates, properties, options) {
51182             if (options === void 0) { options = {}; }
51183             return featureCollection(coordinates.map(function (coords) {
51184                 return point(coords, properties);
51185             }), options);
51186         }
51187         exports.points = points;
51188         /**
51189          * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
51190          *
51191          * @name polygon
51192          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51193          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51194          * @param {Object} [options={}] Optional Parameters
51195          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51196          * @param {string|number} [options.id] Identifier associated with the Feature
51197          * @returns {Feature<Polygon>} Polygon Feature
51198          * @example
51199          * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
51200          *
51201          * //=polygon
51202          */
51203         function polygon(coordinates, properties, options) {
51204             if (options === void 0) { options = {}; }
51205             for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
51206                 var ring = coordinates_1[_i];
51207                 if (ring.length < 4) {
51208                     throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
51209                 }
51210                 for (var j = 0; j < ring[ring.length - 1].length; j++) {
51211                     // Check if first point of Polygon contains two numbers
51212                     if (ring[ring.length - 1][j] !== ring[0][j]) {
51213                         throw new Error("First and last Position are not equivalent.");
51214                     }
51215                 }
51216             }
51217             var geom = {
51218                 type: "Polygon",
51219                 coordinates: coordinates,
51220             };
51221             return feature(geom, properties, options);
51222         }
51223         exports.polygon = polygon;
51224         /**
51225          * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
51226          *
51227          * @name polygons
51228          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
51229          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51230          * @param {Object} [options={}] Optional Parameters
51231          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51232          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51233          * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
51234          * @example
51235          * var polygons = turf.polygons([
51236          *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
51237          *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
51238          * ]);
51239          *
51240          * //=polygons
51241          */
51242         function polygons(coordinates, properties, options) {
51243             if (options === void 0) { options = {}; }
51244             return featureCollection(coordinates.map(function (coords) {
51245                 return polygon(coords, properties);
51246             }), options);
51247         }
51248         exports.polygons = polygons;
51249         /**
51250          * Creates a {@link LineString} {@link Feature} from an Array of Positions.
51251          *
51252          * @name lineString
51253          * @param {Array<Array<number>>} coordinates an array of Positions
51254          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51255          * @param {Object} [options={}] Optional Parameters
51256          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51257          * @param {string|number} [options.id] Identifier associated with the Feature
51258          * @returns {Feature<LineString>} LineString Feature
51259          * @example
51260          * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
51261          * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
51262          *
51263          * //=linestring1
51264          * //=linestring2
51265          */
51266         function lineString(coordinates, properties, options) {
51267             if (options === void 0) { options = {}; }
51268             if (coordinates.length < 2) {
51269                 throw new Error("coordinates must be an array of two or more positions");
51270             }
51271             var geom = {
51272                 type: "LineString",
51273                 coordinates: coordinates,
51274             };
51275             return feature(geom, properties, options);
51276         }
51277         exports.lineString = lineString;
51278         /**
51279          * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
51280          *
51281          * @name lineStrings
51282          * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
51283          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51284          * @param {Object} [options={}] Optional Parameters
51285          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
51286          * associated with the FeatureCollection
51287          * @param {string|number} [options.id] Identifier associated with the FeatureCollection
51288          * @returns {FeatureCollection<LineString>} LineString FeatureCollection
51289          * @example
51290          * var linestrings = turf.lineStrings([
51291          *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
51292          *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
51293          * ]);
51294          *
51295          * //=linestrings
51296          */
51297         function lineStrings(coordinates, properties, options) {
51298             if (options === void 0) { options = {}; }
51299             return featureCollection(coordinates.map(function (coords) {
51300                 return lineString(coords, properties);
51301             }), options);
51302         }
51303         exports.lineStrings = lineStrings;
51304         /**
51305          * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
51306          *
51307          * @name featureCollection
51308          * @param {Feature[]} features input features
51309          * @param {Object} [options={}] Optional Parameters
51310          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51311          * @param {string|number} [options.id] Identifier associated with the Feature
51312          * @returns {FeatureCollection} FeatureCollection of Features
51313          * @example
51314          * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
51315          * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
51316          * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
51317          *
51318          * var collection = turf.featureCollection([
51319          *   locationA,
51320          *   locationB,
51321          *   locationC
51322          * ]);
51323          *
51324          * //=collection
51325          */
51326         function featureCollection(features, options) {
51327             if (options === void 0) { options = {}; }
51328             var fc = { type: "FeatureCollection" };
51329             if (options.id) {
51330                 fc.id = options.id;
51331             }
51332             if (options.bbox) {
51333                 fc.bbox = options.bbox;
51334             }
51335             fc.features = features;
51336             return fc;
51337         }
51338         exports.featureCollection = featureCollection;
51339         /**
51340          * Creates a {@link Feature<MultiLineString>} based on a
51341          * coordinate array. Properties can be added optionally.
51342          *
51343          * @name multiLineString
51344          * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
51345          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51346          * @param {Object} [options={}] Optional Parameters
51347          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51348          * @param {string|number} [options.id] Identifier associated with the Feature
51349          * @returns {Feature<MultiLineString>} a MultiLineString feature
51350          * @throws {Error} if no coordinates are passed
51351          * @example
51352          * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
51353          *
51354          * //=multiLine
51355          */
51356         function multiLineString(coordinates, properties, options) {
51357             if (options === void 0) { options = {}; }
51358             var geom = {
51359                 type: "MultiLineString",
51360                 coordinates: coordinates,
51361             };
51362             return feature(geom, properties, options);
51363         }
51364         exports.multiLineString = multiLineString;
51365         /**
51366          * Creates a {@link Feature<MultiPoint>} based on a
51367          * coordinate array. Properties can be added optionally.
51368          *
51369          * @name multiPoint
51370          * @param {Array<Array<number>>} coordinates an array of Positions
51371          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51372          * @param {Object} [options={}] Optional Parameters
51373          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51374          * @param {string|number} [options.id] Identifier associated with the Feature
51375          * @returns {Feature<MultiPoint>} a MultiPoint feature
51376          * @throws {Error} if no coordinates are passed
51377          * @example
51378          * var multiPt = turf.multiPoint([[0,0],[10,10]]);
51379          *
51380          * //=multiPt
51381          */
51382         function multiPoint(coordinates, properties, options) {
51383             if (options === void 0) { options = {}; }
51384             var geom = {
51385                 type: "MultiPoint",
51386                 coordinates: coordinates,
51387             };
51388             return feature(geom, properties, options);
51389         }
51390         exports.multiPoint = multiPoint;
51391         /**
51392          * Creates a {@link Feature<MultiPolygon>} based on a
51393          * coordinate array. Properties can be added optionally.
51394          *
51395          * @name multiPolygon
51396          * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
51397          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51398          * @param {Object} [options={}] Optional Parameters
51399          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51400          * @param {string|number} [options.id] Identifier associated with the Feature
51401          * @returns {Feature<MultiPolygon>} a multipolygon feature
51402          * @throws {Error} if no coordinates are passed
51403          * @example
51404          * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
51405          *
51406          * //=multiPoly
51407          *
51408          */
51409         function multiPolygon(coordinates, properties, options) {
51410             if (options === void 0) { options = {}; }
51411             var geom = {
51412                 type: "MultiPolygon",
51413                 coordinates: coordinates,
51414             };
51415             return feature(geom, properties, options);
51416         }
51417         exports.multiPolygon = multiPolygon;
51418         /**
51419          * Creates a {@link Feature<GeometryCollection>} based on a
51420          * coordinate array. Properties can be added optionally.
51421          *
51422          * @name geometryCollection
51423          * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
51424          * @param {Object} [properties={}] an Object of key-value pairs to add as properties
51425          * @param {Object} [options={}] Optional Parameters
51426          * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
51427          * @param {string|number} [options.id] Identifier associated with the Feature
51428          * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
51429          * @example
51430          * var pt = turf.geometry("Point", [100, 0]);
51431          * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
51432          * var collection = turf.geometryCollection([pt, line]);
51433          *
51434          * // => collection
51435          */
51436         function geometryCollection(geometries, properties, options) {
51437             if (options === void 0) { options = {}; }
51438             var geom = {
51439                 type: "GeometryCollection",
51440                 geometries: geometries,
51441             };
51442             return feature(geom, properties, options);
51443         }
51444         exports.geometryCollection = geometryCollection;
51445         /**
51446          * Round number to precision
51447          *
51448          * @param {number} num Number
51449          * @param {number} [precision=0] Precision
51450          * @returns {number} rounded number
51451          * @example
51452          * turf.round(120.4321)
51453          * //=120
51454          *
51455          * turf.round(120.4321, 2)
51456          * //=120.43
51457          */
51458         function round(num, precision) {
51459             if (precision === void 0) { precision = 0; }
51460             if (precision && !(precision >= 0)) {
51461                 throw new Error("precision must be a positive number");
51462             }
51463             var multiplier = Math.pow(10, precision || 0);
51464             return Math.round(num * multiplier) / multiplier;
51465         }
51466         exports.round = round;
51467         /**
51468          * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
51469          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51470          *
51471          * @name radiansToLength
51472          * @param {number} radians in radians across the sphere
51473          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51474          * meters, kilometres, kilometers.
51475          * @returns {number} distance
51476          */
51477         function radiansToLength(radians, units) {
51478             if (units === void 0) { units = "kilometers"; }
51479             var factor = exports.factors[units];
51480             if (!factor) {
51481                 throw new Error(units + " units is invalid");
51482             }
51483             return radians * factor;
51484         }
51485         exports.radiansToLength = radiansToLength;
51486         /**
51487          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
51488          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51489          *
51490          * @name lengthToRadians
51491          * @param {number} distance in real units
51492          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51493          * meters, kilometres, kilometers.
51494          * @returns {number} radians
51495          */
51496         function lengthToRadians(distance, units) {
51497             if (units === void 0) { units = "kilometers"; }
51498             var factor = exports.factors[units];
51499             if (!factor) {
51500                 throw new Error(units + " units is invalid");
51501             }
51502             return distance / factor;
51503         }
51504         exports.lengthToRadians = lengthToRadians;
51505         /**
51506          * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
51507          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
51508          *
51509          * @name lengthToDegrees
51510          * @param {number} distance in real units
51511          * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
51512          * meters, kilometres, kilometers.
51513          * @returns {number} degrees
51514          */
51515         function lengthToDegrees(distance, units) {
51516             return radiansToDegrees(lengthToRadians(distance, units));
51517         }
51518         exports.lengthToDegrees = lengthToDegrees;
51519         /**
51520          * Converts any bearing angle from the north line direction (positive clockwise)
51521          * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
51522          *
51523          * @name bearingToAzimuth
51524          * @param {number} bearing angle, between -180 and +180 degrees
51525          * @returns {number} angle between 0 and 360 degrees
51526          */
51527         function bearingToAzimuth(bearing) {
51528             var angle = bearing % 360;
51529             if (angle < 0) {
51530                 angle += 360;
51531             }
51532             return angle;
51533         }
51534         exports.bearingToAzimuth = bearingToAzimuth;
51535         /**
51536          * Converts an angle in radians to degrees
51537          *
51538          * @name radiansToDegrees
51539          * @param {number} radians angle in radians
51540          * @returns {number} degrees between 0 and 360 degrees
51541          */
51542         function radiansToDegrees(radians) {
51543             var degrees = radians % (2 * Math.PI);
51544             return degrees * 180 / Math.PI;
51545         }
51546         exports.radiansToDegrees = radiansToDegrees;
51547         /**
51548          * Converts an angle in degrees to radians
51549          *
51550          * @name degreesToRadians
51551          * @param {number} degrees angle between 0 and 360 degrees
51552          * @returns {number} angle in radians
51553          */
51554         function degreesToRadians(degrees) {
51555             var radians = degrees % 360;
51556             return radians * Math.PI / 180;
51557         }
51558         exports.degreesToRadians = degreesToRadians;
51559         /**
51560          * Converts a length to the requested unit.
51561          * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
51562          *
51563          * @param {number} length to be converted
51564          * @param {Units} [originalUnit="kilometers"] of the length
51565          * @param {Units} [finalUnit="kilometers"] returned unit
51566          * @returns {number} the converted length
51567          */
51568         function convertLength(length, originalUnit, finalUnit) {
51569             if (originalUnit === void 0) { originalUnit = "kilometers"; }
51570             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51571             if (!(length >= 0)) {
51572                 throw new Error("length must be a positive number");
51573             }
51574             return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
51575         }
51576         exports.convertLength = convertLength;
51577         /**
51578          * Converts a area to the requested unit.
51579          * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
51580          * @param {number} area to be converted
51581          * @param {Units} [originalUnit="meters"] of the distance
51582          * @param {Units} [finalUnit="kilometers"] returned unit
51583          * @returns {number} the converted distance
51584          */
51585         function convertArea(area, originalUnit, finalUnit) {
51586             if (originalUnit === void 0) { originalUnit = "meters"; }
51587             if (finalUnit === void 0) { finalUnit = "kilometers"; }
51588             if (!(area >= 0)) {
51589                 throw new Error("area must be a positive number");
51590             }
51591             var startFactor = exports.areaFactors[originalUnit];
51592             if (!startFactor) {
51593                 throw new Error("invalid original units");
51594             }
51595             var finalFactor = exports.areaFactors[finalUnit];
51596             if (!finalFactor) {
51597                 throw new Error("invalid final units");
51598             }
51599             return (area / startFactor) * finalFactor;
51600         }
51601         exports.convertArea = convertArea;
51602         /**
51603          * isNumber
51604          *
51605          * @param {*} num Number to validate
51606          * @returns {boolean} true/false
51607          * @example
51608          * turf.isNumber(123)
51609          * //=true
51610          * turf.isNumber('foo')
51611          * //=false
51612          */
51613         function isNumber(num) {
51614             return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
51615         }
51616         exports.isNumber = isNumber;
51617         /**
51618          * isObject
51619          *
51620          * @param {*} input variable to validate
51621          * @returns {boolean} true/false
51622          * @example
51623          * turf.isObject({elevation: 10})
51624          * //=true
51625          * turf.isObject('foo')
51626          * //=false
51627          */
51628         function isObject(input) {
51629             return (!!input) && (input.constructor === Object);
51630         }
51631         exports.isObject = isObject;
51632         /**
51633          * Validate BBox
51634          *
51635          * @private
51636          * @param {Array<number>} bbox BBox to validate
51637          * @returns {void}
51638          * @throws Error if BBox is not valid
51639          * @example
51640          * validateBBox([-180, -40, 110, 50])
51641          * //=OK
51642          * validateBBox([-180, -40])
51643          * //=Error
51644          * validateBBox('Foo')
51645          * //=Error
51646          * validateBBox(5)
51647          * //=Error
51648          * validateBBox(null)
51649          * //=Error
51650          * validateBBox(undefined)
51651          * //=Error
51652          */
51653         function validateBBox(bbox) {
51654             if (!bbox) {
51655                 throw new Error("bbox is required");
51656             }
51657             if (!Array.isArray(bbox)) {
51658                 throw new Error("bbox must be an Array");
51659             }
51660             if (bbox.length !== 4 && bbox.length !== 6) {
51661                 throw new Error("bbox must be an Array of 4 or 6 numbers");
51662             }
51663             bbox.forEach(function (num) {
51664                 if (!isNumber(num)) {
51665                     throw new Error("bbox must only contain numbers");
51666                 }
51667             });
51668         }
51669         exports.validateBBox = validateBBox;
51670         /**
51671          * Validate Id
51672          *
51673          * @private
51674          * @param {string|number} id Id to validate
51675          * @returns {void}
51676          * @throws Error if Id is not valid
51677          * @example
51678          * validateId([-180, -40, 110, 50])
51679          * //=Error
51680          * validateId([-180, -40])
51681          * //=Error
51682          * validateId('Foo')
51683          * //=OK
51684          * validateId(5)
51685          * //=OK
51686          * validateId(null)
51687          * //=Error
51688          * validateId(undefined)
51689          * //=Error
51690          */
51691         function validateId(id) {
51692             if (!id) {
51693                 throw new Error("id is required");
51694             }
51695             if (["string", "number"].indexOf(typeof id) === -1) {
51696                 throw new Error("id must be a number or a string");
51697             }
51698         }
51699         exports.validateId = validateId;
51700         // Deprecated methods
51701         function radians2degrees() {
51702             throw new Error("method has been renamed to `radiansToDegrees`");
51703         }
51704         exports.radians2degrees = radians2degrees;
51705         function degrees2radians() {
51706             throw new Error("method has been renamed to `degreesToRadians`");
51707         }
51708         exports.degrees2radians = degrees2radians;
51709         function distanceToDegrees() {
51710             throw new Error("method has been renamed to `lengthToDegrees`");
51711         }
51712         exports.distanceToDegrees = distanceToDegrees;
51713         function distanceToRadians() {
51714             throw new Error("method has been renamed to `lengthToRadians`");
51715         }
51716         exports.distanceToRadians = distanceToRadians;
51717         function radiansToDistance() {
51718             throw new Error("method has been renamed to `radiansToLength`");
51719         }
51720         exports.radiansToDistance = radiansToDistance;
51721         function bearingToAngle() {
51722             throw new Error("method has been renamed to `bearingToAzimuth`");
51723         }
51724         exports.bearingToAngle = bearingToAngle;
51725         function convertDistance() {
51726             throw new Error("method has been renamed to `convertLength`");
51727         }
51728         exports.convertDistance = convertDistance;
51729         });
51730
51731         unwrapExports(helpers);
51732         var helpers_1 = helpers.earthRadius;
51733         var helpers_2 = helpers.factors;
51734         var helpers_3 = helpers.unitsFactors;
51735         var helpers_4 = helpers.areaFactors;
51736         var helpers_5 = helpers.feature;
51737         var helpers_6 = helpers.geometry;
51738         var helpers_7 = helpers.point;
51739         var helpers_8 = helpers.points;
51740         var helpers_9 = helpers.polygon;
51741         var helpers_10 = helpers.polygons;
51742         var helpers_11 = helpers.lineString;
51743         var helpers_12 = helpers.lineStrings;
51744         var helpers_13 = helpers.featureCollection;
51745         var helpers_14 = helpers.multiLineString;
51746         var helpers_15 = helpers.multiPoint;
51747         var helpers_16 = helpers.multiPolygon;
51748         var helpers_17 = helpers.geometryCollection;
51749         var helpers_18 = helpers.round;
51750         var helpers_19 = helpers.radiansToLength;
51751         var helpers_20 = helpers.lengthToRadians;
51752         var helpers_21 = helpers.lengthToDegrees;
51753         var helpers_22 = helpers.bearingToAzimuth;
51754         var helpers_23 = helpers.radiansToDegrees;
51755         var helpers_24 = helpers.degreesToRadians;
51756         var helpers_25 = helpers.convertLength;
51757         var helpers_26 = helpers.convertArea;
51758         var helpers_27 = helpers.isNumber;
51759         var helpers_28 = helpers.isObject;
51760         var helpers_29 = helpers.validateBBox;
51761         var helpers_30 = helpers.validateId;
51762         var helpers_31 = helpers.radians2degrees;
51763         var helpers_32 = helpers.degrees2radians;
51764         var helpers_33 = helpers.distanceToDegrees;
51765         var helpers_34 = helpers.distanceToRadians;
51766         var helpers_35 = helpers.radiansToDistance;
51767         var helpers_36 = helpers.bearingToAngle;
51768         var helpers_37 = helpers.convertDistance;
51769
51770         var invariant = createCommonjsModule(function (module, exports) {
51771         Object.defineProperty(exports, "__esModule", { value: true });
51772
51773         /**
51774          * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
51775          *
51776          * @name getCoord
51777          * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
51778          * @returns {Array<number>} coordinates
51779          * @example
51780          * var pt = turf.point([10, 10]);
51781          *
51782          * var coord = turf.getCoord(pt);
51783          * //= [10, 10]
51784          */
51785         function getCoord(coord) {
51786             if (!coord) {
51787                 throw new Error("coord is required");
51788             }
51789             if (!Array.isArray(coord)) {
51790                 if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
51791                     return coord.geometry.coordinates;
51792                 }
51793                 if (coord.type === "Point") {
51794                     return coord.coordinates;
51795                 }
51796             }
51797             if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
51798                 return coord;
51799             }
51800             throw new Error("coord must be GeoJSON Point or an Array of numbers");
51801         }
51802         exports.getCoord = getCoord;
51803         /**
51804          * Unwrap coordinates from a Feature, Geometry Object or an Array
51805          *
51806          * @name getCoords
51807          * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
51808          * @returns {Array<any>} coordinates
51809          * @example
51810          * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
51811          *
51812          * var coords = turf.getCoords(poly);
51813          * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
51814          */
51815         function getCoords(coords) {
51816             if (Array.isArray(coords)) {
51817                 return coords;
51818             }
51819             // Feature
51820             if (coords.type === "Feature") {
51821                 if (coords.geometry !== null) {
51822                     return coords.geometry.coordinates;
51823                 }
51824             }
51825             else {
51826                 // Geometry
51827                 if (coords.coordinates) {
51828                     return coords.coordinates;
51829                 }
51830             }
51831             throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
51832         }
51833         exports.getCoords = getCoords;
51834         /**
51835          * Checks if coordinates contains a number
51836          *
51837          * @name containsNumber
51838          * @param {Array<any>} coordinates GeoJSON Coordinates
51839          * @returns {boolean} true if Array contains a number
51840          */
51841         function containsNumber(coordinates) {
51842             if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
51843                 return true;
51844             }
51845             if (Array.isArray(coordinates[0]) && coordinates[0].length) {
51846                 return containsNumber(coordinates[0]);
51847             }
51848             throw new Error("coordinates must only contain numbers");
51849         }
51850         exports.containsNumber = containsNumber;
51851         /**
51852          * Enforce expectations about types of GeoJSON objects for Turf.
51853          *
51854          * @name geojsonType
51855          * @param {GeoJSON} value any GeoJSON object
51856          * @param {string} type expected GeoJSON type
51857          * @param {string} name name of calling function
51858          * @throws {Error} if value is not the expected type.
51859          */
51860         function geojsonType(value, type, name) {
51861             if (!type || !name) {
51862                 throw new Error("type and name required");
51863             }
51864             if (!value || value.type !== type) {
51865                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
51866             }
51867         }
51868         exports.geojsonType = geojsonType;
51869         /**
51870          * Enforce expectations about types of {@link Feature} inputs for Turf.
51871          * Internally this uses {@link geojsonType} to judge geometry types.
51872          *
51873          * @name featureOf
51874          * @param {Feature} feature a feature with an expected geometry type
51875          * @param {string} type expected GeoJSON type
51876          * @param {string} name name of calling function
51877          * @throws {Error} error if value is not the expected type.
51878          */
51879         function featureOf(feature, type, name) {
51880             if (!feature) {
51881                 throw new Error("No feature passed");
51882             }
51883             if (!name) {
51884                 throw new Error(".featureOf() requires a name");
51885             }
51886             if (!feature || feature.type !== "Feature" || !feature.geometry) {
51887                 throw new Error("Invalid input to " + name + ", Feature with geometry required");
51888             }
51889             if (!feature.geometry || feature.geometry.type !== type) {
51890                 throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51891             }
51892         }
51893         exports.featureOf = featureOf;
51894         /**
51895          * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
51896          * Internally this uses {@link geojsonType} to judge geometry types.
51897          *
51898          * @name collectionOf
51899          * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
51900          * @param {string} type expected GeoJSON type
51901          * @param {string} name name of calling function
51902          * @throws {Error} if value is not the expected type.
51903          */
51904         function collectionOf(featureCollection, type, name) {
51905             if (!featureCollection) {
51906                 throw new Error("No featureCollection passed");
51907             }
51908             if (!name) {
51909                 throw new Error(".collectionOf() requires a name");
51910             }
51911             if (!featureCollection || featureCollection.type !== "FeatureCollection") {
51912                 throw new Error("Invalid input to " + name + ", FeatureCollection required");
51913             }
51914             for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
51915                 var feature = _a[_i];
51916                 if (!feature || feature.type !== "Feature" || !feature.geometry) {
51917                     throw new Error("Invalid input to " + name + ", Feature with geometry required");
51918                 }
51919                 if (!feature.geometry || feature.geometry.type !== type) {
51920                     throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
51921                 }
51922             }
51923         }
51924         exports.collectionOf = collectionOf;
51925         /**
51926          * Get Geometry from Feature or Geometry Object
51927          *
51928          * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
51929          * @returns {Geometry|null} GeoJSON Geometry Object
51930          * @throws {Error} if geojson is not a Feature or Geometry Object
51931          * @example
51932          * var point = {
51933          *   "type": "Feature",
51934          *   "properties": {},
51935          *   "geometry": {
51936          *     "type": "Point",
51937          *     "coordinates": [110, 40]
51938          *   }
51939          * }
51940          * var geom = turf.getGeom(point)
51941          * //={"type": "Point", "coordinates": [110, 40]}
51942          */
51943         function getGeom(geojson) {
51944             if (geojson.type === "Feature") {
51945                 return geojson.geometry;
51946             }
51947             return geojson;
51948         }
51949         exports.getGeom = getGeom;
51950         /**
51951          * Get GeoJSON object's type, Geometry type is prioritize.
51952          *
51953          * @param {GeoJSON} geojson GeoJSON object
51954          * @param {string} [name="geojson"] name of the variable to display in error message
51955          * @returns {string} GeoJSON type
51956          * @example
51957          * var point = {
51958          *   "type": "Feature",
51959          *   "properties": {},
51960          *   "geometry": {
51961          *     "type": "Point",
51962          *     "coordinates": [110, 40]
51963          *   }
51964          * }
51965          * var geom = turf.getType(point)
51966          * //="Point"
51967          */
51968         function getType(geojson, name) {
51969             if (geojson.type === "FeatureCollection") {
51970                 return "FeatureCollection";
51971             }
51972             if (geojson.type === "GeometryCollection") {
51973                 return "GeometryCollection";
51974             }
51975             if (geojson.type === "Feature" && geojson.geometry !== null) {
51976                 return geojson.geometry.type;
51977             }
51978             return geojson.type;
51979         }
51980         exports.getType = getType;
51981         });
51982
51983         unwrapExports(invariant);
51984         var invariant_1 = invariant.getCoord;
51985         var invariant_2 = invariant.getCoords;
51986         var invariant_3 = invariant.containsNumber;
51987         var invariant_4 = invariant.geojsonType;
51988         var invariant_5 = invariant.featureOf;
51989         var invariant_6 = invariant.collectionOf;
51990         var invariant_7 = invariant.getGeom;
51991         var invariant_8 = invariant.getType;
51992
51993         var lineclip_1$1 = lineclip$1;
51994         var default_1$1 = lineclip$1;
51995
51996         lineclip$1.polyline = lineclip$1;
51997         lineclip$1.polygon = polygonclip$1;
51998
51999
52000         // Cohen-Sutherland line clippign algorithm, adapted to efficiently
52001         // handle polylines rather than just segments
52002
52003         function lineclip$1(points, bbox, result) {
52004
52005             var len = points.length,
52006                 codeA = bitCode$1(points[0], bbox),
52007                 part = [],
52008                 i, a, b, codeB, lastCode;
52009
52010             if (!result) result = [];
52011
52012             for (i = 1; i < len; i++) {
52013                 a = points[i - 1];
52014                 b = points[i];
52015                 codeB = lastCode = bitCode$1(b, bbox);
52016
52017                 while (true) {
52018
52019                     if (!(codeA | codeB)) { // accept
52020                         part.push(a);
52021
52022                         if (codeB !== lastCode) { // segment went outside
52023                             part.push(b);
52024
52025                             if (i < len - 1) { // start a new line
52026                                 result.push(part);
52027                                 part = [];
52028                             }
52029                         } else if (i === len - 1) {
52030                             part.push(b);
52031                         }
52032                         break;
52033
52034                     } else if (codeA & codeB) { // trivial reject
52035                         break;
52036
52037                     } else if (codeA) { // a outside, intersect with clip edge
52038                         a = intersect$2(a, b, codeA, bbox);
52039                         codeA = bitCode$1(a, bbox);
52040
52041                     } else { // b outside
52042                         b = intersect$2(a, b, codeB, bbox);
52043                         codeB = bitCode$1(b, bbox);
52044                     }
52045                 }
52046
52047                 codeA = lastCode;
52048             }
52049
52050             if (part.length) result.push(part);
52051
52052             return result;
52053         }
52054
52055         // Sutherland-Hodgeman polygon clipping algorithm
52056
52057         function polygonclip$1(points, bbox) {
52058
52059             var result, edge, prev, prevInside, i, p, inside;
52060
52061             // clip against each side of the clip rectangle
52062             for (edge = 1; edge <= 8; edge *= 2) {
52063                 result = [];
52064                 prev = points[points.length - 1];
52065                 prevInside = !(bitCode$1(prev, bbox) & edge);
52066
52067                 for (i = 0; i < points.length; i++) {
52068                     p = points[i];
52069                     inside = !(bitCode$1(p, bbox) & edge);
52070
52071                     // if segment goes through the clip window, add an intersection
52072                     if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
52073
52074                     if (inside) result.push(p); // add a point if it's inside
52075
52076                     prev = p;
52077                     prevInside = inside;
52078                 }
52079
52080                 points = result;
52081
52082                 if (!points.length) break;
52083             }
52084
52085             return result;
52086         }
52087
52088         // intersect a segment against one of the 4 lines that make up the bbox
52089
52090         function intersect$2(a, b, edge, bbox) {
52091             return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
52092                    edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
52093                    edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
52094                    edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
52095                    null;
52096         }
52097
52098         // bit code reflects the point position relative to the bbox:
52099
52100         //         left  mid  right
52101         //    top  1001  1000  1010
52102         //    mid  0001  0000  0010
52103         // bottom  0101  0100  0110
52104
52105         function bitCode$1(p, bbox) {
52106             var code = 0;
52107
52108             if (p[0] < bbox[0]) code |= 1; // left
52109             else if (p[0] > bbox[2]) code |= 2; // right
52110
52111             if (p[1] < bbox[1]) code |= 4; // bottom
52112             else if (p[1] > bbox[3]) code |= 8; // top
52113
52114             return code;
52115         }
52116         lineclip_1$1.default = default_1$1;
52117
52118         var bboxClip_1 = createCommonjsModule(function (module, exports) {
52119         var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
52120             if (mod && mod.__esModule) return mod;
52121             var result = {};
52122             if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
52123             result["default"] = mod;
52124             return result;
52125         };
52126         Object.defineProperty(exports, "__esModule", { value: true });
52127
52128
52129         var lineclip = __importStar(lineclip_1$1);
52130         /**
52131          * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
52132          * [lineclip](https://github.com/mapbox/lineclip).
52133          * May result in degenerate edges when clipping Polygons.
52134          *
52135          * @name bboxClip
52136          * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
52137          * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
52138          * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
52139          * @example
52140          * var bbox = [0, 0, 10, 10];
52141          * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
52142          *
52143          * var clipped = turf.bboxClip(poly, bbox);
52144          *
52145          * //addToMap
52146          * var addToMap = [bbox, poly, clipped]
52147          */
52148         function bboxClip(feature, bbox) {
52149             var geom = invariant.getGeom(feature);
52150             var type = geom.type;
52151             var properties = feature.type === "Feature" ? feature.properties : {};
52152             var coords = geom.coordinates;
52153             switch (type) {
52154                 case "LineString":
52155                 case "MultiLineString":
52156                     var lines_1 = [];
52157                     if (type === "LineString") {
52158                         coords = [coords];
52159                     }
52160                     coords.forEach(function (line) {
52161                         lineclip.polyline(line, bbox, lines_1);
52162                     });
52163                     if (lines_1.length === 1) {
52164                         return helpers.lineString(lines_1[0], properties);
52165                     }
52166                     return helpers.multiLineString(lines_1, properties);
52167                 case "Polygon":
52168                     return helpers.polygon(clipPolygon(coords, bbox), properties);
52169                 case "MultiPolygon":
52170                     return helpers.multiPolygon(coords.map(function (poly) {
52171                         return clipPolygon(poly, bbox);
52172                     }), properties);
52173                 default:
52174                     throw new Error("geometry " + type + " not supported");
52175             }
52176         }
52177         exports.default = bboxClip;
52178         function clipPolygon(rings, bbox) {
52179             var outRings = [];
52180             for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
52181                 var ring = rings_1[_i];
52182                 var clipped = lineclip.polygon(ring, bbox);
52183                 if (clipped.length > 0) {
52184                     if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
52185                         clipped.push(clipped[0]);
52186                     }
52187                     if (clipped.length >= 4) {
52188                         outRings.push(clipped);
52189                     }
52190                 }
52191             }
52192             return outRings;
52193         }
52194         });
52195
52196         var turf_bboxClip = unwrapExports(bboxClip_1);
52197
52198         var fastJsonStableStringify = function (data, opts) {
52199             if (!opts) opts = {};
52200             if (typeof opts === 'function') opts = { cmp: opts };
52201             var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
52202
52203             var cmp = opts.cmp && (function (f) {
52204                 return function (node) {
52205                     return function (a, b) {
52206                         var aobj = { key: a, value: node[a] };
52207                         var bobj = { key: b, value: node[b] };
52208                         return f(aobj, bobj);
52209                     };
52210                 };
52211             })(opts.cmp);
52212
52213             var seen = [];
52214             return (function stringify (node) {
52215                 if (node && node.toJSON && typeof node.toJSON === 'function') {
52216                     node = node.toJSON();
52217                 }
52218
52219                 if (node === undefined) return;
52220                 if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
52221                 if (typeof node !== 'object') return JSON.stringify(node);
52222
52223                 var i, out;
52224                 if (Array.isArray(node)) {
52225                     out = '[';
52226                     for (i = 0; i < node.length; i++) {
52227                         if (i) out += ',';
52228                         out += stringify(node[i]) || 'null';
52229                     }
52230                     return out + ']';
52231                 }
52232
52233                 if (node === null) return 'null';
52234
52235                 if (seen.indexOf(node) !== -1) {
52236                     if (cycles) return JSON.stringify('__cycle__');
52237                     throw new TypeError('Converting circular structure to JSON');
52238                 }
52239
52240                 var seenIndex = seen.push(node) - 1;
52241                 var keys = Object.keys(node).sort(cmp && cmp(node));
52242                 out = '';
52243                 for (i = 0; i < keys.length; i++) {
52244                     var key = keys[i];
52245                     var value = stringify(node[key]);
52246
52247                     if (!value) continue;
52248                     if (out) out += ',';
52249                     out += JSON.stringify(key) + ':' + value;
52250                 }
52251                 seen.splice(seenIndex, 1);
52252                 return '{' + out + '}';
52253             })(data);
52254         };
52255
52256         var martinez_umd = createCommonjsModule(function (module, exports) {
52257         /**
52258          * martinez v0.5.0
52259          * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
52260          *
52261          * @author Alex Milevski <info@w8r.name>
52262          * @license MIT
52263          * @preserve
52264          */
52265
52266         (function (global, factory) {
52267           factory(exports);
52268         }(commonjsGlobal, (function (exports) {
52269           function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
52270
52271           var SplayTree = function SplayTree(compare, noDuplicates) {
52272             if ( compare === void 0 ) compare = DEFAULT_COMPARE;
52273             if ( noDuplicates === void 0 ) noDuplicates = false;
52274
52275             this._compare = compare;
52276             this._root = null;
52277             this._size = 0;
52278             this._noDuplicates = !!noDuplicates;
52279           };
52280
52281           var prototypeAccessors = { size: { configurable: true } };
52282
52283
52284           SplayTree.prototype.rotateLeft = function rotateLeft (x) {
52285             var y = x.right;
52286             if (y) {
52287               x.right = y.left;
52288               if (y.left) { y.left.parent = x; }
52289               y.parent = x.parent;
52290             }
52291
52292             if (!x.parent)              { this._root = y; }
52293             else if (x === x.parent.left) { x.parent.left = y; }
52294             else                        { x.parent.right = y; }
52295             if (y) { y.left = x; }
52296             x.parent = y;
52297           };
52298
52299
52300           SplayTree.prototype.rotateRight = function rotateRight (x) {
52301             var y = x.left;
52302             if (y) {
52303               x.left = y.right;
52304               if (y.right) { y.right.parent = x; }
52305               y.parent = x.parent;
52306             }
52307
52308             if (!x.parent)             { this._root = y; }
52309             else if(x === x.parent.left) { x.parent.left = y; }
52310             else                       { x.parent.right = y; }
52311             if (y) { y.right = x; }
52312             x.parent = y;
52313           };
52314
52315
52316           SplayTree.prototype._splay = function _splay (x) {
52317               var this$1 = this;
52318
52319             while (x.parent) {
52320               var p = x.parent;
52321               if (!p.parent) {
52322                 if (p.left === x) { this$1.rotateRight(p); }
52323                 else            { this$1.rotateLeft(p); }
52324               } else if (p.left === x && p.parent.left === p) {
52325                 this$1.rotateRight(p.parent);
52326                 this$1.rotateRight(p);
52327               } else if (p.right === x && p.parent.right === p) {
52328                 this$1.rotateLeft(p.parent);
52329                 this$1.rotateLeft(p);
52330               } else if (p.left === x && p.parent.right === p) {
52331                 this$1.rotateRight(p);
52332                 this$1.rotateLeft(p);
52333               } else {
52334                 this$1.rotateLeft(p);
52335                 this$1.rotateRight(p);
52336               }
52337             }
52338           };
52339
52340
52341           SplayTree.prototype.splay = function splay (x) {
52342               var this$1 = this;
52343
52344             var p, gp, ggp, l, r;
52345
52346             while (x.parent) {
52347               p = x.parent;
52348               gp = p.parent;
52349
52350               if (gp && gp.parent) {
52351                 ggp = gp.parent;
52352                 if (ggp.left === gp) { ggp.left= x; }
52353                 else               { ggp.right = x; }
52354                 x.parent = ggp;
52355               } else {
52356                 x.parent = null;
52357                 this$1._root = x;
52358               }
52359
52360               l = x.left; r = x.right;
52361
52362               if (x === p.left) { // left
52363                 if (gp) {
52364                   if (gp.left === p) {
52365                     /* zig-zig */
52366                     if (p.right) {
52367                       gp.left = p.right;
52368                       gp.left.parent = gp;
52369                     } else { gp.left = null; }
52370
52371                     p.right = gp;
52372                     gp.parent = p;
52373                   } else {
52374                     /* zig-zag */
52375                     if (l) {
52376                       gp.right = l;
52377                       l.parent = gp;
52378                     } else { gp.right = null; }
52379
52380                     x.left  = gp;
52381                     gp.parent = x;
52382                   }
52383                 }
52384                 if (r) {
52385                   p.left = r;
52386                   r.parent = p;
52387                 } else { p.left = null; }
52388
52389                 x.right= p;
52390                 p.parent = x;
52391               } else { // right
52392                 if (gp) {
52393                   if (gp.right === p) {
52394                     /* zig-zig */
52395                     if (p.left) {
52396                       gp.right = p.left;
52397                       gp.right.parent = gp;
52398                     } else { gp.right = null; }
52399
52400                     p.left = gp;
52401                     gp.parent = p;
52402                   } else {
52403                     /* zig-zag */
52404                     if (r) {
52405                       gp.left = r;
52406                       r.parent = gp;
52407                     } else { gp.left = null; }
52408
52409                     x.right = gp;
52410                     gp.parent = x;
52411                   }
52412                 }
52413                 if (l) {
52414                   p.right = l;
52415                   l.parent = p;
52416                 } else { p.right = null; }
52417
52418                 x.left = p;
52419                 p.parent = x;
52420               }
52421             }
52422           };
52423
52424
52425           SplayTree.prototype.replace = function replace (u, v) {
52426             if (!u.parent) { this._root = v; }
52427             else if (u === u.parent.left) { u.parent.left = v; }
52428             else { u.parent.right = v; }
52429             if (v) { v.parent = u.parent; }
52430           };
52431
52432
52433           SplayTree.prototype.minNode = function minNode (u) {
52434               if ( u === void 0 ) u = this._root;
52435
52436             if (u) { while (u.left) { u = u.left; } }
52437             return u;
52438           };
52439
52440
52441           SplayTree.prototype.maxNode = function maxNode (u) {
52442               if ( u === void 0 ) u = this._root;
52443
52444             if (u) { while (u.right) { u = u.right; } }
52445             return u;
52446           };
52447
52448
52449           SplayTree.prototype.insert = function insert (key, data) {
52450             var z = this._root;
52451             var p = null;
52452             var comp = this._compare;
52453             var cmp;
52454
52455             if (this._noDuplicates) {
52456               while (z) {
52457                 p = z;
52458                 cmp = comp(z.key, key);
52459                 if (cmp === 0) { return; }
52460                 else if (comp(z.key, key) < 0) { z = z.right; }
52461                 else { z = z.left; }
52462               }
52463             } else {
52464               while (z) {
52465                 p = z;
52466                 if (comp(z.key, key) < 0) { z = z.right; }
52467                 else { z = z.left; }
52468               }
52469             }
52470
52471             z = { key: key, data: data, left: null, right: null, parent: p };
52472
52473             if (!p)                        { this._root = z; }
52474             else if (comp(p.key, z.key) < 0) { p.right = z; }
52475             else                           { p.left= z; }
52476
52477             this.splay(z);
52478             this._size++;
52479             return z;
52480           };
52481
52482
52483           SplayTree.prototype.find = function find (key) {
52484             var z  = this._root;
52485             var comp = this._compare;
52486             while (z) {
52487               var cmp = comp(z.key, key);
52488               if    (cmp < 0) { z = z.right; }
52489               else if (cmp > 0) { z = z.left; }
52490               else            { return z; }
52491             }
52492             return null;
52493           };
52494
52495           /**
52496            * Whether the tree contains a node with the given key
52497            * @param{Key} key
52498            * @return {boolean} true/false
52499            */
52500           SplayTree.prototype.contains = function contains (key) {
52501             var node     = this._root;
52502             var comparator = this._compare;
52503             while (node){
52504               var cmp = comparator(key, node.key);
52505               if    (cmp === 0) { return true; }
52506               else if (cmp < 0) { node = node.left; }
52507               else              { node = node.right; }
52508             }
52509
52510             return false;
52511           };
52512
52513
52514           SplayTree.prototype.remove = function remove (key) {
52515             var z = this.find(key);
52516
52517             if (!z) { return false; }
52518
52519             this.splay(z);
52520
52521             if (!z.left) { this.replace(z, z.right); }
52522             else if (!z.right) { this.replace(z, z.left); }
52523             else {
52524               var y = this.minNode(z.right);
52525               if (y.parent !== z) {
52526                 this.replace(y, y.right);
52527                 y.right = z.right;
52528                 y.right.parent = y;
52529               }
52530               this.replace(z, y);
52531               y.left = z.left;
52532               y.left.parent = y;
52533             }
52534
52535             this._size--;
52536             return true;
52537           };
52538
52539
52540           SplayTree.prototype.removeNode = function removeNode (z) {
52541             if (!z) { return false; }
52542
52543             this.splay(z);
52544
52545             if (!z.left) { this.replace(z, z.right); }
52546             else if (!z.right) { this.replace(z, z.left); }
52547             else {
52548               var y = this.minNode(z.right);
52549               if (y.parent !== z) {
52550                 this.replace(y, y.right);
52551                 y.right = z.right;
52552                 y.right.parent = y;
52553               }
52554               this.replace(z, y);
52555               y.left = z.left;
52556               y.left.parent = y;
52557             }
52558
52559             this._size--;
52560             return true;
52561           };
52562
52563
52564           SplayTree.prototype.erase = function erase (key) {
52565             var z = this.find(key);
52566             if (!z) { return; }
52567
52568             this.splay(z);
52569
52570             var s = z.left;
52571             var t = z.right;
52572
52573             var sMax = null;
52574             if (s) {
52575               s.parent = null;
52576               sMax = this.maxNode(s);
52577               this.splay(sMax);
52578               this._root = sMax;
52579             }
52580             if (t) {
52581               if (s) { sMax.right = t; }
52582               else { this._root = t; }
52583               t.parent = sMax;
52584             }
52585
52586             this._size--;
52587           };
52588
52589           /**
52590            * Removes and returns the node with smallest key
52591            * @return {?Node}
52592            */
52593           SplayTree.prototype.pop = function pop () {
52594             var node = this._root, returnValue = null;
52595             if (node) {
52596               while (node.left) { node = node.left; }
52597               returnValue = { key: node.key, data: node.data };
52598               this.remove(node.key);
52599             }
52600             return returnValue;
52601           };
52602
52603
52604           /* eslint-disable class-methods-use-this */
52605
52606           /**
52607            * Successor node
52608            * @param{Node} node
52609            * @return {?Node}
52610            */
52611           SplayTree.prototype.next = function next (node) {
52612             var successor = node;
52613             if (successor) {
52614               if (successor.right) {
52615                 successor = successor.right;
52616                 while (successor && successor.left) { successor = successor.left; }
52617               } else {
52618                 successor = node.parent;
52619                 while (successor && successor.right === node) {
52620                   node = successor; successor = successor.parent;
52621                 }
52622               }
52623             }
52624             return successor;
52625           };
52626
52627
52628           /**
52629            * Predecessor node
52630            * @param{Node} node
52631            * @return {?Node}
52632            */
52633           SplayTree.prototype.prev = function prev (node) {
52634             var predecessor = node;
52635             if (predecessor) {
52636               if (predecessor.left) {
52637                 predecessor = predecessor.left;
52638                 while (predecessor && predecessor.right) { predecessor = predecessor.right; }
52639               } else {
52640                 predecessor = node.parent;
52641                 while (predecessor && predecessor.left === node) {
52642                   node = predecessor;
52643                   predecessor = predecessor.parent;
52644                 }
52645               }
52646             }
52647             return predecessor;
52648           };
52649           /* eslint-enable class-methods-use-this */
52650
52651
52652           /**
52653            * @param{forEachCallback} callback
52654            * @return {SplayTree}
52655            */
52656           SplayTree.prototype.forEach = function forEach (callback) {
52657             var current = this._root;
52658             var s = [], done = false, i = 0;
52659
52660             while (!done) {
52661               // Reach the left most Node of the current Node
52662               if (current) {
52663                 // Place pointer to a tree node on the stack
52664                 // before traversing the node's left subtree
52665                 s.push(current);
52666                 current = current.left;
52667               } else {
52668                 // BackTrack from the empty subtree and visit the Node
52669                 // at the top of the stack; however, if the stack is
52670                 // empty you are done
52671                 if (s.length > 0) {
52672                   current = s.pop();
52673                   callback(current, i++);
52674
52675                   // We have visited the node and its left
52676                   // subtree. Now, it's right subtree's turn
52677                   current = current.right;
52678                 } else { done = true; }
52679               }
52680             }
52681             return this;
52682           };
52683
52684
52685           /**
52686            * Walk key range from `low` to `high`. Stops if `fn` returns a value.
52687            * @param{Key}    low
52688            * @param{Key}    high
52689            * @param{Function} fn
52690            * @param{*?}     ctx
52691            * @return {SplayTree}
52692            */
52693           SplayTree.prototype.range = function range (low, high, fn, ctx) {
52694               var this$1 = this;
52695
52696             var Q = [];
52697             var compare = this._compare;
52698             var node = this._root, cmp;
52699
52700             while (Q.length !== 0 || node) {
52701               if (node) {
52702                 Q.push(node);
52703                 node = node.left;
52704               } else {
52705                 node = Q.pop();
52706                 cmp = compare(node.key, high);
52707                 if (cmp > 0) {
52708                   break;
52709                 } else if (compare(node.key, low) >= 0) {
52710                   if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
52711                 }
52712                 node = node.right;
52713               }
52714             }
52715             return this;
52716           };
52717
52718           /**
52719            * Returns all keys in order
52720            * @return {Array<Key>}
52721            */
52722           SplayTree.prototype.keys = function keys () {
52723             var current = this._root;
52724             var s = [], r = [], done = false;
52725
52726             while (!done) {
52727               if (current) {
52728                 s.push(current);
52729                 current = current.left;
52730               } else {
52731                 if (s.length > 0) {
52732                   current = s.pop();
52733                   r.push(current.key);
52734                   current = current.right;
52735                 } else { done = true; }
52736               }
52737             }
52738             return r;
52739           };
52740
52741
52742           /**
52743            * Returns `data` fields of all nodes in order.
52744            * @return {Array<Value>}
52745            */
52746           SplayTree.prototype.values = function values () {
52747             var current = this._root;
52748             var s = [], r = [], done = false;
52749
52750             while (!done) {
52751               if (current) {
52752                 s.push(current);
52753                 current = current.left;
52754               } else {
52755                 if (s.length > 0) {
52756                   current = s.pop();
52757                   r.push(current.data);
52758                   current = current.right;
52759                 } else { done = true; }
52760               }
52761             }
52762             return r;
52763           };
52764
52765
52766           /**
52767            * Returns node at given index
52768            * @param{number} index
52769            * @return {?Node}
52770            */
52771           SplayTree.prototype.at = function at (index) {
52772             // removed after a consideration, more misleading than useful
52773             // index = index % this.size;
52774             // if (index < 0) index = this.size - index;
52775
52776             var current = this._root;
52777             var s = [], done = false, i = 0;
52778
52779             while (!done) {
52780               if (current) {
52781                 s.push(current);
52782                 current = current.left;
52783               } else {
52784                 if (s.length > 0) {
52785                   current = s.pop();
52786                   if (i === index) { return current; }
52787                   i++;
52788                   current = current.right;
52789                 } else { done = true; }
52790               }
52791             }
52792             return null;
52793           };
52794
52795           /**
52796            * Bulk-load items. Both array have to be same size
52797            * @param{Array<Key>}  keys
52798            * @param{Array<Value>}[values]
52799            * @param{Boolean}     [presort=false] Pre-sort keys and values, using
52800            *                                       tree's comparator. Sorting is done
52801            *                                       in-place
52802            * @return {AVLTree}
52803            */
52804           SplayTree.prototype.load = function load (keys, values, presort) {
52805               if ( keys === void 0 ) keys = [];
52806               if ( values === void 0 ) values = [];
52807               if ( presort === void 0 ) presort = false;
52808
52809             if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
52810             var size = keys.length;
52811             if (presort) { sort(keys, values, 0, size - 1, this._compare); }
52812             this._root = loadRecursive(null, keys, values, 0, size);
52813             this._size = size;
52814             return this;
52815           };
52816
52817
52818           SplayTree.prototype.min = function min () {
52819             var node = this.minNode(this._root);
52820             if (node) { return node.key; }
52821             else    { return null; }
52822           };
52823
52824
52825           SplayTree.prototype.max = function max () {
52826             var node = this.maxNode(this._root);
52827             if (node) { return node.key; }
52828             else    { return null; }
52829           };
52830
52831           SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
52832           prototypeAccessors.size.get = function () { return this._size; };
52833
52834
52835           /**
52836            * Create a tree and load it with items
52837            * @param{Array<Key>}        keys
52838            * @param{Array<Value>?}      [values]
52839
52840            * @param{Function?}          [comparator]
52841            * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
52842            *                                             tree's comparator. Sorting is done
52843            *                                             in-place
52844            * @param{Boolean?}           [noDuplicates=false] Allow duplicates
52845            * @return {SplayTree}
52846            */
52847           SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
52848             return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
52849           };
52850
52851           Object.defineProperties( SplayTree.prototype, prototypeAccessors );
52852
52853
52854           function loadRecursive (parent, keys, values, start, end) {
52855             var size = end - start;
52856             if (size > 0) {
52857               var middle = start + Math.floor(size / 2);
52858               var key    = keys[middle];
52859               var data   = values[middle];
52860               var node   = { key: key, data: data, parent: parent };
52861               node.left    = loadRecursive(node, keys, values, start, middle);
52862               node.right   = loadRecursive(node, keys, values, middle + 1, end);
52863               return node;
52864             }
52865             return null;
52866           }
52867
52868
52869           function sort(keys, values, left, right, compare) {
52870             if (left >= right) { return; }
52871
52872             var pivot = keys[(left + right) >> 1];
52873             var i = left - 1;
52874             var j = right + 1;
52875
52876             while (true) {
52877               do { i++; } while (compare(keys[i], pivot) < 0);
52878               do { j--; } while (compare(keys[j], pivot) > 0);
52879               if (i >= j) { break; }
52880
52881               var tmp = keys[i];
52882               keys[i] = keys[j];
52883               keys[j] = tmp;
52884
52885               tmp = values[i];
52886               values[i] = values[j];
52887               values[j] = tmp;
52888             }
52889
52890             sort(keys, values,  left,     j, compare);
52891             sort(keys, values, j + 1, right, compare);
52892           }
52893
52894           var NORMAL               = 0;
52895           var NON_CONTRIBUTING     = 1;
52896           var SAME_TRANSITION      = 2;
52897           var DIFFERENT_TRANSITION = 3;
52898
52899           var INTERSECTION = 0;
52900           var UNION        = 1;
52901           var DIFFERENCE   = 2;
52902           var XOR          = 3;
52903
52904           /**
52905            * @param  {SweepEvent} event
52906            * @param  {SweepEvent} prev
52907            * @param  {Operation} operation
52908            */
52909           function computeFields (event, prev, operation) {
52910             // compute inOut and otherInOut fields
52911             if (prev === null) {
52912               event.inOut      = false;
52913               event.otherInOut = true;
52914
52915             // previous line segment in sweepline belongs to the same polygon
52916             } else {
52917               if (event.isSubject === prev.isSubject) {
52918                 event.inOut      = !prev.inOut;
52919                 event.otherInOut = prev.otherInOut;
52920
52921               // previous line segment in sweepline belongs to the clipping polygon
52922               } else {
52923                 event.inOut      = !prev.otherInOut;
52924                 event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
52925               }
52926
52927               // compute prevInResult field
52928               if (prev) {
52929                 event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
52930                   ? prev.prevInResult : prev;
52931               }
52932             }
52933
52934             // check if the line segment belongs to the Boolean operation
52935             event.inResult = inResult(event, operation);
52936           }
52937
52938
52939           /* eslint-disable indent */
52940           function inResult(event, operation) {
52941             switch (event.type) {
52942               case NORMAL:
52943                 switch (operation) {
52944                   case INTERSECTION:
52945                     return !event.otherInOut;
52946                   case UNION:
52947                     return event.otherInOut;
52948                   case DIFFERENCE:
52949                     // return (event.isSubject && !event.otherInOut) ||
52950                     //         (!event.isSubject && event.otherInOut);
52951                     return (event.isSubject && event.otherInOut) ||
52952                             (!event.isSubject && !event.otherInOut);
52953                   case XOR:
52954                     return true;
52955                 }
52956                 break;
52957               case SAME_TRANSITION:
52958                 return operation === INTERSECTION || operation === UNION;
52959               case DIFFERENT_TRANSITION:
52960                 return operation === DIFFERENCE;
52961               case NON_CONTRIBUTING:
52962                 return false;
52963             }
52964             return false;
52965           }
52966           /* eslint-enable indent */
52967
52968           var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
52969
52970             /**
52971              * Is left endpoint?
52972              * @type {Boolean}
52973              */
52974             this.left = left;
52975
52976             /**
52977              * @type {Array.<Number>}
52978              */
52979             this.point = point;
52980
52981             /**
52982              * Other edge reference
52983              * @type {SweepEvent}
52984              */
52985             this.otherEvent = otherEvent;
52986
52987             /**
52988              * Belongs to source or clipping polygon
52989              * @type {Boolean}
52990              */
52991             this.isSubject = isSubject;
52992
52993             /**
52994              * Edge contribution type
52995              * @type {Number}
52996              */
52997             this.type = edgeType || NORMAL;
52998
52999
53000             /**
53001              * In-out transition for the sweepline crossing polygon
53002              * @type {Boolean}
53003              */
53004             this.inOut = false;
53005
53006
53007             /**
53008              * @type {Boolean}
53009              */
53010             this.otherInOut = false;
53011
53012             /**
53013              * Previous event in result?
53014              * @type {SweepEvent}
53015              */
53016             this.prevInResult = null;
53017
53018             /**
53019              * Does event belong to result?
53020              * @type {Boolean}
53021              */
53022             this.inResult = false;
53023
53024
53025             // connection step
53026
53027             /**
53028              * @type {Boolean}
53029              */
53030             this.resultInOut = false;
53031
53032             this.isExteriorRing = true;
53033           };
53034
53035
53036           /**
53037            * @param{Array.<Number>}p
53038            * @return {Boolean}
53039            */
53040           SweepEvent.prototype.isBelow = function isBelow (p) {
53041             var p0 = this.point, p1 = this.otherEvent.point;
53042             return this.left
53043               ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
53044               // signedArea(this.point, this.otherEvent.point, p) > 0 :
53045               : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
53046               //signedArea(this.otherEvent.point, this.point, p) > 0;
53047           };
53048
53049
53050           /**
53051            * @param{Array.<Number>}p
53052            * @return {Boolean}
53053            */
53054           SweepEvent.prototype.isAbove = function isAbove (p) {
53055             return !this.isBelow(p);
53056           };
53057
53058
53059           /**
53060            * @return {Boolean}
53061            */
53062           SweepEvent.prototype.isVertical = function isVertical () {
53063             return this.point[0] === this.otherEvent.point[0];
53064           };
53065
53066
53067           SweepEvent.prototype.clone = function clone () {
53068             var copy = new SweepEvent(
53069               this.point, this.left, this.otherEvent, this.isSubject, this.type);
53070
53071             copy.inResult     = this.inResult;
53072             copy.prevInResult = this.prevInResult;
53073             copy.isExteriorRing = this.isExteriorRing;
53074             copy.inOut        = this.inOut;
53075             copy.otherInOut   = this.otherInOut;
53076
53077             return copy;
53078           };
53079
53080           function equals(p1, p2) {
53081             if (p1[0] === p2[0]) {
53082               if (p1[1] === p2[1]) {
53083                 return true;
53084               } else {
53085                 return false;
53086               }
53087             }
53088             return false;
53089           }
53090
53091           // const EPSILON = 1e-9;
53092           // const abs = Math.abs;
53093           // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
53094           // Precision problem.
53095           //
53096           // module.exports = function equals(p1, p2) {
53097           //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
53098           // };
53099
53100           /**
53101            * Signed area of the triangle (p0, p1, p2)
53102            * @param  {Array.<Number>} p0
53103            * @param  {Array.<Number>} p1
53104            * @param  {Array.<Number>} p2
53105            * @return {Number}
53106            */
53107           function signedArea(p0, p1, p2) {
53108             return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
53109           }
53110
53111           /**
53112            * @param  {SweepEvent} e1
53113            * @param  {SweepEvent} e2
53114            * @return {Number}
53115            */
53116           function compareEvents(e1, e2) {
53117             var p1 = e1.point;
53118             var p2 = e2.point;
53119
53120             // Different x-coordinate
53121             if (p1[0] > p2[0]) { return 1; }
53122             if (p1[0] < p2[0]) { return -1; }
53123
53124             // Different points, but same x-coordinate
53125             // Event with lower y-coordinate is processed first
53126             if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
53127
53128             return specialCases(e1, e2, p1, p2);
53129           }
53130
53131
53132           /* eslint-disable no-unused-vars */
53133           function specialCases(e1, e2, p1, p2) {
53134             // Same coordinates, but one is a left endpoint and the other is
53135             // a right endpoint. The right endpoint is processed first
53136             if (e1.left !== e2.left)
53137               { return e1.left ? 1 : -1; }
53138
53139             // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
53140             // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
53141             // Same coordinates, both events
53142             // are left endpoints or right endpoints.
53143             // not collinear
53144             if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
53145               // the event associate to the bottom segment is processed first
53146               return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
53147             }
53148
53149             return (!e1.isSubject && e2.isSubject) ? 1 : -1;
53150           }
53151           /* eslint-enable no-unused-vars */
53152
53153           /**
53154            * @param  {SweepEvent} se
53155            * @param  {Array.<Number>} p
53156            * @param  {Queue} queue
53157            * @return {Queue}
53158            */
53159           function divideSegment(se, p, queue)  {
53160             var r = new SweepEvent(p, false, se,            se.isSubject);
53161             var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
53162
53163             /* eslint-disable no-console */
53164             if (equals(se.point, se.otherEvent.point)) {
53165
53166               console.warn('what is that, a collapsed segment?', se);
53167             }
53168             /* eslint-enable no-console */
53169
53170             r.contourId = l.contourId = se.contourId;
53171
53172             // avoid a rounding error. The left event would be processed after the right event
53173             if (compareEvents(l, se.otherEvent) > 0) {
53174               se.otherEvent.left = true;
53175               l.left = false;
53176             }
53177
53178             // avoid a rounding error. The left event would be processed after the right event
53179             // if (compareEvents(se, r) > 0) {}
53180
53181             se.otherEvent.otherEvent = l;
53182             se.otherEvent = r;
53183
53184             queue.push(l);
53185             queue.push(r);
53186
53187             return queue;
53188           }
53189
53190           //const EPS = 1e-9;
53191
53192           /**
53193            * Finds the magnitude of the cross product of two vectors (if we pretend
53194            * they're in three dimensions)
53195            *
53196            * @param {Object} a First vector
53197            * @param {Object} b Second vector
53198            * @private
53199            * @returns {Number} The magnitude of the cross product
53200            */
53201           function crossProduct(a, b) {
53202             return (a[0] * b[1]) - (a[1] * b[0]);
53203           }
53204
53205           /**
53206            * Finds the dot product of two vectors.
53207            *
53208            * @param {Object} a First vector
53209            * @param {Object} b Second vector
53210            * @private
53211            * @returns {Number} The dot product
53212            */
53213           function dotProduct(a, b) {
53214             return (a[0] * b[0]) + (a[1] * b[1]);
53215           }
53216
53217           /**
53218            * Finds the intersection (if any) between two line segments a and b, given the
53219            * line segments' end points a1, a2 and b1, b2.
53220            *
53221            * This algorithm is based on Schneider and Eberly.
53222            * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
53223            * Page 244.
53224            *
53225            * @param {Array.<Number>} a1 point of first line
53226            * @param {Array.<Number>} a2 point of first line
53227            * @param {Array.<Number>} b1 point of second line
53228            * @param {Array.<Number>} b2 point of second line
53229            * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
53230            *                                         (meaning connected segments) as
53231            *                                         intersections
53232            * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
53233            * intersection. If they overlap, the two end points of the overlapping segment.
53234            * Otherwise, null.
53235            */
53236           function intersection (a1, a2, b1, b2, noEndpointTouch) {
53237             // The algorithm expects our lines in the form P + sd, where P is a point,
53238             // s is on the interval [0, 1], and d is a vector.
53239             // We are passed two points. P can be the first point of each pair. The
53240             // vector, then, could be thought of as the distance (in x and y components)
53241             // from the first point to the second point.
53242             // So first, let's make our vectors:
53243             var va = [a2[0] - a1[0], a2[1] - a1[1]];
53244             var vb = [b2[0] - b1[0], b2[1] - b1[1]];
53245             // We also define a function to convert back to regular point form:
53246
53247             /* eslint-disable arrow-body-style */
53248
53249             function toPoint(p, s, d) {
53250               return [
53251                 p[0] + s * d[0],
53252                 p[1] + s * d[1]
53253               ];
53254             }
53255
53256             /* eslint-enable arrow-body-style */
53257
53258             // The rest is pretty much a straight port of the algorithm.
53259             var e = [b1[0] - a1[0], b1[1] - a1[1]];
53260             var kross    = crossProduct(va, vb);
53261             var sqrKross = kross * kross;
53262             var sqrLenA  = dotProduct(va, va);
53263             //const sqrLenB  = dotProduct(vb, vb);
53264
53265             // Check for line intersection. This works because of the properties of the
53266             // cross product -- specifically, two vectors are parallel if and only if the
53267             // cross product is the 0 vector. The full calculation involves relative error
53268             // to account for possible very small line segments. See Schneider & Eberly
53269             // for details.
53270             if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
53271               // If they're not parallel, then (because these are line segments) they
53272               // still might not actually intersect. This code checks that the
53273               // intersection point of the lines is actually on both line segments.
53274               var s = crossProduct(e, vb) / kross;
53275               if (s < 0 || s > 1) {
53276                 // not on line segment a
53277                 return null;
53278               }
53279               var t = crossProduct(e, va) / kross;
53280               if (t < 0 || t > 1) {
53281                 // not on line segment b
53282                 return null;
53283               }
53284               if (s === 0 || s === 1) {
53285                 // on an endpoint of line segment a
53286                 return noEndpointTouch ? null : [toPoint(a1, s, va)];
53287               }
53288               if (t === 0 || t === 1) {
53289                 // on an endpoint of line segment b
53290                 return noEndpointTouch ? null : [toPoint(b1, t, vb)];
53291               }
53292               return [toPoint(a1, s, va)];
53293             }
53294
53295             // If we've reached this point, then the lines are either parallel or the
53296             // same, but the segments could overlap partially or fully, or not at all.
53297             // So we need to find the overlap, if any. To do that, we can use e, which is
53298             // the (vector) difference between the two initial points. If this is parallel
53299             // with the line itself, then the two lines are the same line, and there will
53300             // be overlap.
53301             //const sqrLenE = dotProduct(e, e);
53302             kross = crossProduct(e, va);
53303             sqrKross = kross * kross;
53304
53305             if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
53306             // Lines are just parallel, not the same. No overlap.
53307               return null;
53308             }
53309
53310             var sa = dotProduct(va, e) / sqrLenA;
53311             var sb = sa + dotProduct(va, vb) / sqrLenA;
53312             var smin = Math.min(sa, sb);
53313             var smax = Math.max(sa, sb);
53314
53315             // this is, essentially, the FindIntersection acting on floats from
53316             // Schneider & Eberly, just inlined into this function.
53317             if (smin <= 1 && smax >= 0) {
53318
53319               // overlap on an end point
53320               if (smin === 1) {
53321                 return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
53322               }
53323
53324               if (smax === 0) {
53325                 return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
53326               }
53327
53328               if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
53329
53330               // There's overlap on a segment -- two points of intersection. Return both.
53331               return [
53332                 toPoint(a1, smin > 0 ? smin : 0, va),
53333                 toPoint(a1, smax < 1 ? smax : 1, va)
53334               ];
53335             }
53336
53337             return null;
53338           }
53339
53340           /**
53341            * @param  {SweepEvent} se1
53342            * @param  {SweepEvent} se2
53343            * @param  {Queue}      queue
53344            * @return {Number}
53345            */
53346           function possibleIntersection (se1, se2, queue) {
53347             // that disallows self-intersecting polygons,
53348             // did cost us half a day, so I'll leave it
53349             // out of respect
53350             // if (se1.isSubject === se2.isSubject) return;
53351             var inter = intersection(
53352               se1.point, se1.otherEvent.point,
53353               se2.point, se2.otherEvent.point
53354             );
53355
53356             var nintersections = inter ? inter.length : 0;
53357             if (nintersections === 0) { return 0; } // no intersection
53358
53359             // the line segments intersect at an endpoint of both line segments
53360             if ((nintersections === 1) &&
53361                 (equals(se1.point, se2.point) ||
53362                  equals(se1.otherEvent.point, se2.otherEvent.point))) {
53363               return 0;
53364             }
53365
53366             if (nintersections === 2 && se1.isSubject === se2.isSubject) {
53367               // if(se1.contourId === se2.contourId){
53368               // console.warn('Edges of the same polygon overlap',
53369               //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
53370               // }
53371               //throw new Error('Edges of the same polygon overlap');
53372               return 0;
53373             }
53374
53375             // The line segments associated to se1 and se2 intersect
53376             if (nintersections === 1) {
53377
53378               // if the intersection point is not an endpoint of se1
53379               if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
53380                 divideSegment(se1, inter[0], queue);
53381               }
53382
53383               // if the intersection point is not an endpoint of se2
53384               if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
53385                 divideSegment(se2, inter[0], queue);
53386               }
53387               return 1;
53388             }
53389
53390             // The line segments associated to se1 and se2 overlap
53391             var events        = [];
53392             var leftCoincide  = false;
53393             var rightCoincide = false;
53394
53395             if (equals(se1.point, se2.point)) {
53396               leftCoincide = true; // linked
53397             } else if (compareEvents(se1, se2) === 1) {
53398               events.push(se2, se1);
53399             } else {
53400               events.push(se1, se2);
53401             }
53402
53403             if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
53404               rightCoincide = true;
53405             } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
53406               events.push(se2.otherEvent, se1.otherEvent);
53407             } else {
53408               events.push(se1.otherEvent, se2.otherEvent);
53409             }
53410
53411             if ((leftCoincide && rightCoincide) || leftCoincide) {
53412               // both line segments are equal or share the left endpoint
53413               se2.type = NON_CONTRIBUTING;
53414               se1.type = (se2.inOut === se1.inOut)
53415                 ? SAME_TRANSITION : DIFFERENT_TRANSITION;
53416
53417               if (leftCoincide && !rightCoincide) {
53418                 // honestly no idea, but changing events selection from [2, 1]
53419                 // to [0, 1] fixes the overlapping self-intersecting polygons issue
53420                 divideSegment(events[1].otherEvent, events[0].point, queue);
53421               }
53422               return 2;
53423             }
53424
53425             // the line segments share the right endpoint
53426             if (rightCoincide) {
53427               divideSegment(events[0], events[1].point, queue);
53428               return 3;
53429             }
53430
53431             // no line segment includes totally the other one
53432             if (events[0] !== events[3].otherEvent) {
53433               divideSegment(events[0], events[1].point, queue);
53434               divideSegment(events[1], events[2].point, queue);
53435               return 3;
53436             }
53437
53438             // one line segment includes the other one
53439             divideSegment(events[0], events[1].point, queue);
53440             divideSegment(events[3].otherEvent, events[2].point, queue);
53441
53442             return 3;
53443           }
53444
53445           /**
53446            * @param  {SweepEvent} le1
53447            * @param  {SweepEvent} le2
53448            * @return {Number}
53449            */
53450           function compareSegments(le1, le2) {
53451             if (le1 === le2) { return 0; }
53452
53453             // Segments are not collinear
53454             if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
53455               signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
53456
53457               // If they share their left endpoint use the right endpoint to sort
53458               if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
53459
53460               // Different left endpoint: use the left endpoint to sort
53461               if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
53462
53463               // has the line segment associated to e1 been inserted
53464               // into S after the line segment associated to e2 ?
53465               if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
53466
53467               // The line segment associated to e2 has been inserted
53468               // into S after the line segment associated to e1
53469               return le1.isBelow(le2.point) ? -1 : 1;
53470             }
53471
53472             if (le1.isSubject === le2.isSubject) { // same polygon
53473               var p1 = le1.point, p2 = le2.point;
53474               if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
53475                 p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
53476                 if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
53477                 else { return le1.contourId > le2.contourId ? 1 : -1; }
53478               }
53479             } else { // Segments are collinear, but belong to separate polygons
53480               return le1.isSubject ? -1 : 1;
53481             }
53482
53483             return compareEvents(le1, le2) === 1 ? 1 : -1;
53484           }
53485
53486           function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
53487             var sweepLine = new SplayTree(compareSegments);
53488             var sortedEvents = [];
53489
53490             var rightbound = Math.min(sbbox[2], cbbox[2]);
53491
53492             var prev, next, begin;
53493
53494             while (eventQueue.length !== 0) {
53495               var event = eventQueue.pop();
53496               sortedEvents.push(event);
53497
53498               // optimization by bboxes for intersection and difference goes here
53499               if ((operation === INTERSECTION && event.point[0] > rightbound) ||
53500                   (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
53501                 break;
53502               }
53503
53504               if (event.left) {
53505                 next  = prev = sweepLine.insert(event);
53506                 begin = sweepLine.minNode();
53507
53508                 if (prev !== begin) { prev = sweepLine.prev(prev); }
53509                 else                { prev = null; }
53510
53511                 next = sweepLine.next(next);
53512
53513                 var prevEvent = prev ? prev.key : null;
53514                 var prevprevEvent = (void 0);
53515                 computeFields(event, prevEvent, operation);
53516                 if (next) {
53517                   if (possibleIntersection(event, next.key, eventQueue) === 2) {
53518                     computeFields(event, prevEvent, operation);
53519                     computeFields(event, next.key, operation);
53520                   }
53521                 }
53522
53523                 if (prev) {
53524                   if (possibleIntersection(prev.key, event, eventQueue) === 2) {
53525                     var prevprev = prev;
53526                     if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
53527                     else                    { prevprev = null; }
53528
53529                     prevprevEvent = prevprev ? prevprev.key : null;
53530                     computeFields(prevEvent, prevprevEvent, operation);
53531                     computeFields(event,     prevEvent,     operation);
53532                   }
53533                 }
53534               } else {
53535                 event = event.otherEvent;
53536                 next = prev = sweepLine.find(event);
53537
53538                 if (prev && next) {
53539
53540                   if (prev !== begin) { prev = sweepLine.prev(prev); }
53541                   else                { prev = null; }
53542
53543                   next = sweepLine.next(next);
53544                   sweepLine.remove(event);
53545
53546                   if (next && prev) {
53547                     possibleIntersection(prev.key, next.key, eventQueue);
53548                   }
53549                 }
53550               }
53551             }
53552             return sortedEvents;
53553           }
53554
53555           /**
53556            * @param  {Array.<SweepEvent>} sortedEvents
53557            * @return {Array.<SweepEvent>}
53558            */
53559           function orderEvents(sortedEvents) {
53560             var event, i, len, tmp;
53561             var resultEvents = [];
53562             for (i = 0, len = sortedEvents.length; i < len; i++) {
53563               event = sortedEvents[i];
53564               if ((event.left && event.inResult) ||
53565                 (!event.left && event.otherEvent.inResult)) {
53566                 resultEvents.push(event);
53567               }
53568             }
53569             // Due to overlapping edges the resultEvents array can be not wholly sorted
53570             var sorted = false;
53571             while (!sorted) {
53572               sorted = true;
53573               for (i = 0, len = resultEvents.length; i < len; i++) {
53574                 if ((i + 1) < len &&
53575                   compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
53576                   tmp = resultEvents[i];
53577                   resultEvents[i] = resultEvents[i + 1];
53578                   resultEvents[i + 1] = tmp;
53579                   sorted = false;
53580                 }
53581               }
53582             }
53583
53584
53585             for (i = 0, len = resultEvents.length; i < len; i++) {
53586               event = resultEvents[i];
53587               event.pos = i;
53588             }
53589
53590             // imagine, the right event is found in the beginning of the queue,
53591             // when his left counterpart is not marked yet
53592             for (i = 0, len = resultEvents.length; i < len; i++) {
53593               event = resultEvents[i];
53594               if (!event.left) {
53595                 tmp = event.pos;
53596                 event.pos = event.otherEvent.pos;
53597                 event.otherEvent.pos = tmp;
53598               }
53599             }
53600
53601             return resultEvents;
53602           }
53603
53604
53605           /**
53606            * @param  {Number} pos
53607            * @param  {Array.<SweepEvent>} resultEvents
53608            * @param  {Object>}    processed
53609            * @return {Number}
53610            */
53611           function nextPos(pos, resultEvents, processed, origIndex) {
53612             var p, p1;
53613             var newPos = pos + 1;
53614             var length = resultEvents.length;
53615
53616             p  = resultEvents[pos].point;
53617
53618             if (newPos < length)
53619               { p1 = resultEvents[newPos].point; }
53620
53621
53622             // while in range and not the current one by value
53623             while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
53624               if (!processed[newPos]) {
53625                 return newPos;
53626               } else   {
53627                 newPos++;
53628               }
53629               p1 = resultEvents[newPos].point;
53630             }
53631
53632             newPos = pos - 1;
53633
53634             while (processed[newPos] && newPos >= origIndex) {
53635               newPos--;
53636             }
53637             return newPos;
53638           }
53639
53640
53641           /**
53642            * @param  {Array.<SweepEvent>} sortedEvents
53643            * @return {Array.<*>} polygons
53644            */
53645           function connectEdges(sortedEvents, operation) {
53646             var i, len;
53647             var resultEvents = orderEvents(sortedEvents);
53648
53649             // "false"-filled array
53650             var processed = {};
53651             var result = [];
53652             var event;
53653
53654             for (i = 0, len = resultEvents.length; i < len; i++) {
53655               if (processed[i]) { continue; }
53656               var contour = [[]];
53657
53658               if (!resultEvents[i].isExteriorRing) {
53659                 if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
53660                   result.push(contour);
53661                 } else if (result.length === 0) {
53662                   result.push([[contour]]);
53663                 } else {
53664                   result[result.length - 1].push(contour[0]);
53665                 }
53666               } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
53667                 result[result.length - 1].push(contour[0]);
53668               } else {
53669                 result.push(contour);
53670               }
53671
53672               var ringId = result.length - 1;
53673               var pos = i;
53674
53675               var initial = resultEvents[i].point;
53676               contour[0].push(initial);
53677
53678               while (pos >= i) {
53679                 event = resultEvents[pos];
53680                 processed[pos] = true;
53681
53682                 if (event.left) {
53683                   event.resultInOut = false;
53684                   event.contourId   = ringId;
53685                 } else {
53686                   event.otherEvent.resultInOut = true;
53687                   event.otherEvent.contourId   = ringId;
53688                 }
53689
53690                 pos = event.pos;
53691                 processed[pos] = true;
53692                 contour[0].push(resultEvents[pos].point);
53693                 pos = nextPos(pos, resultEvents, processed, i);
53694               }
53695
53696               pos = pos === -1 ? i : pos;
53697
53698               event = resultEvents[pos];
53699               processed[pos] = processed[event.pos] = true;
53700               event.otherEvent.resultInOut = true;
53701               event.otherEvent.contourId   = ringId;
53702             }
53703
53704             // Handle if the result is a polygon (eg not multipoly)
53705             // Commented it again, let's see what do we mean by that
53706             // if (result.length === 1) result = result[0];
53707             return result;
53708           }
53709
53710           var tinyqueue = TinyQueue;
53711           var default_1 = TinyQueue;
53712
53713           function TinyQueue(data, compare) {
53714               var this$1 = this;
53715
53716               if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
53717
53718               this.data = data || [];
53719               this.length = this.data.length;
53720               this.compare = compare || defaultCompare;
53721
53722               if (this.length > 0) {
53723                   for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
53724               }
53725           }
53726
53727           function defaultCompare(a, b) {
53728               return a < b ? -1 : a > b ? 1 : 0;
53729           }
53730
53731           TinyQueue.prototype = {
53732
53733               push: function (item) {
53734                   this.data.push(item);
53735                   this.length++;
53736                   this._up(this.length - 1);
53737               },
53738
53739               pop: function () {
53740                   if (this.length === 0) { return undefined; }
53741
53742                   var top = this.data[0];
53743                   this.length--;
53744
53745                   if (this.length > 0) {
53746                       this.data[0] = this.data[this.length];
53747                       this._down(0);
53748                   }
53749                   this.data.pop();
53750
53751                   return top;
53752               },
53753
53754               peek: function () {
53755                   return this.data[0];
53756               },
53757
53758               _up: function (pos) {
53759                   var data = this.data;
53760                   var compare = this.compare;
53761                   var item = data[pos];
53762
53763                   while (pos > 0) {
53764                       var parent = (pos - 1) >> 1;
53765                       var current = data[parent];
53766                       if (compare(item, current) >= 0) { break; }
53767                       data[pos] = current;
53768                       pos = parent;
53769                   }
53770
53771                   data[pos] = item;
53772               },
53773
53774               _down: function (pos) {
53775                   var this$1 = this;
53776
53777                   var data = this.data;
53778                   var compare = this.compare;
53779                   var halfLength = this.length >> 1;
53780                   var item = data[pos];
53781
53782                   while (pos < halfLength) {
53783                       var left = (pos << 1) + 1;
53784                       var right = left + 1;
53785                       var best = data[left];
53786
53787                       if (right < this$1.length && compare(data[right], best) < 0) {
53788                           left = right;
53789                           best = data[right];
53790                       }
53791                       if (compare(best, item) >= 0) { break; }
53792
53793                       data[pos] = best;
53794                       pos = left;
53795                   }
53796
53797                   data[pos] = item;
53798               }
53799           };
53800           tinyqueue.default = default_1;
53801
53802           var max = Math.max;
53803           var min = Math.min;
53804
53805           var contourId = 0;
53806
53807
53808           function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
53809             var i, len, s1, s2, e1, e2;
53810             for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
53811               s1 = contourOrHole[i];
53812               s2 = contourOrHole[i + 1];
53813               e1 = new SweepEvent(s1, false, undefined, isSubject);
53814               e2 = new SweepEvent(s2, false, e1,        isSubject);
53815               e1.otherEvent = e2;
53816
53817               if (s1[0] === s2[0] && s1[1] === s2[1]) {
53818                 continue; // skip collapsed edges, or it breaks
53819               }
53820
53821               e1.contourId = e2.contourId = depth;
53822               if (!isExteriorRing) {
53823                 e1.isExteriorRing = false;
53824                 e2.isExteriorRing = false;
53825               }
53826               if (compareEvents(e1, e2) > 0) {
53827                 e2.left = true;
53828               } else {
53829                 e1.left = true;
53830               }
53831
53832               var x = s1[0], y = s1[1];
53833               bbox[0] = min(bbox[0], x);
53834               bbox[1] = min(bbox[1], y);
53835               bbox[2] = max(bbox[2], x);
53836               bbox[3] = max(bbox[3], y);
53837
53838               // Pushing it so the queue is sorted from left to right,
53839               // with object on the left having the highest priority.
53840               Q.push(e1);
53841               Q.push(e2);
53842             }
53843           }
53844
53845
53846           function fillQueue(subject, clipping, sbbox, cbbox, operation) {
53847             var eventQueue = new tinyqueue(null, compareEvents);
53848             var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
53849
53850             for (i = 0, ii = subject.length; i < ii; i++) {
53851               polygonSet = subject[i];
53852               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53853                 isExteriorRing = j === 0;
53854                 if (isExteriorRing) { contourId++; }
53855                 processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
53856               }
53857             }
53858
53859             for (i = 0, ii = clipping.length; i < ii; i++) {
53860               polygonSet = clipping[i];
53861               for (j = 0, jj = polygonSet.length; j < jj; j++) {
53862                 isExteriorRing = j === 0;
53863                 if (operation === DIFFERENCE) { isExteriorRing = false; }
53864                 if (isExteriorRing) { contourId++; }
53865                 processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
53866               }
53867             }
53868
53869             return eventQueue;
53870           }
53871
53872           var EMPTY = [];
53873
53874
53875           function trivialOperation(subject, clipping, operation) {
53876             var result = null;
53877             if (subject.length * clipping.length === 0) {
53878               if        (operation === INTERSECTION) {
53879                 result = EMPTY;
53880               } else if (operation === DIFFERENCE) {
53881                 result = subject;
53882               } else if (operation === UNION ||
53883                          operation === XOR) {
53884                 result = (subject.length === 0) ? clipping : subject;
53885               }
53886             }
53887             return result;
53888           }
53889
53890
53891           function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
53892             var result = null;
53893             if (sbbox[0] > cbbox[2] ||
53894                 cbbox[0] > sbbox[2] ||
53895                 sbbox[1] > cbbox[3] ||
53896                 cbbox[1] > sbbox[3]) {
53897               if        (operation === INTERSECTION) {
53898                 result = EMPTY;
53899               } else if (operation === DIFFERENCE) {
53900                 result = subject;
53901               } else if (operation === UNION ||
53902                          operation === XOR) {
53903                 result = subject.concat(clipping);
53904               }
53905             }
53906             return result;
53907           }
53908
53909
53910           function boolean(subject, clipping, operation) {
53911             if (typeof subject[0][0][0] === 'number') {
53912               subject = [subject];
53913             }
53914             if (typeof clipping[0][0][0] === 'number') {
53915               clipping = [clipping];
53916             }
53917             var trivial = trivialOperation(subject, clipping, operation);
53918             if (trivial) {
53919               return trivial === EMPTY ? null : trivial;
53920             }
53921             var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
53922             var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
53923
53924             //console.time('fill queue');
53925             var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
53926             //console.timeEnd('fill queue');
53927
53928             trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
53929             if (trivial) {
53930               return trivial === EMPTY ? null : trivial;
53931             }
53932             //console.time('subdivide edges');
53933             var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
53934             //console.timeEnd('subdivide edges');
53935
53936             //console.time('connect vertices');
53937             var result = connectEdges(sortedEvents, operation);
53938             //console.timeEnd('connect vertices');
53939             return result;
53940           }
53941
53942           function union (subject, clipping) {
53943             return boolean(subject, clipping, UNION);
53944           }
53945
53946           function diff (subject, clipping) {
53947             return boolean(subject, clipping, DIFFERENCE);
53948           }
53949
53950           function xor (subject, clipping){
53951             return boolean(subject, clipping, XOR);
53952           }
53953
53954           function intersection$1 (subject, clipping) {
53955             return boolean(subject, clipping, INTERSECTION);
53956           }
53957
53958           /**
53959            * @enum {Number}
53960            */
53961           var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
53962
53963           exports.union = union;
53964           exports.diff = diff;
53965           exports.xor = xor;
53966           exports.intersection = intersection$1;
53967           exports.operations = operations;
53968
53969           Object.defineProperty(exports, '__esModule', { value: true });
53970
53971         })));
53972
53973         });
53974
53975         var martinez = unwrapExports(martinez_umd);
53976
53977         var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
53978           var e, m;
53979           var eLen = (nBytes * 8) - mLen - 1;
53980           var eMax = (1 << eLen) - 1;
53981           var eBias = eMax >> 1;
53982           var nBits = -7;
53983           var i = isLE ? (nBytes - 1) : 0;
53984           var d = isLE ? -1 : 1;
53985           var s = buffer[offset + i];
53986
53987           i += d;
53988
53989           e = s & ((1 << (-nBits)) - 1);
53990           s >>= (-nBits);
53991           nBits += eLen;
53992           for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
53993
53994           m = e & ((1 << (-nBits)) - 1);
53995           e >>= (-nBits);
53996           nBits += mLen;
53997           for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
53998
53999           if (e === 0) {
54000             e = 1 - eBias;
54001           } else if (e === eMax) {
54002             return m ? NaN : ((s ? -1 : 1) * Infinity)
54003           } else {
54004             m = m + Math.pow(2, mLen);
54005             e = e - eBias;
54006           }
54007           return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
54008         };
54009
54010         var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
54011           var e, m, c;
54012           var eLen = (nBytes * 8) - mLen - 1;
54013           var eMax = (1 << eLen) - 1;
54014           var eBias = eMax >> 1;
54015           var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
54016           var i = isLE ? 0 : (nBytes - 1);
54017           var d = isLE ? 1 : -1;
54018           var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
54019
54020           value = Math.abs(value);
54021
54022           if (isNaN(value) || value === Infinity) {
54023             m = isNaN(value) ? 1 : 0;
54024             e = eMax;
54025           } else {
54026             e = Math.floor(Math.log(value) / Math.LN2);
54027             if (value * (c = Math.pow(2, -e)) < 1) {
54028               e--;
54029               c *= 2;
54030             }
54031             if (e + eBias >= 1) {
54032               value += rt / c;
54033             } else {
54034               value += rt * Math.pow(2, 1 - eBias);
54035             }
54036             if (value * c >= 2) {
54037               e++;
54038               c /= 2;
54039             }
54040
54041             if (e + eBias >= eMax) {
54042               m = 0;
54043               e = eMax;
54044             } else if (e + eBias >= 1) {
54045               m = ((value * c) - 1) * Math.pow(2, mLen);
54046               e = e + eBias;
54047             } else {
54048               m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
54049               e = 0;
54050             }
54051           }
54052
54053           for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
54054
54055           e = (e << mLen) | m;
54056           eLen += mLen;
54057           for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
54058
54059           buffer[offset + i - d] |= s * 128;
54060         };
54061
54062         var ieee754 = {
54063                 read: read$6,
54064                 write: write$6
54065         };
54066
54067         var pbf = Pbf;
54068
54069
54070
54071         function Pbf(buf) {
54072             this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
54073             this.pos = 0;
54074             this.type = 0;
54075             this.length = this.buf.length;
54076         }
54077
54078         Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
54079         Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
54080         Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
54081         Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
54082
54083         var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
54084             SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
54085
54086         Pbf.prototype = {
54087
54088             destroy: function() {
54089                 this.buf = null;
54090             },
54091
54092             // === READING =================================================================
54093
54094             readFields: function(readField, result, end) {
54095                 end = end || this.length;
54096
54097                 while (this.pos < end) {
54098                     var val = this.readVarint(),
54099                         tag = val >> 3,
54100                         startPos = this.pos;
54101
54102                     this.type = val & 0x7;
54103                     readField(tag, result, this);
54104
54105                     if (this.pos === startPos) this.skip(val);
54106                 }
54107                 return result;
54108             },
54109
54110             readMessage: function(readField, result) {
54111                 return this.readFields(readField, result, this.readVarint() + this.pos);
54112             },
54113
54114             readFixed32: function() {
54115                 var val = readUInt32(this.buf, this.pos);
54116                 this.pos += 4;
54117                 return val;
54118             },
54119
54120             readSFixed32: function() {
54121                 var val = readInt32(this.buf, this.pos);
54122                 this.pos += 4;
54123                 return val;
54124             },
54125
54126             // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
54127
54128             readFixed64: function() {
54129                 var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54130                 this.pos += 8;
54131                 return val;
54132             },
54133
54134             readSFixed64: function() {
54135                 var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
54136                 this.pos += 8;
54137                 return val;
54138             },
54139
54140             readFloat: function() {
54141                 var val = ieee754.read(this.buf, this.pos, true, 23, 4);
54142                 this.pos += 4;
54143                 return val;
54144             },
54145
54146             readDouble: function() {
54147                 var val = ieee754.read(this.buf, this.pos, true, 52, 8);
54148                 this.pos += 8;
54149                 return val;
54150             },
54151
54152             readVarint: function(isSigned) {
54153                 var buf = this.buf,
54154                     val, b;
54155
54156                 b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
54157                 b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
54158                 b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
54159                 b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
54160                 b = buf[this.pos];   val |= (b & 0x0f) << 28;
54161
54162                 return readVarintRemainder(val, isSigned, this);
54163             },
54164
54165             readVarint64: function() { // for compatibility with v2.0.1
54166                 return this.readVarint(true);
54167             },
54168
54169             readSVarint: function() {
54170                 var num = this.readVarint();
54171                 return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
54172             },
54173
54174             readBoolean: function() {
54175                 return Boolean(this.readVarint());
54176             },
54177
54178             readString: function() {
54179                 var end = this.readVarint() + this.pos,
54180                     str = readUtf8(this.buf, this.pos, end);
54181                 this.pos = end;
54182                 return str;
54183             },
54184
54185             readBytes: function() {
54186                 var end = this.readVarint() + this.pos,
54187                     buffer = this.buf.subarray(this.pos, end);
54188                 this.pos = end;
54189                 return buffer;
54190             },
54191
54192             // verbose for performance reasons; doesn't affect gzipped size
54193
54194             readPackedVarint: function(arr, isSigned) {
54195                 if (this.type !== Pbf.Bytes) return arr.push(this.readVarint(isSigned));
54196                 var end = readPackedEnd(this);
54197                 arr = arr || [];
54198                 while (this.pos < end) arr.push(this.readVarint(isSigned));
54199                 return arr;
54200             },
54201             readPackedSVarint: function(arr) {
54202                 if (this.type !== Pbf.Bytes) return arr.push(this.readSVarint());
54203                 var end = readPackedEnd(this);
54204                 arr = arr || [];
54205                 while (this.pos < end) arr.push(this.readSVarint());
54206                 return arr;
54207             },
54208             readPackedBoolean: function(arr) {
54209                 if (this.type !== Pbf.Bytes) return arr.push(this.readBoolean());
54210                 var end = readPackedEnd(this);
54211                 arr = arr || [];
54212                 while (this.pos < end) arr.push(this.readBoolean());
54213                 return arr;
54214             },
54215             readPackedFloat: function(arr) {
54216                 if (this.type !== Pbf.Bytes) return arr.push(this.readFloat());
54217                 var end = readPackedEnd(this);
54218                 arr = arr || [];
54219                 while (this.pos < end) arr.push(this.readFloat());
54220                 return arr;
54221             },
54222             readPackedDouble: function(arr) {
54223                 if (this.type !== Pbf.Bytes) return arr.push(this.readDouble());
54224                 var end = readPackedEnd(this);
54225                 arr = arr || [];
54226                 while (this.pos < end) arr.push(this.readDouble());
54227                 return arr;
54228             },
54229             readPackedFixed32: function(arr) {
54230                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed32());
54231                 var end = readPackedEnd(this);
54232                 arr = arr || [];
54233                 while (this.pos < end) arr.push(this.readFixed32());
54234                 return arr;
54235             },
54236             readPackedSFixed32: function(arr) {
54237                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed32());
54238                 var end = readPackedEnd(this);
54239                 arr = arr || [];
54240                 while (this.pos < end) arr.push(this.readSFixed32());
54241                 return arr;
54242             },
54243             readPackedFixed64: function(arr) {
54244                 if (this.type !== Pbf.Bytes) return arr.push(this.readFixed64());
54245                 var end = readPackedEnd(this);
54246                 arr = arr || [];
54247                 while (this.pos < end) arr.push(this.readFixed64());
54248                 return arr;
54249             },
54250             readPackedSFixed64: function(arr) {
54251                 if (this.type !== Pbf.Bytes) return arr.push(this.readSFixed64());
54252                 var end = readPackedEnd(this);
54253                 arr = arr || [];
54254                 while (this.pos < end) arr.push(this.readSFixed64());
54255                 return arr;
54256             },
54257
54258             skip: function(val) {
54259                 var type = val & 0x7;
54260                 if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
54261                 else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
54262                 else if (type === Pbf.Fixed32) this.pos += 4;
54263                 else if (type === Pbf.Fixed64) this.pos += 8;
54264                 else throw new Error('Unimplemented type: ' + type);
54265             },
54266
54267             // === WRITING =================================================================
54268
54269             writeTag: function(tag, type) {
54270                 this.writeVarint((tag << 3) | type);
54271             },
54272
54273             realloc: function(min) {
54274                 var length = this.length || 16;
54275
54276                 while (length < this.pos + min) length *= 2;
54277
54278                 if (length !== this.length) {
54279                     var buf = new Uint8Array(length);
54280                     buf.set(this.buf);
54281                     this.buf = buf;
54282                     this.length = length;
54283                 }
54284             },
54285
54286             finish: function() {
54287                 this.length = this.pos;
54288                 this.pos = 0;
54289                 return this.buf.subarray(0, this.length);
54290             },
54291
54292             writeFixed32: function(val) {
54293                 this.realloc(4);
54294                 writeInt32(this.buf, val, this.pos);
54295                 this.pos += 4;
54296             },
54297
54298             writeSFixed32: function(val) {
54299                 this.realloc(4);
54300                 writeInt32(this.buf, val, this.pos);
54301                 this.pos += 4;
54302             },
54303
54304             writeFixed64: function(val) {
54305                 this.realloc(8);
54306                 writeInt32(this.buf, val & -1, this.pos);
54307                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54308                 this.pos += 8;
54309             },
54310
54311             writeSFixed64: function(val) {
54312                 this.realloc(8);
54313                 writeInt32(this.buf, val & -1, this.pos);
54314                 writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
54315                 this.pos += 8;
54316             },
54317
54318             writeVarint: function(val) {
54319                 val = +val || 0;
54320
54321                 if (val > 0xfffffff || val < 0) {
54322                     writeBigVarint(val, this);
54323                     return;
54324                 }
54325
54326                 this.realloc(4);
54327
54328                 this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54329                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54330                 this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
54331                 this.buf[this.pos++] =   (val >>> 7) & 0x7f;
54332             },
54333
54334             writeSVarint: function(val) {
54335                 this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
54336             },
54337
54338             writeBoolean: function(val) {
54339                 this.writeVarint(Boolean(val));
54340             },
54341
54342             writeString: function(str) {
54343                 str = String(str);
54344                 this.realloc(str.length * 4);
54345
54346                 this.pos++; // reserve 1 byte for short string length
54347
54348                 var startPos = this.pos;
54349                 // write the string directly to the buffer and see how much was written
54350                 this.pos = writeUtf8(this.buf, str, this.pos);
54351                 var len = this.pos - startPos;
54352
54353                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54354
54355                 // finally, write the message length in the reserved place and restore the position
54356                 this.pos = startPos - 1;
54357                 this.writeVarint(len);
54358                 this.pos += len;
54359             },
54360
54361             writeFloat: function(val) {
54362                 this.realloc(4);
54363                 ieee754.write(this.buf, val, this.pos, true, 23, 4);
54364                 this.pos += 4;
54365             },
54366
54367             writeDouble: function(val) {
54368                 this.realloc(8);
54369                 ieee754.write(this.buf, val, this.pos, true, 52, 8);
54370                 this.pos += 8;
54371             },
54372
54373             writeBytes: function(buffer) {
54374                 var len = buffer.length;
54375                 this.writeVarint(len);
54376                 this.realloc(len);
54377                 for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
54378             },
54379
54380             writeRawMessage: function(fn, obj) {
54381                 this.pos++; // reserve 1 byte for short message length
54382
54383                 // write the message directly to the buffer and see how much was written
54384                 var startPos = this.pos;
54385                 fn(obj, this);
54386                 var len = this.pos - startPos;
54387
54388                 if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
54389
54390                 // finally, write the message length in the reserved place and restore the position
54391                 this.pos = startPos - 1;
54392                 this.writeVarint(len);
54393                 this.pos += len;
54394             },
54395
54396             writeMessage: function(tag, fn, obj) {
54397                 this.writeTag(tag, Pbf.Bytes);
54398                 this.writeRawMessage(fn, obj);
54399             },
54400
54401             writePackedVarint:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedVarint, arr);   },
54402             writePackedSVarint:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSVarint, arr);  },
54403             writePackedBoolean:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedBoolean, arr);  },
54404             writePackedFloat:    function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFloat, arr);    },
54405             writePackedDouble:   function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedDouble, arr);   },
54406             writePackedFixed32:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed32, arr);  },
54407             writePackedSFixed32: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed32, arr); },
54408             writePackedFixed64:  function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedFixed64, arr);  },
54409             writePackedSFixed64: function(tag, arr) { if (arr.length) this.writeMessage(tag, writePackedSFixed64, arr); },
54410
54411             writeBytesField: function(tag, buffer) {
54412                 this.writeTag(tag, Pbf.Bytes);
54413                 this.writeBytes(buffer);
54414             },
54415             writeFixed32Field: function(tag, val) {
54416                 this.writeTag(tag, Pbf.Fixed32);
54417                 this.writeFixed32(val);
54418             },
54419             writeSFixed32Field: function(tag, val) {
54420                 this.writeTag(tag, Pbf.Fixed32);
54421                 this.writeSFixed32(val);
54422             },
54423             writeFixed64Field: function(tag, val) {
54424                 this.writeTag(tag, Pbf.Fixed64);
54425                 this.writeFixed64(val);
54426             },
54427             writeSFixed64Field: function(tag, val) {
54428                 this.writeTag(tag, Pbf.Fixed64);
54429                 this.writeSFixed64(val);
54430             },
54431             writeVarintField: function(tag, val) {
54432                 this.writeTag(tag, Pbf.Varint);
54433                 this.writeVarint(val);
54434             },
54435             writeSVarintField: function(tag, val) {
54436                 this.writeTag(tag, Pbf.Varint);
54437                 this.writeSVarint(val);
54438             },
54439             writeStringField: function(tag, str) {
54440                 this.writeTag(tag, Pbf.Bytes);
54441                 this.writeString(str);
54442             },
54443             writeFloatField: function(tag, val) {
54444                 this.writeTag(tag, Pbf.Fixed32);
54445                 this.writeFloat(val);
54446             },
54447             writeDoubleField: function(tag, val) {
54448                 this.writeTag(tag, Pbf.Fixed64);
54449                 this.writeDouble(val);
54450             },
54451             writeBooleanField: function(tag, val) {
54452                 this.writeVarintField(tag, Boolean(val));
54453             }
54454         };
54455
54456         function readVarintRemainder(l, s, p) {
54457             var buf = p.buf,
54458                 h, b;
54459
54460             b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
54461             b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
54462             b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
54463             b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
54464             b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
54465             b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
54466
54467             throw new Error('Expected varint not more than 10 bytes');
54468         }
54469
54470         function readPackedEnd(pbf) {
54471             return pbf.type === Pbf.Bytes ?
54472                 pbf.readVarint() + pbf.pos : pbf.pos + 1;
54473         }
54474
54475         function toNum(low, high, isSigned) {
54476             if (isSigned) {
54477                 return high * 0x100000000 + (low >>> 0);
54478             }
54479
54480             return ((high >>> 0) * 0x100000000) + (low >>> 0);
54481         }
54482
54483         function writeBigVarint(val, pbf) {
54484             var low, high;
54485
54486             if (val >= 0) {
54487                 low  = (val % 0x100000000) | 0;
54488                 high = (val / 0x100000000) | 0;
54489             } else {
54490                 low  = ~(-val % 0x100000000);
54491                 high = ~(-val / 0x100000000);
54492
54493                 if (low ^ 0xffffffff) {
54494                     low = (low + 1) | 0;
54495                 } else {
54496                     low = 0;
54497                     high = (high + 1) | 0;
54498                 }
54499             }
54500
54501             if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
54502                 throw new Error('Given varint doesn\'t fit into 10 bytes');
54503             }
54504
54505             pbf.realloc(10);
54506
54507             writeBigVarintLow(low, high, pbf);
54508             writeBigVarintHigh(high, pbf);
54509         }
54510
54511         function writeBigVarintLow(low, high, pbf) {
54512             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54513             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54514             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54515             pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
54516             pbf.buf[pbf.pos]   = low & 0x7f;
54517         }
54518
54519         function writeBigVarintHigh(high, pbf) {
54520             var lsb = (high & 0x07) << 4;
54521
54522             pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
54523             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54524             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54525             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54526             pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
54527             pbf.buf[pbf.pos++]  = high & 0x7f;
54528         }
54529
54530         function makeRoomForExtraLength(startPos, len, pbf) {
54531             var extraLen =
54532                 len <= 0x3fff ? 1 :
54533                 len <= 0x1fffff ? 2 :
54534                 len <= 0xfffffff ? 3 : Math.floor(Math.log(len) / (Math.LN2 * 7));
54535
54536             // if 1 byte isn't enough for encoding message length, shift the data to the right
54537             pbf.realloc(extraLen);
54538             for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
54539         }
54540
54541         function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
54542         function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
54543         function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
54544         function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
54545         function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
54546         function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
54547         function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
54548         function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
54549         function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
54550
54551         // Buffer code below from https://github.com/feross/buffer, MIT-licensed
54552
54553         function readUInt32(buf, pos) {
54554             return ((buf[pos]) |
54555                 (buf[pos + 1] << 8) |
54556                 (buf[pos + 2] << 16)) +
54557                 (buf[pos + 3] * 0x1000000);
54558         }
54559
54560         function writeInt32(buf, val, pos) {
54561             buf[pos] = val;
54562             buf[pos + 1] = (val >>> 8);
54563             buf[pos + 2] = (val >>> 16);
54564             buf[pos + 3] = (val >>> 24);
54565         }
54566
54567         function readInt32(buf, pos) {
54568             return ((buf[pos]) |
54569                 (buf[pos + 1] << 8) |
54570                 (buf[pos + 2] << 16)) +
54571                 (buf[pos + 3] << 24);
54572         }
54573
54574         function readUtf8(buf, pos, end) {
54575             var str = '';
54576             var i = pos;
54577
54578             while (i < end) {
54579                 var b0 = buf[i];
54580                 var c = null; // codepoint
54581                 var bytesPerSequence =
54582                     b0 > 0xEF ? 4 :
54583                     b0 > 0xDF ? 3 :
54584                     b0 > 0xBF ? 2 : 1;
54585
54586                 if (i + bytesPerSequence > end) break;
54587
54588                 var b1, b2, b3;
54589
54590                 if (bytesPerSequence === 1) {
54591                     if (b0 < 0x80) {
54592                         c = b0;
54593                     }
54594                 } else if (bytesPerSequence === 2) {
54595                     b1 = buf[i + 1];
54596                     if ((b1 & 0xC0) === 0x80) {
54597                         c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
54598                         if (c <= 0x7F) {
54599                             c = null;
54600                         }
54601                     }
54602                 } else if (bytesPerSequence === 3) {
54603                     b1 = buf[i + 1];
54604                     b2 = buf[i + 2];
54605                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
54606                         c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
54607                         if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
54608                             c = null;
54609                         }
54610                     }
54611                 } else if (bytesPerSequence === 4) {
54612                     b1 = buf[i + 1];
54613                     b2 = buf[i + 2];
54614                     b3 = buf[i + 3];
54615                     if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
54616                         c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
54617                         if (c <= 0xFFFF || c >= 0x110000) {
54618                             c = null;
54619                         }
54620                     }
54621                 }
54622
54623                 if (c === null) {
54624                     c = 0xFFFD;
54625                     bytesPerSequence = 1;
54626
54627                 } else if (c > 0xFFFF) {
54628                     c -= 0x10000;
54629                     str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
54630                     c = 0xDC00 | c & 0x3FF;
54631                 }
54632
54633                 str += String.fromCharCode(c);
54634                 i += bytesPerSequence;
54635             }
54636
54637             return str;
54638         }
54639
54640         function writeUtf8(buf, str, pos) {
54641             for (var i = 0, c, lead; i < str.length; i++) {
54642                 c = str.charCodeAt(i); // code point
54643
54644                 if (c > 0xD7FF && c < 0xE000) {
54645                     if (lead) {
54646                         if (c < 0xDC00) {
54647                             buf[pos++] = 0xEF;
54648                             buf[pos++] = 0xBF;
54649                             buf[pos++] = 0xBD;
54650                             lead = c;
54651                             continue;
54652                         } else {
54653                             c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
54654                             lead = null;
54655                         }
54656                     } else {
54657                         if (c > 0xDBFF || (i + 1 === str.length)) {
54658                             buf[pos++] = 0xEF;
54659                             buf[pos++] = 0xBF;
54660                             buf[pos++] = 0xBD;
54661                         } else {
54662                             lead = c;
54663                         }
54664                         continue;
54665                     }
54666                 } else if (lead) {
54667                     buf[pos++] = 0xEF;
54668                     buf[pos++] = 0xBF;
54669                     buf[pos++] = 0xBD;
54670                     lead = null;
54671                 }
54672
54673                 if (c < 0x80) {
54674                     buf[pos++] = c;
54675                 } else {
54676                     if (c < 0x800) {
54677                         buf[pos++] = c >> 0x6 | 0xC0;
54678                     } else {
54679                         if (c < 0x10000) {
54680                             buf[pos++] = c >> 0xC | 0xE0;
54681                         } else {
54682                             buf[pos++] = c >> 0x12 | 0xF0;
54683                             buf[pos++] = c >> 0xC & 0x3F | 0x80;
54684                         }
54685                         buf[pos++] = c >> 0x6 & 0x3F | 0x80;
54686                     }
54687                     buf[pos++] = c & 0x3F | 0x80;
54688                 }
54689             }
54690             return pos;
54691         }
54692
54693         var pointGeometry = Point;
54694
54695         /**
54696          * A standalone point geometry with useful accessor, comparison, and
54697          * modification methods.
54698          *
54699          * @class Point
54700          * @param {Number} x the x-coordinate. this could be longitude or screen
54701          * pixels, or any other sort of unit.
54702          * @param {Number} y the y-coordinate. this could be latitude or screen
54703          * pixels, or any other sort of unit.
54704          * @example
54705          * var point = new Point(-77, 38);
54706          */
54707         function Point(x, y) {
54708             this.x = x;
54709             this.y = y;
54710         }
54711
54712         Point.prototype = {
54713
54714             /**
54715              * Clone this point, returning a new point that can be modified
54716              * without affecting the old one.
54717              * @return {Point} the clone
54718              */
54719             clone: function() { return new Point(this.x, this.y); },
54720
54721             /**
54722              * Add this point's x & y coordinates to another point,
54723              * yielding a new point.
54724              * @param {Point} p the other point
54725              * @return {Point} output point
54726              */
54727             add:     function(p) { return this.clone()._add(p); },
54728
54729             /**
54730              * Subtract this point's x & y coordinates to from point,
54731              * yielding a new point.
54732              * @param {Point} p the other point
54733              * @return {Point} output point
54734              */
54735             sub:     function(p) { return this.clone()._sub(p); },
54736
54737             /**
54738              * Multiply this point's x & y coordinates by point,
54739              * yielding a new point.
54740              * @param {Point} p the other point
54741              * @return {Point} output point
54742              */
54743             multByPoint:    function(p) { return this.clone()._multByPoint(p); },
54744
54745             /**
54746              * Divide this point's x & y coordinates by point,
54747              * yielding a new point.
54748              * @param {Point} p the other point
54749              * @return {Point} output point
54750              */
54751             divByPoint:     function(p) { return this.clone()._divByPoint(p); },
54752
54753             /**
54754              * Multiply this point's x & y coordinates by a factor,
54755              * yielding a new point.
54756              * @param {Point} k factor
54757              * @return {Point} output point
54758              */
54759             mult:    function(k) { return this.clone()._mult(k); },
54760
54761             /**
54762              * Divide this point's x & y coordinates by a factor,
54763              * yielding a new point.
54764              * @param {Point} k factor
54765              * @return {Point} output point
54766              */
54767             div:     function(k) { return this.clone()._div(k); },
54768
54769             /**
54770              * Rotate this point around the 0, 0 origin by an angle a,
54771              * given in radians
54772              * @param {Number} a angle to rotate around, in radians
54773              * @return {Point} output point
54774              */
54775             rotate:  function(a) { return this.clone()._rotate(a); },
54776
54777             /**
54778              * Rotate this point around p point by an angle a,
54779              * given in radians
54780              * @param {Number} a angle to rotate around, in radians
54781              * @param {Point} p Point to rotate around
54782              * @return {Point} output point
54783              */
54784             rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
54785
54786             /**
54787              * Multiply this point by a 4x1 transformation matrix
54788              * @param {Array<Number>} m transformation matrix
54789              * @return {Point} output point
54790              */
54791             matMult: function(m) { return this.clone()._matMult(m); },
54792
54793             /**
54794              * Calculate this point but as a unit vector from 0, 0, meaning
54795              * that the distance from the resulting point to the 0, 0
54796              * coordinate will be equal to 1 and the angle from the resulting
54797              * point to the 0, 0 coordinate will be the same as before.
54798              * @return {Point} unit vector point
54799              */
54800             unit:    function() { return this.clone()._unit(); },
54801
54802             /**
54803              * Compute a perpendicular point, where the new y coordinate
54804              * is the old x coordinate and the new x coordinate is the old y
54805              * coordinate multiplied by -1
54806              * @return {Point} perpendicular point
54807              */
54808             perp:    function() { return this.clone()._perp(); },
54809
54810             /**
54811              * Return a version of this point with the x & y coordinates
54812              * rounded to integers.
54813              * @return {Point} rounded point
54814              */
54815             round:   function() { return this.clone()._round(); },
54816
54817             /**
54818              * Return the magitude of this point: this is the Euclidean
54819              * distance from the 0, 0 coordinate to this point's x and y
54820              * coordinates.
54821              * @return {Number} magnitude
54822              */
54823             mag: function() {
54824                 return Math.sqrt(this.x * this.x + this.y * this.y);
54825             },
54826
54827             /**
54828              * Judge whether this point is equal to another point, returning
54829              * true or false.
54830              * @param {Point} other the other point
54831              * @return {boolean} whether the points are equal
54832              */
54833             equals: function(other) {
54834                 return this.x === other.x &&
54835                        this.y === other.y;
54836             },
54837
54838             /**
54839              * Calculate the distance from this point to another point
54840              * @param {Point} p the other point
54841              * @return {Number} distance
54842              */
54843             dist: function(p) {
54844                 return Math.sqrt(this.distSqr(p));
54845             },
54846
54847             /**
54848              * Calculate the distance from this point to another point,
54849              * without the square root step. Useful if you're comparing
54850              * relative distances.
54851              * @param {Point} p the other point
54852              * @return {Number} distance
54853              */
54854             distSqr: function(p) {
54855                 var dx = p.x - this.x,
54856                     dy = p.y - this.y;
54857                 return dx * dx + dy * dy;
54858             },
54859
54860             /**
54861              * Get the angle from the 0, 0 coordinate to this point, in radians
54862              * coordinates.
54863              * @return {Number} angle
54864              */
54865             angle: function() {
54866                 return Math.atan2(this.y, this.x);
54867             },
54868
54869             /**
54870              * Get the angle from this point to another point, in radians
54871              * @param {Point} b the other point
54872              * @return {Number} angle
54873              */
54874             angleTo: function(b) {
54875                 return Math.atan2(this.y - b.y, this.x - b.x);
54876             },
54877
54878             /**
54879              * Get the angle between this point and another point, in radians
54880              * @param {Point} b the other point
54881              * @return {Number} angle
54882              */
54883             angleWith: function(b) {
54884                 return this.angleWithSep(b.x, b.y);
54885             },
54886
54887             /*
54888              * Find the angle of the two vectors, solving the formula for
54889              * the cross product a x b = |a||b|sin(θ) for θ.
54890              * @param {Number} x the x-coordinate
54891              * @param {Number} y the y-coordinate
54892              * @return {Number} the angle in radians
54893              */
54894             angleWithSep: function(x, y) {
54895                 return Math.atan2(
54896                     this.x * y - this.y * x,
54897                     this.x * x + this.y * y);
54898             },
54899
54900             _matMult: function(m) {
54901                 var x = m[0] * this.x + m[1] * this.y,
54902                     y = m[2] * this.x + m[3] * this.y;
54903                 this.x = x;
54904                 this.y = y;
54905                 return this;
54906             },
54907
54908             _add: function(p) {
54909                 this.x += p.x;
54910                 this.y += p.y;
54911                 return this;
54912             },
54913
54914             _sub: function(p) {
54915                 this.x -= p.x;
54916                 this.y -= p.y;
54917                 return this;
54918             },
54919
54920             _mult: function(k) {
54921                 this.x *= k;
54922                 this.y *= k;
54923                 return this;
54924             },
54925
54926             _div: function(k) {
54927                 this.x /= k;
54928                 this.y /= k;
54929                 return this;
54930             },
54931
54932             _multByPoint: function(p) {
54933                 this.x *= p.x;
54934                 this.y *= p.y;
54935                 return this;
54936             },
54937
54938             _divByPoint: function(p) {
54939                 this.x /= p.x;
54940                 this.y /= p.y;
54941                 return this;
54942             },
54943
54944             _unit: function() {
54945                 this._div(this.mag());
54946                 return this;
54947             },
54948
54949             _perp: function() {
54950                 var y = this.y;
54951                 this.y = this.x;
54952                 this.x = -y;
54953                 return this;
54954             },
54955
54956             _rotate: function(angle) {
54957                 var cos = Math.cos(angle),
54958                     sin = Math.sin(angle),
54959                     x = cos * this.x - sin * this.y,
54960                     y = sin * this.x + cos * this.y;
54961                 this.x = x;
54962                 this.y = y;
54963                 return this;
54964             },
54965
54966             _rotateAround: function(angle, p) {
54967                 var cos = Math.cos(angle),
54968                     sin = Math.sin(angle),
54969                     x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
54970                     y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
54971                 this.x = x;
54972                 this.y = y;
54973                 return this;
54974             },
54975
54976             _round: function() {
54977                 this.x = Math.round(this.x);
54978                 this.y = Math.round(this.y);
54979                 return this;
54980             }
54981         };
54982
54983         /**
54984          * Construct a point from an array if necessary, otherwise if the input
54985          * is already a Point, or an unknown type, return it unchanged
54986          * @param {Array<Number>|Point|*} a any kind of input value
54987          * @return {Point} constructed point, or passed-through value.
54988          * @example
54989          * // this
54990          * var point = Point.convert([0, 1]);
54991          * // is equivalent to
54992          * var point = new Point(0, 1);
54993          */
54994         Point.convert = function (a) {
54995             if (a instanceof Point) {
54996                 return a;
54997             }
54998             if (Array.isArray(a)) {
54999                 return new Point(a[0], a[1]);
55000             }
55001             return a;
55002         };
55003
55004         var vectortilefeature = VectorTileFeature;
55005
55006         function VectorTileFeature(pbf, end, extent, keys, values) {
55007             // Public
55008             this.properties = {};
55009             this.extent = extent;
55010             this.type = 0;
55011
55012             // Private
55013             this._pbf = pbf;
55014             this._geometry = -1;
55015             this._keys = keys;
55016             this._values = values;
55017
55018             pbf.readFields(readFeature, this, end);
55019         }
55020
55021         function readFeature(tag, feature, pbf) {
55022             if (tag == 1) feature.id = pbf.readVarint();
55023             else if (tag == 2) readTag(pbf, feature);
55024             else if (tag == 3) feature.type = pbf.readVarint();
55025             else if (tag == 4) feature._geometry = pbf.pos;
55026         }
55027
55028         function readTag(pbf, feature) {
55029             var end = pbf.readVarint() + pbf.pos;
55030
55031             while (pbf.pos < end) {
55032                 var key = feature._keys[pbf.readVarint()],
55033                     value = feature._values[pbf.readVarint()];
55034                 feature.properties[key] = value;
55035             }
55036         }
55037
55038         VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
55039
55040         VectorTileFeature.prototype.loadGeometry = function() {
55041             var pbf = this._pbf;
55042             pbf.pos = this._geometry;
55043
55044             var end = pbf.readVarint() + pbf.pos,
55045                 cmd = 1,
55046                 length = 0,
55047                 x = 0,
55048                 y = 0,
55049                 lines = [],
55050                 line;
55051
55052             while (pbf.pos < end) {
55053                 if (length <= 0) {
55054                     var cmdLen = pbf.readVarint();
55055                     cmd = cmdLen & 0x7;
55056                     length = cmdLen >> 3;
55057                 }
55058
55059                 length--;
55060
55061                 if (cmd === 1 || cmd === 2) {
55062                     x += pbf.readSVarint();
55063                     y += pbf.readSVarint();
55064
55065                     if (cmd === 1) { // moveTo
55066                         if (line) lines.push(line);
55067                         line = [];
55068                     }
55069
55070                     line.push(new pointGeometry(x, y));
55071
55072                 } else if (cmd === 7) {
55073
55074                     // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
55075                     if (line) {
55076                         line.push(line[0].clone()); // closePolygon
55077                     }
55078
55079                 } else {
55080                     throw new Error('unknown command ' + cmd);
55081                 }
55082             }
55083
55084             if (line) lines.push(line);
55085
55086             return lines;
55087         };
55088
55089         VectorTileFeature.prototype.bbox = function() {
55090             var pbf = this._pbf;
55091             pbf.pos = this._geometry;
55092
55093             var end = pbf.readVarint() + pbf.pos,
55094                 cmd = 1,
55095                 length = 0,
55096                 x = 0,
55097                 y = 0,
55098                 x1 = Infinity,
55099                 x2 = -Infinity,
55100                 y1 = Infinity,
55101                 y2 = -Infinity;
55102
55103             while (pbf.pos < end) {
55104                 if (length <= 0) {
55105                     var cmdLen = pbf.readVarint();
55106                     cmd = cmdLen & 0x7;
55107                     length = cmdLen >> 3;
55108                 }
55109
55110                 length--;
55111
55112                 if (cmd === 1 || cmd === 2) {
55113                     x += pbf.readSVarint();
55114                     y += pbf.readSVarint();
55115                     if (x < x1) x1 = x;
55116                     if (x > x2) x2 = x;
55117                     if (y < y1) y1 = y;
55118                     if (y > y2) y2 = y;
55119
55120                 } else if (cmd !== 7) {
55121                     throw new Error('unknown command ' + cmd);
55122                 }
55123             }
55124
55125             return [x1, y1, x2, y2];
55126         };
55127
55128         VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
55129             var size = this.extent * Math.pow(2, z),
55130                 x0 = this.extent * x,
55131                 y0 = this.extent * y,
55132                 coords = this.loadGeometry(),
55133                 type = VectorTileFeature.types[this.type],
55134                 i, j;
55135
55136             function project(line) {
55137                 for (var j = 0; j < line.length; j++) {
55138                     var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
55139                     line[j] = [
55140                         (p.x + x0) * 360 / size - 180,
55141                         360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
55142                     ];
55143                 }
55144             }
55145
55146             switch (this.type) {
55147             case 1:
55148                 var points = [];
55149                 for (i = 0; i < coords.length; i++) {
55150                     points[i] = coords[i][0];
55151                 }
55152                 coords = points;
55153                 project(coords);
55154                 break;
55155
55156             case 2:
55157                 for (i = 0; i < coords.length; i++) {
55158                     project(coords[i]);
55159                 }
55160                 break;
55161
55162             case 3:
55163                 coords = classifyRings(coords);
55164                 for (i = 0; i < coords.length; i++) {
55165                     for (j = 0; j < coords[i].length; j++) {
55166                         project(coords[i][j]);
55167                     }
55168                 }
55169                 break;
55170             }
55171
55172             if (coords.length === 1) {
55173                 coords = coords[0];
55174             } else {
55175                 type = 'Multi' + type;
55176             }
55177
55178             var result = {
55179                 type: "Feature",
55180                 geometry: {
55181                     type: type,
55182                     coordinates: coords
55183                 },
55184                 properties: this.properties
55185             };
55186
55187             if ('id' in this) {
55188                 result.id = this.id;
55189             }
55190
55191             return result;
55192         };
55193
55194         // classifies an array of rings into polygons with outer rings and holes
55195
55196         function classifyRings(rings) {
55197             var len = rings.length;
55198
55199             if (len <= 1) return [rings];
55200
55201             var polygons = [],
55202                 polygon,
55203                 ccw;
55204
55205             for (var i = 0; i < len; i++) {
55206                 var area = signedArea(rings[i]);
55207                 if (area === 0) continue;
55208
55209                 if (ccw === undefined) ccw = area < 0;
55210
55211                 if (ccw === area < 0) {
55212                     if (polygon) polygons.push(polygon);
55213                     polygon = [rings[i]];
55214
55215                 } else {
55216                     polygon.push(rings[i]);
55217                 }
55218             }
55219             if (polygon) polygons.push(polygon);
55220
55221             return polygons;
55222         }
55223
55224         function signedArea(ring) {
55225             var sum = 0;
55226             for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
55227                 p1 = ring[i];
55228                 p2 = ring[j];
55229                 sum += (p2.x - p1.x) * (p1.y + p2.y);
55230             }
55231             return sum;
55232         }
55233
55234         var vectortilelayer = VectorTileLayer;
55235
55236         function VectorTileLayer(pbf, end) {
55237             // Public
55238             this.version = 1;
55239             this.name = null;
55240             this.extent = 4096;
55241             this.length = 0;
55242
55243             // Private
55244             this._pbf = pbf;
55245             this._keys = [];
55246             this._values = [];
55247             this._features = [];
55248
55249             pbf.readFields(readLayer, this, end);
55250
55251             this.length = this._features.length;
55252         }
55253
55254         function readLayer(tag, layer, pbf) {
55255             if (tag === 15) layer.version = pbf.readVarint();
55256             else if (tag === 1) layer.name = pbf.readString();
55257             else if (tag === 5) layer.extent = pbf.readVarint();
55258             else if (tag === 2) layer._features.push(pbf.pos);
55259             else if (tag === 3) layer._keys.push(pbf.readString());
55260             else if (tag === 4) layer._values.push(readValueMessage(pbf));
55261         }
55262
55263         function readValueMessage(pbf) {
55264             var value = null,
55265                 end = pbf.readVarint() + pbf.pos;
55266
55267             while (pbf.pos < end) {
55268                 var tag = pbf.readVarint() >> 3;
55269
55270                 value = tag === 1 ? pbf.readString() :
55271                     tag === 2 ? pbf.readFloat() :
55272                     tag === 3 ? pbf.readDouble() :
55273                     tag === 4 ? pbf.readVarint64() :
55274                     tag === 5 ? pbf.readVarint() :
55275                     tag === 6 ? pbf.readSVarint() :
55276                     tag === 7 ? pbf.readBoolean() : null;
55277             }
55278
55279             return value;
55280         }
55281
55282         // return feature `i` from this layer as a `VectorTileFeature`
55283         VectorTileLayer.prototype.feature = function(i) {
55284             if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
55285
55286             this._pbf.pos = this._features[i];
55287
55288             var end = this._pbf.readVarint() + this._pbf.pos;
55289             return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
55290         };
55291
55292         var vectortile = VectorTile;
55293
55294         function VectorTile(pbf, end) {
55295             this.layers = pbf.readFields(readTile, {}, end);
55296         }
55297
55298         function readTile(tag, layers, pbf) {
55299             if (tag === 3) {
55300                 var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
55301                 if (layer.length) layers[layer.name] = layer;
55302             }
55303         }
55304
55305         var VectorTile$1 = vectortile;
55306         var VectorTileFeature$1 = vectortilefeature;
55307         var VectorTileLayer$1 = vectortilelayer;
55308
55309         var vectorTile = {
55310                 VectorTile: VectorTile$1,
55311                 VectorTileFeature: VectorTileFeature$1,
55312                 VectorTileLayer: VectorTileLayer$1
55313         };
55314
55315         var tiler$6 = utilTiler().tileSize(512).margin(1);
55316         var dispatch$7 = dispatch('loadedData');
55317         var _vtCache;
55318
55319
55320         function abortRequest$6(controller) {
55321             controller.abort();
55322         }
55323
55324
55325         function vtToGeoJSON(data, tile, mergeCache) {
55326             var vectorTile$1 = new vectorTile.VectorTile(new pbf(data));
55327             var layers = Object.keys(vectorTile$1.layers);
55328             if (!Array.isArray(layers)) { layers = [layers]; }
55329
55330             var features = [];
55331             layers.forEach(function(layerID) {
55332                 var layer = vectorTile$1.layers[layerID];
55333                 if (layer) {
55334                     for (var i = 0; i < layer.length; i++) {
55335                         var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
55336                         var geometry = feature.geometry;
55337
55338                         // Treat all Polygons as MultiPolygons
55339                         if (geometry.type === 'Polygon') {
55340                             geometry.type = 'MultiPolygon';
55341                             geometry.coordinates = [geometry.coordinates];
55342                         }
55343
55344                         // Clip to tile bounds
55345                         if (geometry.type === 'MultiPolygon') {
55346                             var isClipped = false;
55347                             var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
55348                             if (!fastDeepEqual(feature.geometry, featureClip.geometry)) {
55349                                 // feature = featureClip;
55350                                 isClipped = true;
55351                             }
55352                             if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
55353                             if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
55354                         }
55355
55356                         // Generate some unique IDs and add some metadata
55357                         var featurehash = utilHashcode(fastJsonStableStringify(feature));
55358                         var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
55359                         feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
55360                         feature.__featurehash__ = featurehash;
55361                         feature.__propertyhash__ = propertyhash;
55362                         features.push(feature);
55363
55364                         // Clipped Polygons at same zoom with identical properties can get merged
55365                         if (isClipped && geometry.type === 'MultiPolygon') {
55366                             var merged = mergeCache[propertyhash];
55367                             if (merged && merged.length) {
55368                                 var other = merged[0];
55369                                 var coords = martinez.union(
55370                                     feature.geometry.coordinates, other.geometry.coordinates
55371                                 );
55372
55373                                 if (!coords || !coords.length) {
55374                                     continue;  // something failed in martinez union
55375                                 }
55376
55377                                 merged.push(feature);
55378                                 for (var j = 0; j < merged.length; j++) {      // all these features get...
55379                                     merged[j].geometry.coordinates = coords;   // same coords
55380                                     merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
55381                                 }
55382                             } else {
55383                                 mergeCache[propertyhash] = [feature];
55384                             }
55385                         }
55386                     }
55387                 }
55388             });
55389
55390             return features;
55391         }
55392
55393
55394         function loadTile(source, tile) {
55395             if (source.loaded[tile.id] || source.inflight[tile.id]) return;
55396
55397             var url = source.template
55398                 .replace('{x}', tile.xyz[0])
55399                 .replace('{y}', tile.xyz[1])
55400                 // TMS-flipped y coordinate
55401                 .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
55402                 .replace(/\{z(oom)?\}/, tile.xyz[2])
55403                 .replace(/\{switch:([^}]+)\}/, function(s, r) {
55404                     var subdomains = r.split(',');
55405                     return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
55406                 });
55407
55408
55409             var controller = new AbortController();
55410             source.inflight[tile.id] = controller;
55411
55412             fetch(url, { signal: controller.signal })
55413                 .then(function(response) {
55414                     if (!response.ok) {
55415                         throw new Error(response.status + ' ' + response.statusText);
55416                     }
55417                     source.loaded[tile.id] = [];
55418                     delete source.inflight[tile.id];
55419                     return response.arrayBuffer();
55420                 })
55421                 .then(function(data) {
55422                     if (!data) {
55423                         throw new Error('No Data');
55424                     }
55425
55426                     var z = tile.xyz[2];
55427                     if (!source.canMerge[z]) {
55428                         source.canMerge[z] = {};  // initialize mergeCache
55429                     }
55430
55431                     source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
55432                     dispatch$7.call('loadedData');
55433                 })
55434                 .catch(function() {
55435                     source.loaded[tile.id] = [];
55436                     delete source.inflight[tile.id];
55437                 });
55438         }
55439
55440
55441         var serviceVectorTile = {
55442
55443             init: function() {
55444                 if (!_vtCache) {
55445                     this.reset();
55446                 }
55447
55448                 this.event = utilRebind(this, dispatch$7, 'on');
55449             },
55450
55451
55452             reset: function() {
55453                 for (var sourceID in _vtCache) {
55454                     var source = _vtCache[sourceID];
55455                     if (source && source.inflight) {
55456                         Object.values(source.inflight).forEach(abortRequest$6);
55457                     }
55458                 }
55459
55460                 _vtCache = {};
55461             },
55462
55463
55464             addSource: function(sourceID, template) {
55465                 _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
55466                 return _vtCache[sourceID];
55467             },
55468
55469
55470             data: function(sourceID, projection) {
55471                 var source = _vtCache[sourceID];
55472                 if (!source) return [];
55473
55474                 var tiles = tiler$6.getTiles(projection);
55475                 var seen = {};
55476                 var results = [];
55477
55478                 for (var i = 0; i < tiles.length; i++) {
55479                     var features = source.loaded[tiles[i].id];
55480                     if (!features || !features.length) continue;
55481
55482                     for (var j = 0; j < features.length; j++) {
55483                         var feature = features[j];
55484                         var hash = feature.__featurehash__;
55485                         if (seen[hash]) continue;
55486                         seen[hash] = true;
55487
55488                         // return a shallow copy, because the hash may change
55489                         // later if this feature gets merged with another
55490                         results.push(Object.assign({}, feature));  // shallow copy
55491                     }
55492                 }
55493
55494                 return results;
55495             },
55496
55497
55498             loadTiles: function(sourceID, template, projection) {
55499                 var source = _vtCache[sourceID];
55500                 if (!source) {
55501                     source = this.addSource(sourceID, template);
55502                 }
55503
55504                 var tiles = tiler$6.getTiles(projection);
55505
55506                 // abort inflight requests that are no longer needed
55507                 Object.keys(source.inflight).forEach(function(k) {
55508                     var wanted = tiles.find(function(tile) { return k === tile.id; });
55509                     if (!wanted) {
55510                         abortRequest$6(source.inflight[k]);
55511                         delete source.inflight[k];
55512                     }
55513                 });
55514
55515                 tiles.forEach(function(tile) {
55516                     loadTile(source, tile);
55517                 });
55518             },
55519
55520
55521             cache: function() {
55522                 return _vtCache;
55523             }
55524
55525         };
55526
55527         var apibase$5 = 'https://www.wikidata.org/w/api.php?';
55528         var _wikidataCache = {};
55529
55530
55531         var serviceWikidata = {
55532
55533             init: function() {},
55534
55535             reset: function() {
55536                 _wikidataCache = {};
55537             },
55538
55539
55540             // Search for Wikidata items matching the query
55541             itemsForSearchQuery: function(query, callback) {
55542                 if (!query) {
55543                     if (callback) callback('No query', {});
55544                     return;
55545                 }
55546
55547                 var url = apibase$5 + utilQsString({
55548                     action: 'wbsearchentities',
55549                     format: 'json',
55550                     formatversion: 2,
55551                     search: query,
55552                     type: 'item',
55553                     language: this.languagesToQuery()[0],
55554                     limit: 10,
55555                     origin: '*'
55556                 });
55557
55558                 d3_json(url)
55559                     .then(function(result) {
55560                         if (result && result.error) {
55561                             throw new Error(result.error);
55562                         }
55563                         if (callback) callback(null, result.search || {});
55564                     })
55565                     .catch(function(err) {
55566                         if (callback) callback(err.message, {});
55567                     });
55568             },
55569
55570
55571             // Given a Wikipedia language and article title,
55572             // return an array of corresponding Wikidata entities.
55573             itemsByTitle: function(lang, title, callback) {
55574                 if (!title) {
55575                     if (callback) callback('No title', {});
55576                     return;
55577                 }
55578
55579                 lang = lang || 'en';
55580                 var url = apibase$5 + utilQsString({
55581                     action: 'wbgetentities',
55582                     format: 'json',
55583                     formatversion: 2,
55584                     sites: lang.replace(/-/g, '_') + 'wiki',
55585                     titles: title,
55586                     languages: 'en', // shrink response by filtering to one language
55587                     origin: '*'
55588                 });
55589
55590                 d3_json(url)
55591                     .then(function(result) {
55592                         if (result && result.error) {
55593                             throw new Error(result.error);
55594                         }
55595                         if (callback) callback(null, result.entities || {});
55596                     })
55597                     .catch(function(err) {
55598                         if (callback) callback(err.message, {});
55599                     });
55600             },
55601
55602
55603             languagesToQuery: function() {
55604                 return utilArrayUniq([
55605                     currentLocale.toLowerCase(),
55606                     currentLocale.split('-', 2)[0].toLowerCase(),
55607                     'en'
55608                 ]);
55609             },
55610
55611
55612             entityByQID: function(qid, callback) {
55613                 if (!qid) {
55614                     callback('No qid', {});
55615                     return;
55616                 }
55617                 if (_wikidataCache[qid]) {
55618                     if (callback) callback(null, _wikidataCache[qid]);
55619                     return;
55620                 }
55621
55622                 var langs = this.languagesToQuery();
55623                 var url = apibase$5 + utilQsString({
55624                     action: 'wbgetentities',
55625                     format: 'json',
55626                     formatversion: 2,
55627                     ids: qid,
55628                     props: 'labels|descriptions|claims|sitelinks',
55629                     sitefilter: langs.map(function(d) { return d + 'wiki'; }).join('|'),
55630                     languages: langs.join('|'),
55631                     languagefallback: 1,
55632                     origin: '*'
55633                 });
55634
55635                 d3_json(url)
55636                     .then(function(result) {
55637                         if (result && result.error) {
55638                             throw new Error(result.error);
55639                         }
55640                         if (callback) callback(null, result.entities[qid] || {});
55641                     })
55642                     .catch(function(err) {
55643                         if (callback) callback(err.message, {});
55644                     });
55645             },
55646
55647
55648             // Pass `params` object of the form:
55649             // {
55650             //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
55651             // }
55652             //
55653             // Get an result object used to display tag documentation
55654             // {
55655             //   title:        'string',
55656             //   description:  'string',
55657             //   editURL:      'string',
55658             //   imageURL:     'string',
55659             //   wiki:         { title: 'string', text: 'string', url: 'string' }
55660             // }
55661             //
55662             getDocs: function(params, callback) {
55663                 var langs = this.languagesToQuery();
55664                 this.entityByQID(params.qid, function(err, entity) {
55665                     if (err || !entity) {
55666                         callback(err || 'No entity');
55667                         return;
55668                     }
55669
55670                     var i;
55671                     var description;
55672                     if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
55673                         description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
55674                     }
55675
55676                     // prepare result
55677                     var result = {
55678                         title: entity.id,
55679                         description: description,
55680                         editURL: 'https://www.wikidata.org/wiki/' + entity.id
55681                     };
55682
55683                     // add image
55684                     if (entity.claims) {
55685                         var imageroot = 'https://commons.wikimedia.org/w/index.php';
55686                         var props = ['P154','P18'];  // logo image, image
55687                         var prop, image;
55688                         for (i = 0; i < props.length; i++) {
55689                             prop = entity.claims[props[i]];
55690                             if (prop && Object.keys(prop).length > 0) {
55691                                 image = prop[Object.keys(prop)[0]].mainsnak.datavalue.value;
55692                                 if (image) {
55693                                     result.imageURL = imageroot + '?' + utilQsString({
55694                                         title: 'Special:Redirect/file/' + image,
55695                                         width: 400
55696                                     });
55697                                     break;
55698                                 }
55699                             }
55700                         }
55701                     }
55702
55703                     if (entity.sitelinks) {
55704                         var englishLocale = (currentLocale.split('-', 2)[0].toLowerCase() === 'en');
55705
55706                         // must be one of these that we requested..
55707                         for (i = 0; i < langs.length; i++) {   // check each, in order of preference
55708                             var w = langs[i] + 'wiki';
55709                             if (entity.sitelinks[w]) {
55710                                 var title = entity.sitelinks[w].title;
55711                                 var tKey = 'inspector.wiki_reference';
55712                                 if (!englishLocale && langs[i] === 'en') {   // user's currentLocale isn't English but
55713                                     tKey = 'inspector.wiki_en_reference';    // we are sending them to enwiki anyway..
55714                                 }
55715
55716                                 result.wiki = {
55717                                     title: title,
55718                                     text: tKey,
55719                                     url: 'https://' + langs[i] + '.wikipedia.org/wiki/' + title.replace(/ /g, '_')
55720                                 };
55721                                 break;
55722                             }
55723                         }
55724                     }
55725
55726                     callback(null, result);
55727                 });
55728             }
55729
55730         };
55731
55732         var endpoint = 'https://en.wikipedia.org/w/api.php?';
55733
55734         var serviceWikipedia = {
55735
55736             init: function() {},
55737             reset: function() {},
55738
55739
55740             search: function(lang, query, callback) {
55741                 if (!query) {
55742                     if (callback) callback('No Query', []);
55743                     return;
55744                 }
55745
55746                 lang = lang || 'en';
55747                 var url = endpoint.replace('en', lang) +
55748                     utilQsString({
55749                         action: 'query',
55750                         list: 'search',
55751                         srlimit: '10',
55752                         srinfo: 'suggestion',
55753                         format: 'json',
55754                         origin: '*',
55755                         srsearch: query
55756                     });
55757
55758                 d3_json(url)
55759                     .then(function(result) {
55760                         if (result && result.error) {
55761                             throw new Error(result.error);
55762                         } else if (!result || !result.query || !result.query.search) {
55763                             throw new Error('No Results');
55764                         }
55765                         if (callback) {
55766                             var titles = result.query.search.map(function(d) { return d.title; });
55767                             callback(null, titles);
55768                         }
55769                     })
55770                     .catch(function(err) {
55771                         if (callback) callback(err, []);
55772                     });
55773             },
55774
55775
55776             suggestions: function(lang, query, callback) {
55777                 if (!query) {
55778                     if (callback) callback('', []);
55779                     return;
55780                 }
55781
55782                 lang = lang || 'en';
55783                 var url = endpoint.replace('en', lang) +
55784                     utilQsString({
55785                         action: 'opensearch',
55786                         namespace: 0,
55787                         suggest: '',
55788                         format: 'json',
55789                         origin: '*',
55790                         search: query
55791                     });
55792
55793                 d3_json(url)
55794                     .then(function(result) {
55795                         if (result && result.error) {
55796                             throw new Error(result.error);
55797                         } else if (!result || result.length < 2) {
55798                             throw new Error('No Results');
55799                         }
55800                         if (callback) callback(null, result[1] || []);
55801                     })
55802                     .catch(function(err) {
55803                         if (callback) callback(err.message, []);
55804                     });
55805             },
55806
55807
55808             translations: function(lang, title, callback) {
55809                 if (!title) {
55810                     if (callback) callback('No Title');
55811                     return;
55812                 }
55813
55814                 var url = endpoint.replace('en', lang) +
55815                     utilQsString({
55816                         action: 'query',
55817                         prop: 'langlinks',
55818                         format: 'json',
55819                         origin: '*',
55820                         lllimit: 500,
55821                         titles: title
55822                     });
55823
55824                 d3_json(url)
55825                     .then(function(result) {
55826                         if (result && result.error) {
55827                             throw new Error(result.error);
55828                         } else if (!result || !result.query || !result.query.pages) {
55829                             throw new Error('No Results');
55830                         }
55831                         if (callback) {
55832                             var list = result.query.pages[Object.keys(result.query.pages)[0]];
55833                             var translations = {};
55834                             if (list && list.langlinks) {
55835                                 list.langlinks.forEach(function(d) { translations[d.lang] = d['*']; });
55836                             }
55837                             callback(null, translations);
55838                         }
55839                     })
55840                     .catch(function(err) {
55841                         if (callback) callback(err.message);
55842                     });
55843             }
55844
55845         };
55846
55847         var services$1 = {
55848             geocoder: serviceNominatim,
55849             keepRight: serviceKeepRight,
55850             improveOSM: serviceImproveOSM,
55851             mapillary: serviceMapillary,
55852             openstreetcam: serviceOpenstreetcam,
55853             osm: serviceOsm,
55854             osmWikibase: serviceOsmWikibase,
55855             maprules: serviceMapRules,
55856             streetside: serviceStreetside,
55857             taginfo: serviceTaginfo,
55858             vectorTile: serviceVectorTile,
55859             wikidata: serviceWikidata,
55860             wikipedia: serviceWikipedia
55861         };
55862
55863         function svgIcon(name, svgklass, useklass) {
55864             return function drawIcon(selection) {
55865                 selection.selectAll('svg.icon')
55866                     .data([0])
55867                     .enter()
55868                     .append('svg')
55869                     .attr('class', 'icon ' + (svgklass || ''))
55870                     .append('use')
55871                     .attr('xlink:href', name)
55872                     .attr('class', useklass);
55873             };
55874         }
55875
55876         function uiNoteComments() {
55877             var _note;
55878
55879
55880             function noteComments(selection) {
55881                 if (_note.isNew()) return; // don't draw .comments-container
55882
55883                 var comments = selection.selectAll('.comments-container')
55884                     .data([0]);
55885
55886                 comments = comments.enter()
55887                     .append('div')
55888                     .attr('class', 'comments-container')
55889                     .merge(comments);
55890
55891                 var commentEnter = comments.selectAll('.comment')
55892                     .data(_note.comments)
55893                     .enter()
55894                     .append('div')
55895                     .attr('class', 'comment');
55896
55897                 commentEnter
55898                     .append('div')
55899                     .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
55900                     .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
55901
55902                 var mainEnter = commentEnter
55903                     .append('div')
55904                     .attr('class', 'comment-main');
55905
55906                 var metadataEnter = mainEnter
55907                     .append('div')
55908                     .attr('class', 'comment-metadata');
55909
55910                 metadataEnter
55911                     .append('div')
55912                     .attr('class', 'comment-author')
55913                     .each(function(d) {
55914                         var selection = d3_select(this);
55915                         var osm = services$1.osm;
55916                         if (osm && d.user) {
55917                             selection = selection
55918                                 .append('a')
55919                                 .attr('class', 'comment-author-link')
55920                                 .attr('href', osm.userURL(d.user))
55921                                 .attr('tabindex', -1)
55922                                 .attr('target', '_blank');
55923                         }
55924                         selection
55925                             .text(function(d) { return d.user || t('note.anonymous'); });
55926                     });
55927
55928                 metadataEnter
55929                     .append('div')
55930                     .attr('class', 'comment-date')
55931                     .text(function(d) {
55932                         return t('note.status.' + d.action, { when: localeDateString(d.date) });
55933                     });
55934
55935                 mainEnter
55936                     .append('div')
55937                     .attr('class', 'comment-text')
55938                     .html(function(d) { return d.html; });
55939
55940                 comments
55941                     .call(replaceAvatars);
55942             }
55943
55944
55945             function replaceAvatars(selection) {
55946                 var osm = services$1.osm;
55947                 if (!osm) return;
55948
55949                 var uids = {};  // gather uids in the comment thread
55950                 _note.comments.forEach(function(d) {
55951                     if (d.uid) uids[d.uid] = true;
55952                 });
55953
55954                 Object.keys(uids).forEach(function(uid) {
55955                     osm.loadUser(uid, function(err, user) {
55956                         if (!user || !user.image_url) return;
55957
55958                         selection.selectAll('.comment-avatar.user-' + uid)
55959                             .html('')
55960                             .append('img')
55961                             .attr('class', 'icon comment-avatar-icon')
55962                             .attr('src', user.image_url)
55963                             .attr('alt', user.display_name);
55964                     });
55965                 });
55966             }
55967
55968
55969             function localeDateString(s) {
55970                 if (!s) return null;
55971                 var detected = utilDetect();
55972                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
55973                 s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
55974                 var d = new Date(s);
55975                 if (isNaN(d.getTime())) return null;
55976                 return d.toLocaleDateString(detected.locale, options);
55977             }
55978
55979
55980             noteComments.note = function(val) {
55981                 if (!arguments.length) return _note;
55982                 _note = val;
55983                 return noteComments;
55984             };
55985
55986
55987             return noteComments;
55988         }
55989
55990         function uiNoteHeader() {
55991             var _note;
55992
55993
55994             function noteHeader(selection) {
55995                 var header = selection.selectAll('.note-header')
55996                     .data(
55997                         (_note ? [_note] : []),
55998                         function(d) { return d.status + d.id; }
55999                     );
56000
56001                 header.exit()
56002                     .remove();
56003
56004                 var headerEnter = header.enter()
56005                     .append('div')
56006                     .attr('class', 'note-header');
56007
56008                 var iconEnter = headerEnter
56009                     .append('div')
56010                     .attr('class', function(d) { return 'note-header-icon ' + d.status; })
56011                     .classed('new', function(d) { return d.id < 0; });
56012
56013                 iconEnter
56014                     .append('div')
56015                     .attr('class', 'preset-icon-28')
56016                     .call(svgIcon('#iD-icon-note', 'note-fill'));
56017
56018                 iconEnter.each(function(d) {
56019                     var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
56020                     iconEnter
56021                         .append('div')
56022                         .attr('class', 'note-icon-annotation')
56023                         .call(svgIcon(statusIcon, 'icon-annotation'));
56024                 });
56025
56026                 headerEnter
56027                     .append('div')
56028                     .attr('class', 'note-header-label')
56029                     .text(function(d) {
56030                         if (_note.isNew()) { return t('note.new'); }
56031                         return t('note.note') + ' ' + d.id + ' ' +
56032                             (d.status === 'closed' ? t('note.closed') : '');
56033                     });
56034             }
56035
56036
56037             noteHeader.note = function(val) {
56038                 if (!arguments.length) return _note;
56039                 _note = val;
56040                 return noteHeader;
56041             };
56042
56043
56044             return noteHeader;
56045         }
56046
56047         function uiNoteReport() {
56048             var _note;
56049
56050             function noteReport(selection) {
56051                 var url;
56052                 if (services$1.osm && (_note instanceof osmNote) && (!_note.isNew())) {
56053                     url = services$1.osm.noteReportURL(_note);
56054                 }
56055
56056                 var link = selection.selectAll('.note-report')
56057                     .data(url ? [url] : []);
56058
56059                 // exit
56060                 link.exit()
56061                     .remove();
56062
56063                 // enter
56064                 var linkEnter = link.enter()
56065                     .append('a')
56066                     .attr('class', 'note-report')
56067                     .attr('target', '_blank')
56068                     .attr('href', function(d) { return d; })
56069                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56070
56071                 linkEnter
56072                     .append('span')
56073                     .text(t('note.report'));
56074             }
56075
56076
56077             noteReport.note = function(val) {
56078                 if (!arguments.length) return _note;
56079                 _note = val;
56080                 return noteReport;
56081             };
56082
56083             return noteReport;
56084         }
56085
56086         var _tooltipID = 0;
56087
56088         function tooltip(klass) {
56089             var _id = _tooltipID++;
56090             var tooltip = function(selection) {
56091                 selection.each(setup);
56092             };
56093             var _animation = utilFunctor(false);
56094             var _title = function() {
56095                 var title = this.getAttribute('data-original-title');
56096                 if (title) {
56097                     return title;
56098                 } else {
56099                     title = this.getAttribute('title');
56100                     this.removeAttribute('title');
56101                     this.setAttribute('data-original-title', title);
56102                 }
56103                 return title;
56104             };
56105             var _html = utilFunctor(false);
56106             var _placement = utilFunctor('top');
56107
56108
56109             tooltip.title = function(val) {
56110                 if (arguments.length) {
56111                     _title = utilFunctor(val);
56112                     return tooltip;
56113                 } else {
56114                     return _title;
56115                 }
56116             };
56117
56118
56119             tooltip.html = function(val) {
56120                 if (arguments.length) {
56121                     _html = utilFunctor(val);
56122                     return tooltip;
56123                 } else {
56124                     return _html;
56125                 }
56126             };
56127
56128
56129             tooltip.placement = function(val) {
56130                 if (arguments.length) {
56131                     _placement = utilFunctor(val);
56132                     return tooltip;
56133                 } else {
56134                     return _placement;
56135                 }
56136             };
56137
56138
56139             tooltip.show = function(selection) {
56140                 selection.each(show);
56141             };
56142
56143
56144             tooltip.hide = function(selection) {
56145                 selection.each(hide);
56146             };
56147
56148
56149             tooltip.toggle = function(selection) {
56150                 selection.each(toggle);
56151             };
56152
56153
56154             tooltip.destroy = function(selection, selector) {
56155                 // by default, just destroy the current tooltip
56156                 selector = selector || '.tooltip-' + _id;
56157
56158                 selection
56159                     .on('mouseenter.tooltip', null)
56160                     .on('mouseleave.tooltip', null)
56161                     .attr('title', function() {
56162                         return this.getAttribute('data-original-title') || this.getAttribute('title');
56163                     })
56164                     .attr('data-original-title', null)
56165                     .selectAll(selector)
56166                     .remove();
56167             };
56168
56169
56170             tooltip.destroyAny = function(selection) {
56171                 selection.call(tooltip.destroy, '.tooltip');
56172             };
56173
56174             var isTouchEvent = false;
56175
56176             function setup() {
56177                 var root = d3_select(this);
56178                 var animate = _animation.apply(this, arguments);
56179                 var tip = root.selectAll('.tooltip-' + _id)
56180                     .data([0]);
56181
56182                 var enter = tip.enter()
56183                     .append('div')
56184                     .attr('class', 'tooltip tooltip-' + _id + ' ' + (klass ? klass : ''));
56185
56186                 enter
56187                     .append('div')
56188                     .attr('class', 'tooltip-arrow');
56189
56190                 enter
56191                     .append('div')
56192                     .attr('class', 'tooltip-inner');
56193
56194                 tip = enter
56195                     .merge(tip);
56196
56197                 if (animate) {
56198                     tip.classed('fade', true);
56199                 }
56200
56201                 var place = _placement.apply(this, arguments);
56202                 tip.classed(place, true);
56203
56204                 root.on('touchstart.tooltip', function() {
56205                     // hack to avoid showing tooltips upon touch input
56206                     isTouchEvent = true;
56207                 });
56208                 root.on('mouseenter.tooltip', show);
56209                 root.on('mouseleave.tooltip', hide);
56210             }
56211
56212
56213             function show() {
56214                 if (isTouchEvent) {
56215                     isTouchEvent = false;
56216                     return;
56217                 }
56218                 var root = d3_select(this);
56219                 var content = _title.apply(this, arguments);
56220                 var tip = root.selectAll('.tooltip-' + _id);
56221
56222                 if (tip.empty()) {   // tooltip was removed somehow, put it back
56223                     root.call(tooltip.destroy);
56224                     root.each(setup);
56225                     tip = root.selectAll('.tooltip-' + _id);
56226                 }
56227
56228                 tip.classed('in', true);
56229                 var markup = _html.apply(this, arguments);
56230
56231                 tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
56232                 var place = _placement.apply(this, arguments);
56233                 var outer = getPosition(root.node());
56234                 var inner = getPosition(tip.node());
56235                 var pos;
56236
56237                 switch (place) {
56238                     case 'top':
56239                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
56240                     break;
56241                     case 'right':
56242                     pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
56243                     break;
56244                     case 'left':
56245                     pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
56246                     break;
56247                     case 'bottom':
56248                     pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y + outer.h };
56249                     break;
56250                 }
56251
56252                 if (pos) {
56253                     tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
56254                 } else {
56255                     tip.style('left', null).style('top', null);
56256                 }
56257
56258                 this.tooltipVisible = true;
56259
56260
56261                 function getPosition(node) {
56262                     var mode = d3_select(node).style('position');
56263                     if (mode === 'absolute' || mode === 'static') {
56264                         return {
56265                             x: node.offsetLeft,
56266                             y: node.offsetTop,
56267                             w: node.offsetWidth,
56268                             h: node.offsetHeight
56269                         };
56270                     } else {
56271                         return {
56272                             x: 0,
56273                             y: 0,
56274                             w: node.offsetWidth,
56275                             h: node.offsetHeight
56276                         };
56277                     }
56278                 }
56279             }
56280
56281
56282             function hide() {
56283                 d3_select(this).selectAll('.tooltip-' + _id).classed('in', false);
56284                 this.tooltipVisible = false;
56285             }
56286
56287
56288             function toggle() {
56289                 if (this.tooltipVisible) {
56290                     hide.apply(this, arguments);
56291                 } else {
56292                     show.apply(this, arguments);
56293                 }
56294             }
56295
56296
56297             return tooltip;
56298         }
56299
56300         function uiQuickLinks() {
56301             var _choices = [];
56302
56303
56304             function quickLinks(selection) {
56305                 var container = selection.selectAll('.quick-links')
56306                     .data([0]);
56307
56308                 container = container.enter()
56309                     .append('div')
56310                     .attr('class', 'quick-links')
56311                     .merge(container);
56312
56313                 var items = container.selectAll('.quick-link')
56314                     .data(_choices, function(d) { return d.id; });
56315
56316                 items.exit()
56317                     .remove();
56318
56319                 items.enter()
56320                     .append('a')
56321                     .attr('class', function(d) { return 'quick-link quick-link-' + d.id; })
56322                     .attr('href', '#')
56323                     .text(function(d) { return t(d.label); })
56324                     .each(function(d) {
56325                         if (typeof d.tooltip !== 'function') return;
56326                         d3_select(this)
56327                             .call(tooltip().html(true).title(d.tooltip).placement('bottom'));
56328                     })
56329                     .on('click', function(d) {
56330                         if (typeof d.click !== 'function') return;
56331                         event.preventDefault();
56332                         d.click(d);
56333                     });
56334             }
56335
56336
56337             //  val should be an array of choices like:
56338             //    [{
56339             //       id: 'link-id',
56340             //       label: 'translation.key',
56341             //       tooltip: function(d),
56342             //       click: function(d)
56343             //    }, ..]
56344             quickLinks.choices = function(val) {
56345                 if (!arguments.length) return _choices;
56346                 _choices = val;
56347                 return quickLinks;
56348             };
56349
56350
56351             return quickLinks;
56352         }
56353
56354         function uiTooltipHtml(text, key, heading) {
56355             var s = '';
56356
56357             if (heading) {
56358                 s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
56359             }
56360             if (text) {
56361                 s += '<div class="tooltip-text"><span>' + text + '</span></div>';
56362             }
56363             if (key) {
56364                 s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
56365                     '<span class="keyhint">' + key + '</span></div>';
56366             }
56367
56368             return s;
56369         }
56370
56371         function uiViewOnOSM(context) {
56372             var _what;   // an osmEntity or osmNote
56373
56374
56375             function viewOnOSM(selection) {
56376                 var url;
56377                 if (_what instanceof osmEntity) {
56378                     url = context.connection().entityURL(_what);
56379                 } else if (_what instanceof osmNote) {
56380                     url = context.connection().noteURL(_what);
56381                 }
56382
56383                 var data = ((!_what || _what.isNew()) ? [] : [_what]);
56384                 var link = selection.selectAll('.view-on-osm')
56385                     .data(data, function(d) { return d.id; });
56386
56387                 // exit
56388                 link.exit()
56389                     .remove();
56390
56391                 // enter
56392                 var linkEnter = link.enter()
56393                     .append('a')
56394                     .attr('class', 'view-on-osm')
56395                     .attr('target', '_blank')
56396                     .attr('href', url)
56397                     .call(svgIcon('#iD-icon-out-link', 'inline'));
56398
56399                 linkEnter
56400                     .append('span')
56401                     .text(t('inspector.view_on_osm'));
56402             }
56403
56404
56405             viewOnOSM.what = function(_) {
56406                 if (!arguments.length) return _what;
56407                 _what = _;
56408                 return viewOnOSM;
56409             };
56410
56411             return viewOnOSM;
56412         }
56413
56414         function uiNoteEditor(context) {
56415             var dispatch$1 = dispatch('change');
56416             var quickLinks = uiQuickLinks();
56417             var noteComments = uiNoteComments();
56418             var noteHeader = uiNoteHeader();
56419
56420             // var formFields = uiFormFields(context);
56421
56422             var _note;
56423             // var _fieldsArr;
56424
56425
56426             function noteEditor(selection) {
56427                 // quick links
56428                 var choices = [{
56429                     id: 'zoom_to',
56430                     label: 'inspector.zoom_to.title',
56431                     tooltip: function() {
56432                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_note'), t('inspector.zoom_to.key'));
56433                     },
56434                     click: function zoomTo() {
56435                         context.mode().zoomToSelected();
56436                     }
56437                 }];
56438
56439
56440                 var header = selection.selectAll('.header')
56441                     .data([0]);
56442
56443                 var headerEnter = header.enter()
56444                     .append('div')
56445                     .attr('class', 'header fillL');
56446
56447                 headerEnter
56448                     .append('button')
56449                     .attr('class', 'fr note-editor-close')
56450                     .on('click', function() {
56451                         context.enter(modeBrowse(context));
56452                     })
56453                     .call(svgIcon('#iD-icon-close'));
56454
56455                 headerEnter
56456                     .append('h3')
56457                     .text(t('note.title'));
56458
56459
56460                 var body = selection.selectAll('.body')
56461                     .data([0]);
56462
56463                 body = body.enter()
56464                     .append('div')
56465                     .attr('class', 'body')
56466                     .merge(body);
56467
56468                 var editor = body.selectAll('.note-editor')
56469                     .data([0]);
56470
56471                 editor.enter()
56472                     .append('div')
56473                     .attr('class', 'modal-section note-editor')
56474                     .merge(editor)
56475                     .call(noteHeader.note(_note))
56476                     .call(quickLinks.choices(choices))
56477                     .call(noteComments.note(_note))
56478                     .call(noteSaveSection);
56479
56480
56481                 var footer = selection.selectAll('.footer')
56482                     .data([0]);
56483
56484                 footer.enter()
56485                     .append('div')
56486                     .attr('class', 'footer')
56487                     .merge(footer)
56488                     .call(uiViewOnOSM(context).what(_note))
56489                     .call(uiNoteReport(context).note(_note));
56490
56491
56492                 // rerender the note editor on any auth change
56493                 var osm = services$1.osm;
56494                 if (osm) {
56495                     osm.on('change.note-save', function() {
56496                         selection.call(noteEditor);
56497                     });
56498                 }
56499             }
56500
56501
56502             function noteSaveSection(selection) {
56503                 var isSelected = (_note && _note.id === context.selectedNoteID());
56504                 var noteSave = selection.selectAll('.note-save')
56505                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56506
56507                 // exit
56508                 noteSave.exit()
56509                     .remove();
56510
56511                 // enter
56512                 var noteSaveEnter = noteSave.enter()
56513                     .append('div')
56514                     .attr('class', 'note-save save-section cf');
56515
56516                 // // if new note, show categories to pick from
56517                 // if (_note.isNew()) {
56518                 //     var presets = context.presets();
56519
56520                 //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
56521                 //     _fieldsArr = [
56522                 //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
56523                 //     ];
56524
56525                 //     _fieldsArr.forEach(function(field) {
56526                 //         field
56527                 //             .on('change', changeCategory);
56528                 //     });
56529
56530                 //     noteSaveEnter
56531                 //         .append('div')
56532                 //         .attr('class', 'note-category')
56533                 //         .call(formFields.fieldsArr(_fieldsArr));
56534                 // }
56535
56536                 // function changeCategory() {
56537                 //     // NOTE: perhaps there is a better way to get value
56538                 //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
56539
56540                 //     // store the unsaved category with the note itself
56541                 //     _note = _note.update({ newCategory: val });
56542                 //     var osm = services.osm;
56543                 //     if (osm) {
56544                 //         osm.replaceNote(_note);  // update note cache
56545                 //     }
56546                 //     noteSave
56547                 //         .call(noteSaveButtons);
56548                 // }
56549
56550                 noteSaveEnter
56551                     .append('h4')
56552                     .attr('class', '.note-save-header')
56553                     .text(function() {
56554                         return _note.isNew() ? t('note.newDescription') : t('note.newComment');
56555                     });
56556
56557                 noteSaveEnter
56558                     .append('textarea')
56559                     .attr('class', 'new-comment-input')
56560                     .attr('placeholder', t('note.inputPlaceholder'))
56561                     .attr('maxlength', 1000)
56562                     .property('value', function(d) { return d.newComment; })
56563                     .call(utilNoAuto)
56564                     .on('keydown.note-input', keydown)
56565                     .on('input.note-input', changeInput)
56566                     .on('blur.note-input', changeInput);
56567
56568                 // update
56569                 noteSave = noteSaveEnter
56570                     .merge(noteSave)
56571                     .call(userDetails)
56572                     .call(noteSaveButtons);
56573
56574
56575                 // fast submit if user presses cmd+enter
56576                 function keydown() {
56577                     if (!(event.keyCode === 13 && event.metaKey)) return;
56578
56579                     var osm = services$1.osm;
56580                     if (!osm) return;
56581
56582                     var hasAuth = osm.authenticated();
56583                     if (!hasAuth) return;
56584
56585                     if (!_note.newComment) return;
56586
56587                     event.preventDefault();
56588
56589                     d3_select(this)
56590                         .on('keydown.note-input', null);
56591
56592                     // focus on button and submit
56593                     window.setTimeout(function() {
56594                         if (_note.isNew()) {
56595                             noteSave.selectAll('.save-button').node().focus();
56596                             clickSave(_note);
56597                         } else  {
56598                             noteSave.selectAll('.comment-button').node().focus();
56599                             clickComment(_note);
56600                         }
56601                     }, 10);
56602                 }
56603
56604
56605                 function changeInput() {
56606                     var input = d3_select(this);
56607                     var val = input.property('value').trim() || undefined;
56608
56609                     // store the unsaved comment with the note itself
56610                     _note = _note.update({ newComment: val });
56611
56612                     var osm = services$1.osm;
56613                     if (osm) {
56614                         osm.replaceNote(_note);  // update note cache
56615                     }
56616
56617                     noteSave
56618                         .call(noteSaveButtons);
56619                 }
56620             }
56621
56622
56623             function userDetails(selection) {
56624                 var detailSection = selection.selectAll('.detail-section')
56625                     .data([0]);
56626
56627                 detailSection = detailSection.enter()
56628                     .append('div')
56629                     .attr('class', 'detail-section')
56630                     .merge(detailSection);
56631
56632                 var osm = services$1.osm;
56633                 if (!osm) return;
56634
56635                 // Add warning if user is not logged in
56636                 var hasAuth = osm.authenticated();
56637                 var authWarning = detailSection.selectAll('.auth-warning')
56638                     .data(hasAuth ? [] : [0]);
56639
56640                 authWarning.exit()
56641                     .transition()
56642                     .duration(200)
56643                     .style('opacity', 0)
56644                     .remove();
56645
56646                 var authEnter = authWarning.enter()
56647                     .insert('div', '.tag-reference-body')
56648                     .attr('class', 'field-warning auth-warning')
56649                     .style('opacity', 0);
56650
56651                 authEnter
56652                     .call(svgIcon('#iD-icon-alert', 'inline'));
56653
56654                 authEnter
56655                     .append('span')
56656                     .text(t('note.login'));
56657
56658                 authEnter
56659                     .append('a')
56660                     .attr('target', '_blank')
56661                     .call(svgIcon('#iD-icon-out-link', 'inline'))
56662                     .append('span')
56663                     .text(t('login'))
56664                     .on('click.note-login', function() {
56665                         event.preventDefault();
56666                         osm.authenticate();
56667                     });
56668
56669                 authEnter
56670                     .transition()
56671                     .duration(200)
56672                     .style('opacity', 1);
56673
56674
56675                 var prose = detailSection.selectAll('.note-save-prose')
56676                     .data(hasAuth ? [0] : []);
56677
56678                 prose.exit()
56679                     .remove();
56680
56681                 prose = prose.enter()
56682                     .append('p')
56683                     .attr('class', 'note-save-prose')
56684                     .text(t('note.upload_explanation'))
56685                     .merge(prose);
56686
56687                 osm.userDetails(function(err, user) {
56688                     if (err) return;
56689
56690                     var userLink = d3_select(document.createElement('div'));
56691
56692                     if (user.image_url) {
56693                         userLink
56694                             .append('img')
56695                             .attr('src', user.image_url)
56696                             .attr('class', 'icon pre-text user-icon');
56697                     }
56698
56699                     userLink
56700                         .append('a')
56701                         .attr('class', 'user-info')
56702                         .text(user.display_name)
56703                         .attr('href', osm.userURL(user.display_name))
56704                         .attr('tabindex', -1)
56705                         .attr('target', '_blank');
56706
56707                     prose
56708                         .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
56709                 });
56710             }
56711
56712
56713             function noteSaveButtons(selection) {
56714                 var osm = services$1.osm;
56715                 var hasAuth = osm && osm.authenticated();
56716
56717                 var isSelected = (_note && _note.id === context.selectedNoteID());
56718                 var buttonSection = selection.selectAll('.buttons')
56719                     .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
56720
56721                 // exit
56722                 buttonSection.exit()
56723                     .remove();
56724
56725                 // enter
56726                 var buttonEnter = buttonSection.enter()
56727                     .append('div')
56728                     .attr('class', 'buttons');
56729
56730                 if (_note.isNew()) {
56731                     buttonEnter
56732                         .append('button')
56733                         .attr('class', 'button cancel-button secondary-action')
56734                         .text(t('confirm.cancel'));
56735
56736                     buttonEnter
56737                         .append('button')
56738                         .attr('class', 'button save-button action')
56739                         .text(t('note.save'));
56740
56741                 } else {
56742                     buttonEnter
56743                         .append('button')
56744                         .attr('class', 'button status-button action');
56745
56746                     buttonEnter
56747                         .append('button')
56748                         .attr('class', 'button comment-button action')
56749                         .text(t('note.comment'));
56750                 }
56751
56752
56753                 // update
56754                 buttonSection = buttonSection
56755                     .merge(buttonEnter);
56756
56757                 buttonSection.select('.cancel-button')   // select and propagate data
56758                     .on('click.cancel', clickCancel);
56759
56760                 buttonSection.select('.save-button')     // select and propagate data
56761                     .attr('disabled', isSaveDisabled)
56762                     .on('click.save', clickSave);
56763
56764                 buttonSection.select('.status-button')   // select and propagate data
56765                     .attr('disabled', (hasAuth ? null : true))
56766                     .text(function(d) {
56767                         var action = (d.status === 'open' ? 'close' : 'open');
56768                         var andComment = (d.newComment ? '_comment' : '');
56769                         return t('note.' + action + andComment);
56770                     })
56771                     .on('click.status', clickStatus);
56772
56773                 buttonSection.select('.comment-button')   // select and propagate data
56774                     .attr('disabled', isSaveDisabled)
56775                     .on('click.comment', clickComment);
56776
56777
56778                 function isSaveDisabled(d) {
56779                     return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
56780                 }
56781             }
56782
56783
56784
56785             function clickCancel(d) {
56786                 this.blur();    // avoid keeping focus on the button - #4641
56787                 var osm = services$1.osm;
56788                 if (osm) {
56789                     osm.removeNote(d);
56790                 }
56791                 context.enter(modeBrowse(context));
56792                 dispatch$1.call('change');
56793             }
56794
56795
56796             function clickSave(d) {
56797                 this.blur();    // avoid keeping focus on the button - #4641
56798                 var osm = services$1.osm;
56799                 if (osm) {
56800                     osm.postNoteCreate(d, function(err, note) {
56801                         dispatch$1.call('change', note);
56802                     });
56803                 }
56804             }
56805
56806
56807             function clickStatus(d) {
56808                 this.blur();    // avoid keeping focus on the button - #4641
56809                 var osm = services$1.osm;
56810                 if (osm) {
56811                     var setStatus = (d.status === 'open' ? 'closed' : 'open');
56812                     osm.postNoteUpdate(d, setStatus, function(err, note) {
56813                         dispatch$1.call('change', note);
56814                     });
56815                 }
56816             }
56817
56818             function clickComment(d) {
56819                 this.blur();    // avoid keeping focus on the button - #4641
56820                 var osm = services$1.osm;
56821                 if (osm) {
56822                     osm.postNoteUpdate(d, d.status, function(err, note) {
56823                         dispatch$1.call('change', note);
56824                     });
56825                 }
56826             }
56827
56828
56829             noteEditor.note = function(val) {
56830                 if (!arguments.length) return _note;
56831                 _note = val;
56832                 return noteEditor;
56833             };
56834
56835
56836             return utilRebind(noteEditor, dispatch$1, 'on');
56837         }
56838
56839         function modeSelectNote(context, selectedNoteID) {
56840             var mode = {
56841                 id: 'select-note',
56842                 button: 'browse'
56843             };
56844
56845             var osm = services$1.osm;
56846             var keybinding = utilKeybinding('select-note');
56847             var noteEditor = uiNoteEditor(context)
56848                 .on('change', function() {
56849                     context.map().pan([0,0]);  // trigger a redraw
56850                     var note = checkSelectedID();
56851                     if (!note) return;
56852                     context.ui().sidebar
56853                         .show(noteEditor.note(note));
56854                 });
56855
56856             var behaviors = [
56857                 behaviorBreathe(context),
56858                 behaviorHover(context),
56859                 behaviorSelect(context),
56860                 behaviorLasso(context),
56861                 modeDragNode(context).behavior,
56862                 modeDragNote(context).behavior
56863             ];
56864
56865             var newFeature = false;
56866
56867
56868             function checkSelectedID() {
56869                 if (!osm) return;
56870                 var note = osm.getNote(selectedNoteID);
56871                 if (!note) {
56872                     context.enter(modeBrowse(context));
56873                 }
56874                 return note;
56875             }
56876
56877
56878             // class the note as selected, or return to browse mode if the note is gone
56879             function selectNote(drawn) {
56880                 if (!checkSelectedID()) return;
56881
56882                 var selection = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
56883
56884                 if (selection.empty()) {
56885                     // Return to browse mode if selected DOM elements have
56886                     // disappeared because the user moved them out of view..
56887                     var source = event && event.type === 'zoom' && event.sourceEvent;
56888                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
56889                         context.enter(modeBrowse(context));
56890                     }
56891
56892                 } else {
56893                     selection
56894                         .classed('selected', true);
56895
56896                     context.selectedNoteID(selectedNoteID);
56897                 }
56898             }
56899
56900
56901             function esc() {
56902                 if (d3_select('.combobox').size()) return;
56903                 context.enter(modeBrowse(context));
56904             }
56905
56906
56907             mode.zoomToSelected = function() {
56908                 if (!osm) return;
56909                 var note = osm.getNote(selectedNoteID);
56910                 if (note) {
56911                     context.map().centerZoomEase(note.loc, 20);
56912                 }
56913             };
56914
56915
56916             mode.newFeature = function(val) {
56917                 if (!arguments.length) return newFeature;
56918                 newFeature = val;
56919                 return mode;
56920             };
56921
56922
56923             mode.enter = function() {
56924                 var note = checkSelectedID();
56925                 if (!note) return;
56926
56927                 behaviors.forEach(context.install);
56928
56929                 keybinding
56930                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
56931                     .on('⎋', esc, true);
56932
56933                 d3_select(document)
56934                     .call(keybinding);
56935
56936                 selectNote();
56937
56938                 var sidebar = context.ui().sidebar;
56939                 sidebar.show(noteEditor.note(note));
56940
56941                 // expand the sidebar, avoid obscuring the note if needed
56942                 sidebar.expand(sidebar.intersects(note.extent()));
56943
56944                 context.map()
56945                     .on('drawn.select', selectNote);
56946             };
56947
56948
56949             mode.exit = function() {
56950                 behaviors.forEach(context.uninstall);
56951
56952                 d3_select(document)
56953                     .call(keybinding.unbind);
56954
56955                 context.surface()
56956                     .selectAll('.layer-notes .selected')
56957                     .classed('selected hover', false);
56958
56959                 context.map()
56960                     .on('drawn.select', null);
56961
56962                 context.ui().sidebar
56963                     .hide();
56964
56965                 context.selectedNoteID(null);
56966             };
56967
56968
56969             return mode;
56970         }
56971
56972         function modeDragNote(context) {
56973             var mode = {
56974                 id: 'drag-note',
56975                 button: 'browse'
56976             };
56977
56978             var edit = behaviorEdit(context);
56979
56980             var _nudgeInterval;
56981             var _lastLoc;
56982             var _note;    // most current note.. dragged note may have stale datum.
56983
56984
56985             function startNudge(nudge) {
56986                 if (_nudgeInterval) window.clearInterval(_nudgeInterval);
56987                 _nudgeInterval = window.setInterval(function() {
56988                     context.pan(nudge);
56989                     doMove(nudge);
56990                 }, 50);
56991             }
56992
56993
56994             function stopNudge() {
56995                 if (_nudgeInterval) {
56996                     window.clearInterval(_nudgeInterval);
56997                     _nudgeInterval = null;
56998                 }
56999             }
57000
57001
57002             function origin(note) {
57003                 return context.projection(note.loc);
57004             }
57005
57006
57007             function start(note) {
57008                 _note = note;
57009                 var osm = services$1.osm;
57010                 if (osm) {
57011                     // Get latest note from cache.. The marker may have a stale datum bound to it
57012                     // and dragging it around can sometimes delete the users note comment.
57013                     _note = osm.getNote(_note.id);
57014                 }
57015
57016                 context.surface().selectAll('.note-' + _note.id)
57017                     .classed('active', true);
57018
57019                 context.perform(actionNoop());
57020                 context.enter(mode);
57021                 context.selectedNoteID(_note.id);
57022             }
57023
57024
57025             function move() {
57026                 event.sourceEvent.stopPropagation();
57027                 _lastLoc = context.projection.invert(event.point);
57028
57029                 doMove();
57030                 var nudge = geoViewportEdge(event.point, context.map().dimensions());
57031                 if (nudge) {
57032                     startNudge(nudge);
57033                 } else {
57034                     stopNudge();
57035                 }
57036             }
57037
57038
57039             function doMove(nudge) {
57040                 nudge = nudge || [0, 0];
57041
57042                 var currPoint = (event && event.point) || context.projection(_lastLoc);
57043                 var currMouse = geoVecSubtract(currPoint, nudge);
57044                 var loc = context.projection.invert(currMouse);
57045
57046                 _note = _note.move(loc);
57047
57048                 var osm = services$1.osm;
57049                 if (osm) {
57050                     osm.replaceNote(_note);  // update note cache
57051                 }
57052
57053                 context.replace(actionNoop());   // trigger redraw
57054             }
57055
57056
57057             function end() {
57058                 context.replace(actionNoop());   // trigger redraw
57059
57060                 context
57061                     .selectedNoteID(_note.id)
57062                     .enter(modeSelectNote(context, _note.id));
57063             }
57064
57065
57066             var drag = behaviorDrag()
57067                 .selector('.layer-touch.markers .target.note.new')
57068                 .surface(d3_select('#map').node())
57069                 .origin(origin)
57070                 .on('start', start)
57071                 .on('move', move)
57072                 .on('end', end);
57073
57074
57075             mode.enter = function() {
57076                 context.install(edit);
57077             };
57078
57079
57080             mode.exit = function() {
57081                 context.ui().sidebar.hover.cancel();
57082                 context.uninstall(edit);
57083
57084                 context.surface()
57085                     .selectAll('.active')
57086                     .classed('active', false);
57087
57088                 stopNudge();
57089             };
57090
57091             mode.behavior = drag;
57092
57093             return mode;
57094         }
57095
57096         function uiDataHeader() {
57097             var _datum;
57098
57099
57100             function dataHeader(selection) {
57101                 var header = selection.selectAll('.data-header')
57102                     .data(
57103                         (_datum ? [_datum] : []),
57104                         function(d) { return d.__featurehash__; }
57105                     );
57106
57107                 header.exit()
57108                     .remove();
57109
57110                 var headerEnter = header.enter()
57111                     .append('div')
57112                     .attr('class', 'data-header');
57113
57114                 var iconEnter = headerEnter
57115                     .append('div')
57116                     .attr('class', 'data-header-icon');
57117
57118                 iconEnter
57119                     .append('div')
57120                     .attr('class', 'preset-icon-28')
57121                     .call(svgIcon('#iD-icon-data', 'note-fill'));
57122
57123                 headerEnter
57124                     .append('div')
57125                     .attr('class', 'data-header-label')
57126                     .text(t('map_data.layers.custom.title'));
57127             }
57128
57129
57130             dataHeader.datum = function(val) {
57131                 if (!arguments.length) return _datum;
57132                 _datum = val;
57133                 return this;
57134             };
57135
57136
57137             return dataHeader;
57138         }
57139
57140         // This code assumes that the combobox values will not have duplicate entries.
57141         // It is keyed on the `value` of the entry. Data should be an array of objects like:
57142         //   [{
57143         //       value:  'display text',  // required
57144         //       title:  'hover text'     // optional
57145         //   }, ...]
57146
57147         var _comboHideTimerID;
57148
57149         function uiCombobox(context, klass) {
57150             var dispatch$1 = dispatch('accept', 'cancel');
57151             var container = context.container();
57152
57153             var _suggestions = [];
57154             var _data = [];
57155             var _fetched = {};
57156             var _selected = null;
57157             var _canAutocomplete = true;
57158             var _caseSensitive = false;
57159             var _cancelFetch = false;
57160             var _minItems = 2;
57161             var _tDown = 0;
57162
57163             var _fetcher = function(val, cb) {
57164                 cb(_data.filter(function(d) {
57165                     return d.value
57166                         .toString()
57167                         .toLowerCase()
57168                         .indexOf(val.toLowerCase()) !== -1;
57169                 }));
57170             };
57171
57172             var combobox = function(input, attachTo) {
57173                 if (!input || input.empty()) return;
57174
57175                 input
57176                     .classed('combobox-input', true)
57177                     .on('focus.combo-input', focus)
57178                     .on('blur.combo-input', blur)
57179                     .on('keydown.combo-input', keydown)
57180                     .on('keyup.combo-input', keyup)
57181                     .on('input.combo-input', change)
57182                     .on('mousedown.combo-input', mousedown)
57183                     .each(function() {
57184                         var parent = this.parentNode;
57185                         var sibling = this.nextSibling;
57186
57187                         d3_select(parent).selectAll('.combobox-caret')
57188                             .filter(function(d) { return d === input.node(); })
57189                             .data([input.node()])
57190                             .enter()
57191                             .insert('div', function() { return sibling; })
57192                             .attr('class', 'combobox-caret')
57193                             .on('mousedown.combo-caret', function() {
57194                                 event.preventDefault(); // don't steal focus from input
57195                                 input.node().focus(); // focus the input as if it was clicked
57196                                 mousedown();
57197                             })
57198                             .on('mouseup.combo-caret', function() {
57199                                 event.preventDefault(); // don't steal focus from input
57200                                 mouseup();
57201                             });
57202                     });
57203
57204
57205                 function mousedown() {
57206                     if (event.button !== 0) return;    // left click only
57207                     _tDown = +new Date();
57208
57209                     // clear selection
57210                     var start = input.property('selectionStart');
57211                     var end = input.property('selectionEnd');
57212                     if (start !== end) {
57213                         var val = utilGetSetValue(input);
57214                         input.node().setSelectionRange(val.length, val.length);
57215                         return;
57216                     }
57217
57218                     input.on('mouseup.combo-input', mouseup);
57219                 }
57220
57221
57222                 function mouseup() {
57223                     input.on('mouseup.combo-input', null);
57224                     if (event.button !== 0) return;    // left click only
57225                     if (input.node() !== document.activeElement) return;   // exit if this input is not focused
57226
57227                     var start = input.property('selectionStart');
57228                     var end = input.property('selectionEnd');
57229                     if (start !== end) return;  // exit if user is selecting
57230
57231                     // not showing or showing for a different field - try to show it.
57232                     var combo = container.selectAll('.combobox');
57233                     if (combo.empty() || combo.datum() !== input.node()) {
57234                         var tOrig = _tDown;
57235                         window.setTimeout(function() {
57236                             if (tOrig !== _tDown) return;   // exit if user double clicked
57237                             fetchComboData('', function() {
57238                                 show();
57239                                 render();
57240                             });
57241                         }, 250);
57242
57243                     } else {
57244                         hide();
57245                     }
57246                 }
57247
57248
57249                 function focus() {
57250                     fetchComboData('');   // prefetch values (may warm taginfo cache)
57251                 }
57252
57253
57254                 function blur() {
57255                     _comboHideTimerID = window.setTimeout(hide, 75);
57256                 }
57257
57258
57259                 function show() {
57260                     hide();   // remove any existing
57261
57262                     container
57263                         .insert('div', ':first-child')
57264                         .datum(input.node())
57265                         .attr('class', 'combobox' + (klass ? ' combobox-' + klass : ''))
57266                         .style('position', 'absolute')
57267                         .style('display', 'block')
57268                         .style('left', '0px')
57269                         .on('mousedown.combo-container', function () {
57270                             // prevent moving focus out of the input field
57271                             event.preventDefault();
57272                         });
57273
57274                     d3_select('body')
57275                         .on('scroll.combo-scroll', render, true);
57276                 }
57277
57278
57279                 function hide() {
57280                     if (_comboHideTimerID) {
57281                         window.clearTimeout(_comboHideTimerID);
57282                         _comboHideTimerID = undefined;
57283                     }
57284
57285                     container.selectAll('.combobox')
57286                         .remove();
57287
57288                     d3_select('body')
57289                         .on('scroll.combo-scroll', null);
57290                 }
57291
57292
57293                 function keydown() {
57294                     var shown = !container.selectAll('.combobox').empty();
57295                     var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
57296
57297                     switch (event.keyCode) {
57298                         case 8:   // ⌫ Backspace
57299                         case 46:  // ⌦ Delete
57300                             event.stopPropagation();
57301                             _selected = null;
57302                             render();
57303                             input.on('input.combo-input', function() {
57304                                 var start = input.property('selectionStart');
57305                                 input.node().setSelectionRange(start, start);
57306                                 input.on('input.combo-input', change);
57307                             });
57308                             break;
57309
57310                         case 9:   // ⇥ Tab
57311                             accept();
57312                             break;
57313
57314                         case 13:  // ↩ Return
57315                             event.preventDefault();
57316                             event.stopPropagation();
57317                             break;
57318
57319                         case 38:  // ↑ Up arrow
57320                             if (tagName === 'textarea' && !shown) return;
57321                             event.preventDefault();
57322                             if (tagName === 'input' && !shown) {
57323                                 show();
57324                             }
57325                             nav(-1);
57326                             break;
57327
57328                         case 40:  // ↓ Down arrow
57329                             if (tagName === 'textarea' && !shown) return;
57330                             event.preventDefault();
57331                             if (tagName === 'input' && !shown) {
57332                                 show();
57333                             }
57334                             nav(+1);
57335                             break;
57336                     }
57337                 }
57338
57339
57340                 function keyup() {
57341                     switch (event.keyCode) {
57342                         case 27:  // ⎋ Escape
57343                             cancel();
57344                             break;
57345
57346                         case 13:  // ↩ Return
57347                             accept();
57348                             break;
57349                     }
57350                 }
57351
57352
57353                 // Called whenever the input value is changed (e.g. on typing)
57354                 function change() {
57355                     fetchComboData(value(), function() {
57356                         _selected = null;
57357                         var val = input.property('value');
57358
57359                         if (_suggestions.length) {
57360                             if (input.property('selectionEnd') === val.length) {
57361                                 _selected = tryAutocomplete();
57362                             }
57363
57364                             if (!_selected) {
57365                                 _selected = val;
57366                             }
57367                         }
57368
57369                         if (val.length) {
57370                             var combo = container.selectAll('.combobox');
57371                             if (combo.empty()) {
57372                                 show();
57373                             }
57374                         } else {
57375                             hide();
57376                         }
57377
57378                         render();
57379                     });
57380                 }
57381
57382
57383                 // Called when the user presses up/down arrows to navigate the list
57384                 function nav(dir) {
57385                     if (_suggestions.length) {
57386                         // try to determine previously selected index..
57387                         var index = -1;
57388                         for (var i = 0; i < _suggestions.length; i++) {
57389                             if (_selected && _suggestions[i].value === _selected) {
57390                                 index = i;
57391                                 break;
57392                             }
57393                         }
57394
57395                         // pick new _selected
57396                         index = Math.max(Math.min(index + dir, _suggestions.length - 1), 0);
57397                         _selected = _suggestions[index].value;
57398                         input.property('value', _selected);
57399                     }
57400
57401                     render();
57402                     ensureVisible();
57403                 }
57404
57405
57406                 function ensureVisible() {
57407                     var combo = container.selectAll('.combobox');
57408                     if (combo.empty()) return;
57409
57410                     var containerRect = container.node().getBoundingClientRect();
57411                     var comboRect = combo.node().getBoundingClientRect();
57412
57413                     if (comboRect.bottom > containerRect.bottom) {
57414                         var node = attachTo ? attachTo.node() : input.node();
57415                         node.scrollIntoView({ behavior: 'instant', block: 'center' });
57416                         render();
57417                     }
57418
57419                     // https://stackoverflow.com/questions/11039885/scrollintoview-causing-the-whole-page-to-move
57420                     var selected = combo.selectAll('.combobox-option.selected').node();
57421                     if (selected) {
57422                         selected.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
57423                     }
57424                 }
57425
57426
57427                 function value() {
57428                     var value = input.property('value');
57429                     var start = input.property('selectionStart');
57430                     var end = input.property('selectionEnd');
57431
57432                     if (start && end) {
57433                         value = value.substring(0, start);
57434                     }
57435
57436                     return value;
57437                 }
57438
57439
57440                 function fetchComboData(v, cb) {
57441                     _cancelFetch = false;
57442
57443                     _fetcher.call(input, v, function(results) {
57444                         // already chose a value, don't overwrite or autocomplete it
57445                         if (_cancelFetch) return;
57446
57447                         _suggestions = results;
57448                         results.forEach(function(d) { _fetched[d.value] = d; });
57449
57450                         if (cb) {
57451                             cb();
57452                         }
57453                     });
57454                 }
57455
57456
57457                 function tryAutocomplete() {
57458                     if (!_canAutocomplete) return;
57459
57460                     var val = _caseSensitive ? value() : value().toLowerCase();
57461                     if (!val) return;
57462
57463                     // Don't autocomplete if user is typing a number - #4935
57464                     if (!isNaN(parseFloat(val)) && isFinite(val)) return;
57465
57466                     var bestIndex = -1;
57467                     for (var i = 0; i < _suggestions.length; i++) {
57468                         var suggestion = _suggestions[i].value;
57469                         var compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
57470
57471                         // if search string matches suggestion exactly, pick it..
57472                         if (compare === val) {
57473                             bestIndex = i;
57474                             break;
57475
57476                         // otherwise lock in the first result that starts with the search string..
57477                         } else if (bestIndex === -1 && compare.indexOf(val) === 0) {
57478                             bestIndex = i;
57479                         }
57480                     }
57481
57482                     if (bestIndex !== -1) {
57483                         var bestVal = _suggestions[bestIndex].value;
57484                         input.property('value', bestVal);
57485                         input.node().setSelectionRange(val.length, bestVal.length);
57486                         return bestVal;
57487                     }
57488                 }
57489
57490
57491                 function render() {
57492                     if (_suggestions.length < _minItems || document.activeElement !== input.node()) {
57493                         hide();
57494                         return;
57495                     }
57496
57497                     var shown = !container.selectAll('.combobox').empty();
57498                     if (!shown) return;
57499
57500                     var combo = container.selectAll('.combobox');
57501                     var options = combo.selectAll('.combobox-option')
57502                         .data(_suggestions, function(d) { return d.value; });
57503
57504                     options.exit()
57505                         .remove();
57506
57507                     // enter/update
57508                     options.enter()
57509                         .append('a')
57510                         .attr('class', 'combobox-option')
57511                         .attr('title', function(d) { return d.title; })
57512                         .text(function(d) { return d.display || d.value; })
57513                         .merge(options)
57514                         .classed('selected', function(d) { return d.value === _selected; })
57515                         .on('click.combo-option', accept)
57516                         .order();
57517
57518                     var node = attachTo ? attachTo.node() : input.node();
57519                     var rect = node.getBoundingClientRect();
57520
57521                     combo
57522                         .style('left', (rect.left + 5) + 'px')
57523                         .style('width', (rect.width - 10) + 'px')
57524                         .style('top', rect.height + rect.top + 'px');
57525                 }
57526
57527
57528                 // Dispatches an 'accept' event
57529                 // Then hides the combobox.
57530                 function accept(d) {
57531                     _cancelFetch = true;
57532                     var thiz = input.node();
57533
57534                     if (d) {   // user clicked on a suggestion
57535                         utilGetSetValue(input, d.value);    // replace field contents
57536                         utilTriggerEvent(input, 'change');
57537                     }
57538
57539                     // clear (and keep) selection
57540                     var val = utilGetSetValue(input);
57541                     thiz.setSelectionRange(val.length, val.length);
57542
57543                     d = _fetched[val];
57544                     dispatch$1.call('accept', thiz, d, val);
57545                     hide();
57546                 }
57547
57548
57549                 // Dispatches an 'cancel' event
57550                 // Then hides the combobox.
57551                 function cancel() {
57552                     _cancelFetch = true;
57553                     var thiz = input.node();
57554
57555                     // clear (and remove) selection, and replace field contents
57556                     var val = utilGetSetValue(input);
57557                     var start = input.property('selectionStart');
57558                     var end = input.property('selectionEnd');
57559                     val = val.slice(0, start) + val.slice(end);
57560                     utilGetSetValue(input, val);
57561                     thiz.setSelectionRange(val.length, val.length);
57562
57563                     dispatch$1.call('cancel', thiz);
57564                     hide();
57565                 }
57566
57567             };
57568
57569
57570             combobox.canAutocomplete = function(val) {
57571                 if (!arguments.length) return _canAutocomplete;
57572                 _canAutocomplete = val;
57573                 return combobox;
57574             };
57575
57576             combobox.caseSensitive = function(val) {
57577                 if (!arguments.length) return _caseSensitive;
57578                 _caseSensitive = val;
57579                 return combobox;
57580             };
57581
57582             combobox.data = function(val) {
57583                 if (!arguments.length) return _data;
57584                 _data = val;
57585                 return combobox;
57586             };
57587
57588             combobox.fetcher = function(val) {
57589                 if (!arguments.length) return _fetcher;
57590                 _fetcher = val;
57591                 return combobox;
57592             };
57593
57594             combobox.minItems = function(val) {
57595                 if (!arguments.length) return _minItems;
57596                 _minItems = val;
57597                 return combobox;
57598             };
57599
57600
57601             return utilRebind(combobox, dispatch$1, 'on');
57602         }
57603
57604
57605         uiCombobox.off = function(input) {
57606             input
57607                 .on('focus.combo-input', null)
57608                 .on('blur.combo-input', null)
57609                 .on('keydown.combo-input', null)
57610                 .on('keyup.combo-input', null)
57611                 .on('input.combo-input', null)
57612                 .on('mousedown.combo-input', null)
57613                 .on('mouseup.combo-input', null);
57614
57615
57616             d3_select('body')
57617                 .on('scroll.combo-scroll', null);
57618         };
57619
57620         // toggles the visibility of ui elements, using a combination of the
57621         // hide class, which sets display=none, and a d3 transition for opacity.
57622         // this will cause blinking when called repeatedly, so check that the
57623         // value actually changes between calls.
57624         function uiToggle(show, callback) {
57625             return function(selection) {
57626                 selection
57627                     .style('opacity', show ? 0 : 1)
57628                     .classed('hide', false)
57629                     .transition()
57630                     .style('opacity', show ? 1 : 0)
57631                     .on('end', function() {
57632                         d3_select(this)
57633                             .classed('hide', !show)
57634                             .style('opacity', null);
57635                         if (callback) callback.apply(this);
57636                     });
57637             };
57638         }
57639
57640         function uiDisclosure(context, key, expandedDefault) {
57641             var dispatch$1 = dispatch('toggled');
57642             var _preference = (context.storage('disclosure.' + key + '.expanded'));
57643             var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57644             var _title;
57645             var _updatePreference = true;
57646             var _content = function () {};
57647
57648
57649             var disclosure = function(selection) {
57650                 var hideToggle = selection.selectAll('.hide-toggle-' + key)
57651                     .data([0]);
57652
57653                 // enter
57654                 var hideToggleEnter = hideToggle.enter()
57655                     .append('a')
57656                     .attr('href', '#')
57657                     .attr('class', 'hide-toggle hide-toggle-' + key)
57658                     .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57659
57660                 hideToggleEnter
57661                     .append('span')
57662                     .attr('class', 'hide-toggle-text');
57663
57664                 // update
57665                 hideToggle = hideToggleEnter
57666                     .merge(hideToggle);
57667
57668                 hideToggle
57669                     .on('click', toggle)
57670                     .classed('expanded', _expanded);
57671
57672                 hideToggle.selectAll('.hide-toggle-text')
57673                     .text(_title);
57674
57675                 hideToggle.selectAll('.hide-toggle-icon')
57676                     .attr('xlink:href', _expanded ? '#iD-icon-down'
57677                         : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57678                     );
57679
57680
57681                 var wrap = selection.selectAll('.disclosure-wrap')
57682                     .data([0]);
57683
57684                 // enter/update
57685                 wrap = wrap.enter()
57686                     .append('div')
57687                     .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57688                     .merge(wrap)
57689                     .classed('hide', !_expanded);
57690
57691                 if (_expanded) {
57692                     wrap
57693                         .call(_content);
57694                 }
57695
57696
57697                 function toggle() {
57698                     event.preventDefault();
57699
57700                     _expanded = !_expanded;
57701
57702                     if (_updatePreference) {
57703                         context.storage('disclosure.' + key + '.expanded', _expanded);
57704                     }
57705
57706                     hideToggle
57707                         .classed('expanded', _expanded);
57708
57709                     hideToggle.selectAll('.hide-toggle-icon')
57710                         .attr('xlink:href', _expanded ? '#iD-icon-down'
57711                             : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57712                         );
57713
57714                     wrap
57715                         .call(uiToggle(_expanded));
57716
57717                     if (_expanded) {
57718                         wrap
57719                             .call(_content);
57720                     }
57721
57722                     dispatch$1.call('toggled', this, _expanded);
57723                 }
57724             };
57725
57726
57727             disclosure.title = function(val) {
57728                 if (!arguments.length) return _title;
57729                 _title = val;
57730                 return disclosure;
57731             };
57732
57733
57734             disclosure.expanded = function(val) {
57735                 if (!arguments.length) return _expanded;
57736                 _expanded = val;
57737                 return disclosure;
57738             };
57739
57740
57741             disclosure.updatePreference = function(val) {
57742                 if (!arguments.length) return _updatePreference;
57743                 _updatePreference = val;
57744                 return disclosure;
57745             };
57746
57747
57748             disclosure.content = function(val) {
57749                 if (!arguments.length) return _content;
57750                 _content = val;
57751                 return disclosure;
57752             };
57753
57754
57755             return utilRebind(disclosure, dispatch$1, 'on');
57756         }
57757
57758         // Pass `which` object of the form:
57759         // {
57760         //   key: 'string',     // required
57761         //   value: 'string'    // optional
57762         // }
57763         //   -or-
57764         // {
57765         //   rtype: 'string'    // relation type  (e.g. 'multipolygon')
57766         // }
57767         //   -or-
57768         // {
57769         //   qid: 'string'      // brand wikidata  (e.g. 'Q37158')
57770         // }
57771         //
57772         function uiTagReference(what) {
57773             var wikibase = what.qid ? services$1.wikidata : services$1.osmWikibase;
57774             var tagReference = {};
57775
57776             var _button = d3_select(null);
57777             var _body = d3_select(null);
57778             var _loaded;
57779             var _showing;
57780
57781
57782             function load() {
57783                 if (!wikibase) return;
57784
57785                 _button
57786                     .classed('tag-reference-loading', true);
57787
57788                 wikibase.getDocs(what, gotDocs);
57789             }
57790
57791
57792             function gotDocs(err, docs) {
57793                 _body.html('');
57794
57795                 if (!docs || !docs.title) {
57796                     _body
57797                         .append('p')
57798                         .attr('class', 'tag-reference-description')
57799                         .text(t('inspector.no_documentation_key'));
57800                     done();
57801                     return;
57802                 }
57803
57804                 if (docs.imageURL) {
57805                     _body
57806                         .append('img')
57807                         .attr('class', 'tag-reference-wiki-image')
57808                         .attr('src', docs.imageURL)
57809                         .on('load', function() { done(); })
57810                         .on('error', function() { d3_select(this).remove(); done(); });
57811                 } else {
57812                     done();
57813                 }
57814
57815                 _body
57816                     .append('p')
57817                     .attr('class', 'tag-reference-description')
57818                     .text(docs.description || t('inspector.no_documentation_key'))
57819                     .append('a')
57820                     .attr('class', 'tag-reference-edit')
57821                     .attr('target', '_blank')
57822                     .attr('tabindex', -1)
57823                     .attr('title', t('inspector.edit_reference'))
57824                     .attr('href', docs.editURL)
57825                     .call(svgIcon('#iD-icon-edit', 'inline'));
57826
57827                 if (docs.wiki) {
57828                     _body
57829                       .append('a')
57830                       .attr('class', 'tag-reference-link')
57831                       .attr('target', '_blank')
57832                       .attr('tabindex', -1)
57833                       .attr('href', docs.wiki.url)
57834                       .call(svgIcon('#iD-icon-out-link', 'inline'))
57835                       .append('span')
57836                       .text(t(docs.wiki.text));
57837                 }
57838
57839                 // Add link to info about "good changeset comments" - #2923
57840                 if (what.key === 'comment') {
57841                     _body
57842                         .append('a')
57843                         .attr('class', 'tag-reference-comment-link')
57844                         .attr('target', '_blank')
57845                         .attr('tabindex', -1)
57846                         .call(svgIcon('#iD-icon-out-link', 'inline'))
57847                         .attr('href', t('commit.about_changeset_comments_link'))
57848                         .append('span')
57849                         .text(t('commit.about_changeset_comments'));
57850                 }
57851             }
57852
57853
57854             function done() {
57855                 _loaded = true;
57856
57857                 _button
57858                     .classed('tag-reference-loading', false);
57859
57860                 _body
57861                     .classed('expanded', true)
57862                     .transition()
57863                     .duration(200)
57864                     .style('max-height', '200px')
57865                     .style('opacity', '1');
57866
57867                 _showing = true;
57868
57869                 _button.selectAll('svg.icon use').each(function() {
57870                     var iconUse = d3_select(this);
57871                     if (iconUse.attr('href') === '#iD-icon-info') {
57872                         iconUse.attr('href', '#iD-icon-info-filled');
57873                     }
57874                 });
57875             }
57876
57877
57878             function hide() {
57879                 _body
57880                     .transition()
57881                     .duration(200)
57882                     .style('max-height', '0px')
57883                     .style('opacity', '0')
57884                     .on('end', function () {
57885                         _body.classed('expanded', false);
57886                     });
57887
57888                 _showing = false;
57889
57890                 _button.selectAll('svg.icon use').each(function() {
57891                     var iconUse = d3_select(this);
57892                     if (iconUse.attr('href') === '#iD-icon-info-filled') {
57893                         iconUse.attr('href', '#iD-icon-info');
57894                     }
57895                 });
57896
57897             }
57898
57899
57900             tagReference.button = function(selection, klass, iconName) {
57901                 _button = selection.selectAll('.tag-reference-button')
57902                     .data([0]);
57903
57904                 _button = _button.enter()
57905                     .append('button')
57906                     .attr('class', 'tag-reference-button ' + klass)
57907                     .attr('title', t('icons.information'))
57908                     .attr('tabindex', -1)
57909                     .call(svgIcon('#iD-icon-' + (iconName || 'inspect')))
57910                     .merge(_button);
57911
57912                 _button
57913                     .on('click', function () {
57914                         event.stopPropagation();
57915                         event.preventDefault();
57916                         this.blur();    // avoid keeping focus on the button - #4641
57917                         if (_showing) {
57918                             hide();
57919                         } else if (_loaded) {
57920                             done();
57921                         } else {
57922                             load();
57923                         }
57924                     });
57925             };
57926
57927
57928             tagReference.body = function(selection) {
57929                 var itemID = what.qid || what.rtype || (what.key + '-' + what.value);
57930                 _body = selection.selectAll('.tag-reference-body')
57931                     .data([itemID], function(d) { return d; });
57932
57933                 _body.exit()
57934                     .remove();
57935
57936                 _body = _body.enter()
57937                     .append('div')
57938                     .attr('class', 'tag-reference-body')
57939                     .style('max-height', '0')
57940                     .style('opacity', '0')
57941                     .merge(_body);
57942
57943                 if (_showing === false) {
57944                     hide();
57945                 }
57946             };
57947
57948
57949             tagReference.showing = function(val) {
57950                 if (!arguments.length) return _showing;
57951                 _showing = val;
57952                 return tagReference;
57953             };
57954
57955
57956             return tagReference;
57957         }
57958
57959         function uiRawTagEditor(context) {
57960             var taginfo = services$1.taginfo;
57961             var dispatch$1 = dispatch('change');
57962             var availableViews = [
57963                 { id: 'text', icon: '#fas-i-cursor' },
57964                 { id: 'list', icon: '#fas-th-list' }
57965             ];
57966
57967             var _tagView = (context.storage('raw-tag-editor-view') || 'list');   // 'list, 'text'
57968             var _readOnlyTags = [];
57969             var _indexedKeys = [];
57970             var _showBlank = false;
57971             var _updatePreference = true;
57972             var _expanded = false;
57973             var _pendingChange = null;
57974             var _state;
57975             var _preset;
57976             var _tags;
57977             var _entityID;
57978
57979
57980             function rawTagEditor(selection) {
57981                 var count = Object.keys(_tags).filter(function(d) { return d; }).length;
57982
57983                 var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
57984                     .title(t('inspector.all_tags') + ' (' + count + ')')
57985                     .on('toggled', toggled)
57986                     .updatePreference(_updatePreference)
57987                     .content(content);
57988
57989                 // Sometimes we want to force the raw_tag_editor to be opened/closed..
57990                 // When undefined, uiDisclosure will use the user's stored preference.
57991                 if (_expanded !== undefined) {
57992                     disclosure.expanded(_expanded);
57993                 }
57994
57995                 selection.call(disclosure);
57996
57997                 function toggled(expanded) {
57998                     _expanded = expanded;
57999                     if (expanded) {
58000                         selection.node().parentNode.scrollTop += 200;
58001                     }
58002                 }
58003             }
58004
58005
58006             function content(wrap) {
58007                 // When switching to a different entity or changing the state (hover/select)
58008                 // reorder the keys alphabetically.
58009                 // We trigger this by emptying the `_indexedKeys` array, then it will be rebuilt here.
58010                 // Otherwise leave their order alone - #5857, #5927
58011                 var all = Object.keys(_tags).sort();
58012                 var known = _indexedKeys.map(function(t) { return t.key; });
58013                 var missing = utilArrayDifference(all, known);
58014                 for (var i = 0; i < missing.length; i++) {
58015                     _indexedKeys.push({ index: _indexedKeys.length, key: missing[i] });
58016                 }
58017
58018                 // assemble row data, excluding any deleted tags
58019                 var rowData = _indexedKeys.map(function(row) {
58020                     var v = _tags[row.key];
58021                     return (v === undefined) ? null : Object.assign(row, { value: v });
58022                 }).filter(Boolean);
58023
58024                 // append blank row last, if necessary
58025                 if (!_indexedKeys.length || _showBlank) {
58026                     _showBlank = false;
58027                     rowData.push({ index: _indexedKeys.length, key: '', value: '' });
58028                 }
58029
58030
58031                 // View Options
58032                 var options = wrap.selectAll('.raw-tag-options')
58033                     .data([0]);
58034
58035                 var optionsEnter = options.enter()
58036                     .append('div')
58037                     .attr('class', 'raw-tag-options');
58038
58039                 var optionEnter = optionsEnter.selectAll('.raw-tag-option')
58040                     .data(availableViews, function(d) { return d.id; })
58041                     .enter();
58042
58043                 optionEnter
58044                     .append('button')
58045                     .attr('class', function(d) {
58046                         return 'raw-tag-option raw-tag-option-' + d.id + (_tagView === d.id ? ' selected' : '');
58047                     })
58048                     .attr('title', function(d) { return d.id; })
58049                     .on('click', function(d) {
58050                         _tagView = d.id;
58051                         context.storage('raw-tag-editor-view', d.id);
58052
58053                         wrap.selectAll('.raw-tag-option')
58054                             .classed('selected', function(datum) { return datum === d; });
58055
58056                         wrap.selectAll('.tag-text')
58057                             .classed('hide', (d.id !== 'text'))
58058                             .each(setTextareaHeight);
58059
58060                         wrap.selectAll('.tag-list, .add-row')
58061                             .classed('hide', (d.id !== 'list'));
58062                     })
58063                     .each(function(d) {
58064                         d3_select(this)
58065                             .call(svgIcon(d.icon));
58066                     });
58067
58068
58069                 // View as Text
58070                 var textData = rowsToText(rowData);
58071                 var textarea = wrap.selectAll('.tag-text')
58072                     .data([0]);
58073
58074                 textarea = textarea.enter()
58075                     .append('textarea')
58076                     .attr('class', 'tag-text' + (_tagView !== 'text' ? ' hide' : ''))
58077                     .call(utilNoAuto)
58078                     .attr('spellcheck', 'false')
58079                     .merge(textarea);
58080
58081                 textarea
58082                     .call(utilGetSetValue, textData)
58083                     .each(setTextareaHeight)
58084                     .on('input', setTextareaHeight)
58085                     .on('blur', textChanged)
58086                     .on('change', textChanged);
58087
58088                 // If All Fields section is hidden, focus textarea and put cursor at end..
58089                 var fieldsExpanded = d3_select('.hide-toggle-preset_fields.expanded').size();
58090                 if (_state !== 'hover' && _tagView === 'text' && !fieldsExpanded) {
58091                     var element = textarea.node();
58092                     element.focus();
58093                     element.setSelectionRange(textData.length, textData.length);
58094                 }
58095
58096
58097                 // View as List
58098                 var list = wrap.selectAll('.tag-list')
58099                     .data([0]);
58100
58101                 list = list.enter()
58102                     .append('ul')
58103                     .attr('class', 'tag-list' + (_tagView !== 'list' ? ' hide' : ''))
58104                     .merge(list);
58105
58106
58107                 // Container for the Add button
58108                 var addRowEnter = wrap.selectAll('.add-row')
58109                     .data([0])
58110                     .enter()
58111                     .append('div')
58112                     .attr('class', 'add-row' + (_tagView !== 'list' ? ' hide' : ''));
58113
58114                 addRowEnter
58115                     .append('button')
58116                     .attr('class', 'add-tag')
58117                     .call(svgIcon('#iD-icon-plus', 'light'))
58118                     .on('click', addTag);
58119
58120                 addRowEnter
58121                     .append('div')
58122                     .attr('class', 'space-value');   // preserve space
58123
58124                 addRowEnter
58125                     .append('div')
58126                     .attr('class', 'space-buttons');  // preserve space
58127
58128
58129                 // Tag list items
58130                 var items = list.selectAll('.tag-row')
58131                     .data(rowData, function(d) { return d.key; });
58132
58133                 items.exit()
58134                     .each(unbind)
58135                     .remove();
58136
58137
58138                 // Enter
58139                 var itemsEnter = items.enter()
58140                     .append('li')
58141                     .attr('class', 'tag-row')
58142                     .classed('readonly', isReadOnly);
58143
58144                 var innerWrap = itemsEnter.append('div')
58145                     .attr('class', 'inner-wrap');
58146
58147                 innerWrap
58148                     .append('div')
58149                     .attr('class', 'key-wrap')
58150                     .append('input')
58151                     .property('type', 'text')
58152                     .attr('class', 'key')
58153                     .attr('maxlength', 255)
58154                     .call(utilNoAuto)
58155                     .on('blur', keyChange)
58156                     .on('change', keyChange);
58157
58158                 innerWrap
58159                     .append('div')
58160                     .attr('class', 'value-wrap')
58161                     .append('input')
58162                     .property('type', 'text')
58163                     .attr('class', 'value')
58164                     .attr('maxlength', 255)
58165                     .call(utilNoAuto)
58166                     .on('blur', valueChange)
58167                     .on('change', valueChange)
58168                     .on('keydown.push-more', pushMore);
58169
58170                 innerWrap
58171                     .append('button')
58172                     .attr('tabindex', -1)
58173                     .attr('class', 'form-field-button remove')
58174                     .attr('title', t('icons.remove'))
58175                     .call(svgIcon('#iD-operation-delete'));
58176
58177
58178                 // Update
58179                 items = items
58180                     .merge(itemsEnter)
58181                     .sort(function(a, b) { return a.index - b.index; });
58182
58183                 items
58184                     .each(function(d) {
58185                         var row = d3_select(this);
58186                         var key = row.select('input.key');      // propagate bound data
58187                         var value = row.select('input.value');  // propagate bound data
58188
58189                         if (_entityID && taginfo && _state !== 'hover') {
58190                             bindTypeahead(key, value);
58191                         }
58192
58193                         var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
58194                         var reference;
58195
58196                         if (isRelation && d.key === 'type') {
58197                             reference = uiTagReference({ rtype: d.value }, context);
58198                         } else {
58199                             reference = uiTagReference({ key: d.key, value: d.value }, context);
58200                         }
58201
58202                         if (_state === 'hover') {
58203                             reference.showing(false);
58204                         }
58205
58206                         row.select('.inner-wrap')      // propagate bound data
58207                             .call(reference.button);
58208
58209                         row.call(reference.body);
58210
58211                         row.select('button.remove');   // propagate bound data
58212                     });
58213
58214                 items.selectAll('input.key')
58215                     .attr('title', function(d) { return d.key; })
58216                     .call(utilGetSetValue, function(d) { return d.key; })
58217                     .property('disabled', isReadOnly);
58218
58219                 items.selectAll('input.value')
58220                     .attr('title', function(d) { return d.value; })
58221                     .call(utilGetSetValue, function(d) { return d.value; })
58222                     .property('disabled', isReadOnly);
58223
58224                 items.selectAll('button.remove')
58225                     .on('mousedown', removeTag);  // 'click' fires too late - #5878
58226
58227
58228
58229                 function isReadOnly(d) {
58230                     for (var i = 0; i < _readOnlyTags.length; i++) {
58231                         if (d.key.match(_readOnlyTags[i]) !== null) {
58232                             return true;
58233                         }
58234                     }
58235                     return false;
58236                 }
58237
58238
58239                 function setTextareaHeight() {
58240                     if (_tagView !== 'text') return;
58241
58242                     var selection = d3_select(this);
58243                     selection.style('height', null);
58244                     selection.style('height', selection.node().scrollHeight + 5 + 'px');
58245                 }
58246
58247
58248                 function stringify(s) {
58249                     return JSON.stringify(s).slice(1, -1);   // without leading/trailing "
58250                 }
58251
58252                 function unstringify(s) {
58253                     var leading = '';
58254                     var trailing = '';
58255                     if (s.length < 1 || s.charAt(0) !== '"') {
58256                         leading = '"';
58257                     }
58258                     if (s.length < 2 || s.charAt(s.length - 1) !== '"' ||
58259                         (s.charAt(s.length - 1) === '"' && s.charAt(s.length - 2) === '\\')
58260                     ) {
58261                         trailing = '"';
58262                     }
58263                     return JSON.parse(leading + s + trailing);
58264                 }
58265
58266
58267                 function rowsToText(rows) {
58268                     var str = rows
58269                         .filter(function(row) { return row.key && row.key.trim() !== ''; })
58270                         .map(function(row) { return stringify(row.key) + '=' + stringify(row.value); })
58271                         .join('\n');
58272
58273                     return _state === 'hover' ? str : str + '\n';
58274                 }
58275
58276
58277                 function textChanged() {
58278                     var newText = this.value.trim();
58279                     var newTags = {};
58280                     newText.split('\n').forEach(function(row) {
58281                         var m = row.match(/^\s*([^=]+)=(.*)$/);
58282                         if (m !== null) {
58283                             var k = unstringify(m[1].trim());
58284                             var v = unstringify(m[2].trim());
58285                             newTags[k] = v;
58286                         }
58287                     });
58288
58289                     var tagDiff = utilTagDiff(_tags, newTags);
58290                     if (!tagDiff.length) return;
58291
58292                     _pendingChange  = _pendingChange || {};
58293
58294                     tagDiff.forEach(function(change) {
58295                         if (isReadOnly({ key: change.key })) return;
58296
58297                         if (change.type === '-') {
58298                             _pendingChange[change.key] = undefined;
58299                         } else if (change.type === '+') {
58300                             _pendingChange[change.key] = change.newVal || '';
58301                         }
58302                     });
58303
58304                     scheduleChange();
58305                 }
58306
58307
58308                 function pushMore() {
58309                     if (event.keyCode === 9 && !event.shiftKey &&
58310                         list.selectAll('li:last-child input.value').node() === this) {
58311                         addTag();
58312                     }
58313                 }
58314
58315
58316                 function bindTypeahead(key, value) {
58317                     if (isReadOnly(key.datum())) return;
58318
58319                     var geometry = context.geometry(_entityID);
58320
58321                     key.call(uiCombobox(context, 'tag-key')
58322                         .fetcher(function(value, callback) {
58323                             taginfo.keys({
58324                                 debounce: true,
58325                                 geometry: geometry,
58326                                 query: value
58327                             }, function(err, data) {
58328                                 if (!err) {
58329                                     var filtered = data.filter(function(d) { return _tags[d.value] === undefined; });
58330                                     callback(sort(value, filtered));
58331                                 }
58332                             });
58333                         }));
58334
58335                     value.call(uiCombobox(context, 'tag-value')
58336                         .fetcher(function(value, callback) {
58337                             taginfo.values({
58338                                 debounce: true,
58339                                 key: utilGetSetValue(key),
58340                                 geometry: geometry,
58341                                 query: value
58342                             }, function(err, data) {
58343                                 if (!err) callback(sort(value, data));
58344                             });
58345                         }));
58346
58347
58348                     function sort(value, data) {
58349                         var sameletter = [];
58350                         var other = [];
58351                         for (var i = 0; i < data.length; i++) {
58352                             if (data[i].value.substring(0, value.length) === value) {
58353                                 sameletter.push(data[i]);
58354                             } else {
58355                                 other.push(data[i]);
58356                             }
58357                         }
58358                         return sameletter.concat(other);
58359                     }
58360                 }
58361
58362
58363                 function unbind() {
58364                     var row = d3_select(this);
58365
58366                     row.selectAll('input.key')
58367                         .call(uiCombobox.off);
58368
58369                     row.selectAll('input.value')
58370                         .call(uiCombobox.off);
58371                 }
58372
58373
58374                 function keyChange(d) {
58375                     var kOld = d.key;
58376                     var kNew = this.value.trim();
58377                     var row = this.parentNode.parentNode;
58378                     var inputVal = d3_select(row).selectAll('input.value');
58379                     var vNew = utilGetSetValue(inputVal);
58380
58381                     // allow no change if the key should be readonly
58382                     if (isReadOnly({ key: kNew })) {
58383                         this.value = kOld;
58384                         return;
58385                     }
58386
58387                     // switch focus if key is already in use
58388                     if (kNew && kNew !== kOld) {
58389                         if (_tags[kNew] !== undefined) {      // new key is already in use
58390                             this.value = kOld;                // reset the key
58391                             list.selectAll('input.value')
58392                                 .each(function(d) {
58393                                     if (d.key === kNew) {     // send focus to that other value combo instead
58394                                         var input = d3_select(this).node();
58395                                         input.focus();
58396                                         input.select();
58397                                     }
58398                                 });
58399                             return;
58400                         }
58401                     }
58402
58403                     _pendingChange  = _pendingChange || {};
58404
58405                     // exit if we are currently about to delete this row anyway - #6366
58406                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58407
58408                     if (kOld) {
58409                         _pendingChange[kOld] = undefined;
58410                     }
58411
58412                     _pendingChange[kNew] = vNew;
58413
58414                     d.key = kNew;    // update datum to avoid exit/enter on tag update
58415                     d.value = vNew;
58416
58417                     this.value = kNew;
58418                     utilGetSetValue(inputVal, vNew);
58419                     scheduleChange();
58420                 }
58421
58422
58423                 function valueChange(d) {
58424                     if (isReadOnly(d)) return;
58425
58426                     _pendingChange  = _pendingChange || {};
58427
58428                     // exit if we are currently about to delete this row anyway - #6366
58429                     if (_pendingChange.hasOwnProperty(d.key) && _pendingChange[d.key] === undefined) return;
58430
58431                     _pendingChange[d.key] = this.value;
58432                     scheduleChange();
58433                 }
58434
58435
58436                 function removeTag(d) {
58437                     if (isReadOnly(d)) return;
58438
58439                     if (d.key === '') {    // removing the blank row
58440                         _showBlank = false;
58441                         content(wrap);
58442
58443                     } else {
58444                         // remove from indexedKeys too, so that if the user puts it back,
58445                         // it will be sorted to the end and not back to its original position
58446                         _indexedKeys = _indexedKeys.filter(function(row) { return row.key !== d.key; });
58447
58448                         _pendingChange  = _pendingChange || {};
58449                         _pendingChange[d.key] = undefined;
58450                         scheduleChange();
58451                     }
58452                 }
58453
58454
58455                 function addTag() {
58456                     // Delay render in case this click is blurring an edited combo.
58457                     // Without the setTimeout, the `content` render would wipe out the pending tag change.
58458                     window.setTimeout(function() {
58459                         _showBlank = true;
58460                         content(wrap);
58461                         list.selectAll('li:last-child input.key').node().focus();
58462                     }, 20);
58463                 }
58464
58465
58466                 function scheduleChange() {
58467                     // Delay change in case this change is blurring an edited combo. - #5878
58468                     window.setTimeout(function() {
58469                         dispatch$1.call('change', this, _pendingChange);
58470                         _pendingChange = null;
58471                     }, 10);
58472                 }
58473
58474             }
58475
58476
58477             rawTagEditor.state = function(val) {
58478                 if (!arguments.length) return _state;
58479                 if (_state !== val) {
58480                     _indexedKeys = [];
58481                     _state = val;
58482                 }
58483                 return rawTagEditor;
58484             };
58485
58486
58487             rawTagEditor.preset = function(val) {
58488                 if (!arguments.length) return _preset;
58489                 _preset = val;
58490                 if (_preset.isFallback()) {
58491                     _expanded = true;
58492                     _updatePreference = false;
58493                 } else {
58494                     _expanded = undefined;
58495                     _updatePreference = true;
58496                 }
58497                 return rawTagEditor;
58498             };
58499
58500
58501             rawTagEditor.tags = function(val) {
58502                 if (!arguments.length) return _tags;
58503                 _tags = val;
58504                 return rawTagEditor;
58505             };
58506
58507
58508             rawTagEditor.entityID = function(val) {
58509                 if (!arguments.length) return _entityID;
58510                 if (_entityID !== val) {
58511                     _indexedKeys = [];
58512                     _entityID = val;
58513                 }
58514                 return rawTagEditor;
58515             };
58516
58517
58518             rawTagEditor.expanded = function(val) {
58519                 if (!arguments.length) return _expanded;
58520                 _expanded = val;
58521                 _updatePreference = false;
58522                 return rawTagEditor;
58523             };
58524
58525
58526             // pass an array of regular expressions to test against the tag key
58527             rawTagEditor.readOnlyTags = function(val) {
58528                 if (!arguments.length) return _readOnlyTags;
58529                 _readOnlyTags = val;
58530                 return rawTagEditor;
58531             };
58532
58533
58534             return utilRebind(rawTagEditor, dispatch$1, 'on');
58535         }
58536
58537         function uiDataEditor(context) {
58538             var dataHeader = uiDataHeader();
58539             var quickLinks = uiQuickLinks();
58540             var rawTagEditor = uiRawTagEditor(context);
58541             var _datum;
58542
58543
58544             function dataEditor(selection) {
58545                 // quick links
58546                 var choices = [{
58547                     id: 'zoom_to',
58548                     label: 'inspector.zoom_to.title',
58549                     tooltip: function() {
58550                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_data'), t('inspector.zoom_to.key'));
58551                     },
58552                     click: function zoomTo() {
58553                         context.mode().zoomToSelected();
58554                     }
58555                 }];
58556
58557
58558                 var header = selection.selectAll('.header')
58559                     .data([0]);
58560
58561                 var headerEnter = header.enter()
58562                     .append('div')
58563                     .attr('class', 'header fillL');
58564
58565                 headerEnter
58566                     .append('button')
58567                     .attr('class', 'fr data-editor-close')
58568                     .on('click', function() {
58569                         context.enter(modeBrowse(context));
58570                     })
58571                     .call(svgIcon('#iD-icon-close'));
58572
58573                 headerEnter
58574                     .append('h3')
58575                     .text(t('map_data.title'));
58576
58577
58578                 var body = selection.selectAll('.body')
58579                     .data([0]);
58580
58581                 body = body.enter()
58582                     .append('div')
58583                     .attr('class', 'body')
58584                     .merge(body);
58585
58586                 var editor = body.selectAll('.data-editor')
58587                     .data([0]);
58588
58589                 // enter/update
58590                 editor.enter()
58591                     .append('div')
58592                     .attr('class', 'modal-section data-editor')
58593                     .merge(editor)
58594                     .call(dataHeader.datum(_datum))
58595                     .call(quickLinks.choices(choices));
58596
58597                 var rte = body.selectAll('.raw-tag-editor')
58598                     .data([0]);
58599
58600                 // enter/update
58601                 rte.enter()
58602                     .append('div')
58603                     .attr('class', 'raw-tag-editor inspector-inner data-editor')
58604                     .merge(rte)
58605                     .call(rawTagEditor
58606                         .expanded(true)
58607                         .readOnlyTags([/./])
58608                         .tags((_datum && _datum.properties) || {})
58609                         .state('hover')
58610                     )
58611                     .selectAll('textarea.tag-text')
58612                     .property('disabled', true)
58613                     .classed('readonly', true);
58614             }
58615
58616
58617             dataEditor.datum = function(val) {
58618                 if (!arguments.length) return _datum;
58619                 _datum = val;
58620                 return this;
58621             };
58622
58623
58624             return dataEditor;
58625         }
58626
58627         function modeSelectData(context, selectedDatum) {
58628             var mode = {
58629                 id: 'select-data',
58630                 button: 'browse'
58631             };
58632
58633             var keybinding = utilKeybinding('select-data');
58634             var dataEditor = uiDataEditor(context);
58635
58636             var behaviors = [
58637                 behaviorBreathe(context),
58638                 behaviorHover(context),
58639                 behaviorSelect(context),
58640                 behaviorLasso(context),
58641                 modeDragNode(context).behavior,
58642                 modeDragNote(context).behavior
58643             ];
58644
58645
58646             // class the data as selected, or return to browse mode if the data is gone
58647             function selectData(drawn) {
58648                 var selection = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
58649
58650                 if (selection.empty()) {
58651                     // Return to browse mode if selected DOM elements have
58652                     // disappeared because the user moved them out of view..
58653                     var source = event && event.type === 'zoom' && event.sourceEvent;
58654                     if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
58655                         context.enter(modeBrowse(context));
58656                     }
58657                 } else {
58658                     selection.classed('selected', true);
58659                 }
58660             }
58661
58662
58663             function esc() {
58664                 if (d3_select('.combobox').size()) return;
58665                 context.enter(modeBrowse(context));
58666             }
58667
58668
58669             mode.zoomToSelected = function() {
58670                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58671                 context.map().centerZoomEase(extent.center(), context.map().trimmedExtentZoom(extent));
58672             };
58673
58674
58675             mode.enter = function() {
58676                 behaviors.forEach(context.install);
58677
58678                 keybinding
58679                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
58680                     .on('⎋', esc, true);
58681
58682                 d3_select(document)
58683                     .call(keybinding);
58684
58685                 selectData();
58686
58687                 var sidebar = context.ui().sidebar;
58688                 sidebar.show(dataEditor.datum(selectedDatum));
58689
58690                 // expand the sidebar, avoid obscuring the data if needed
58691                 var extent = geoExtent(d3_geoBounds(selectedDatum));
58692                 sidebar.expand(sidebar.intersects(extent));
58693
58694                 context.map()
58695                     .on('drawn.select-data', selectData);
58696             };
58697
58698
58699             mode.exit = function() {
58700                 behaviors.forEach(context.uninstall);
58701
58702                 d3_select(document)
58703                     .call(keybinding.unbind);
58704
58705                 context.surface()
58706                     .selectAll('.layer-mapdata .selected')
58707                     .classed('selected hover', false);
58708
58709                 context.map()
58710                     .on('drawn.select-data', null);
58711
58712                 context.ui().sidebar
58713                     .hide();
58714             };
58715
58716
58717             return mode;
58718         }
58719
58720         function uiImproveOsmComments() {
58721             var _error;
58722
58723
58724             function errorComments(selection) {
58725                 // make the div immediately so it appears above the buttons
58726                 var comments = selection.selectAll('.comments-container')
58727                     .data([0]);
58728
58729                 comments = comments.enter()
58730                     .append('div')
58731                     .attr('class', 'comments-container')
58732                     .merge(comments);
58733
58734                 // must retrieve comments from API before they can be displayed
58735                 services$1.improveOSM.getComments(_error, function(err, d) {
58736                     if (!d.comments) { return; } // nothing to do here
58737
58738                     var commentEnter = comments.selectAll('.comment')
58739                         .data(d.comments)
58740                         .enter()
58741                         .append('div')
58742                         .attr('class', 'comment');
58743
58744                     commentEnter
58745                         .append('div')
58746                         .attr('class', 'comment-avatar')
58747                         .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
58748
58749                     var mainEnter = commentEnter
58750                         .append('div')
58751                         .attr('class', 'comment-main');
58752
58753                     var metadataEnter = mainEnter
58754                         .append('div')
58755                         .attr('class', 'comment-metadata');
58756
58757                     metadataEnter
58758                         .append('div')
58759                         .attr('class', 'comment-author')
58760                         .each(function(d) {
58761                             var selection = d3_select(this);
58762                             var osm = services$1.osm;
58763                             if (osm && d.username) {
58764                                 selection = selection
58765                                     .append('a')
58766                                     .attr('class', 'comment-author-link')
58767                                     .attr('href', osm.userURL(d.username))
58768                                     .attr('tabindex', -1)
58769                                     .attr('target', '_blank');
58770                             }
58771                             selection
58772                                 .text(function(d) { return d.username; });
58773                         });
58774
58775                     metadataEnter
58776                         .append('div')
58777                         .attr('class', 'comment-date')
58778                         .text(function(d) {
58779                             return t('note.status.commented', { when: localeDateString(d.timestamp) });
58780                         });
58781
58782                     mainEnter
58783                         .append('div')
58784                         .attr('class', 'comment-text')
58785                         .append('p')
58786                         .text(function(d) { return d.text; });
58787                 });
58788             }
58789
58790             function localeDateString(s) {
58791                 if (!s) return null;
58792                 var detected = utilDetect();
58793                 var options = { day: 'numeric', month: 'short', year: 'numeric' };
58794                 var d = new Date(s * 1000); // timestamp is served in seconds, date takes ms
58795                 if (isNaN(d.getTime())) return null;
58796                 return d.toLocaleDateString(detected.locale, options);
58797             }
58798
58799             errorComments.error = function(val) {
58800                 if (!arguments.length) return _error;
58801                 _error = val;
58802                 return errorComments;
58803             };
58804
58805             return errorComments;
58806         }
58807
58808         function uiImproveOsmDetails(context) {
58809             var _error;
58810
58811
58812             function errorDetail(d) {
58813                 var unknown = t('inspector.unknown');
58814
58815                 if (!d) return unknown;
58816
58817                 if (d.desc) return d.desc;
58818
58819                 var errorType = d.error_key;
58820                 var et = en.QA.improveOSM.error_types[errorType];
58821
58822                 var detail;
58823                 if (et && et.description) {
58824                     detail = t('QA.improveOSM.error_types.' + errorType + '.description', d.replacements);
58825                 } else {
58826                     detail = unknown;
58827                 }
58828
58829                 return detail;
58830             }
58831
58832
58833             function improveOsmDetails(selection) {
58834                 var details = selection.selectAll('.error-details')
58835                     .data(
58836                         (_error ? [_error] : []),
58837                         function(d) { return d.id + '-' + (d.status || 0); }
58838                     );
58839
58840                 details.exit()
58841                     .remove();
58842
58843                 var detailsEnter = details.enter()
58844                     .append('div')
58845                     .attr('class', 'error-details error-details-container');
58846
58847
58848                 // description
58849                 var descriptionEnter = detailsEnter
58850                     .append('div')
58851                     .attr('class', 'error-details-description');
58852
58853                 descriptionEnter
58854                     .append('h4')
58855                     .text(function() { return t('QA.keepRight.detail_description'); });
58856
58857                 descriptionEnter
58858                     .append('div')
58859                     .attr('class', 'error-details-description-text')
58860                     .html(errorDetail);
58861
58862                 // If there are entity links in the error message..
58863                 var relatedEntities = [];
58864                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
58865                     .each(function() {
58866                         var link = d3_select(this);
58867                         var isObjectLink = link.classed('error_object_link');
58868                         var entityID = isObjectLink ?
58869                             (utilEntityRoot(_error.object_type) + _error.object_id)
58870                             : this.textContent;
58871                         var entity = context.hasEntity(entityID);
58872
58873                         relatedEntities.push(entityID);
58874
58875                         // Add click handler
58876                         link
58877                             .on('mouseover', function() {
58878                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
58879                                     .classed('hover', true);
58880                             })
58881                             .on('mouseout', function() {
58882                                 context.surface().selectAll('.hover')
58883                                     .classed('hover', false);
58884                             })
58885                             .on('click', function() {
58886                                 event.preventDefault();
58887                                 var osmlayer = context.layers().layer('osm');
58888                                 if (!osmlayer.enabled()) {
58889                                     osmlayer.enabled(true);
58890                                 }
58891
58892                                 context.map().centerZoom(_error.loc, 20);
58893
58894                                 if (entity) {
58895                                     context.enter(modeSelect(context, [entityID]));
58896                                 } else {
58897                                     context.loadEntity(entityID, function() {
58898                                         context.enter(modeSelect(context, [entityID]));
58899                                     });
58900                                 }
58901                             });
58902
58903                         // Replace with friendly name if possible
58904                         // (The entity may not yet be loaded into the graph)
58905                         if (entity) {
58906                             var name = utilDisplayName(entity);  // try to use common name
58907
58908                             if (!name && !isObjectLink) {
58909                                 var preset = context.presets().match(entity, context.graph());
58910                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
58911                             }
58912
58913                             if (name) {
58914                                 this.innerText = name;
58915                             }
58916                         }
58917                     });
58918
58919                 // Don't hide entities related to this error - #5880
58920                 context.features().forceVisible(relatedEntities);
58921             }
58922
58923
58924             improveOsmDetails.error = function(val) {
58925                 if (!arguments.length) return _error;
58926                 _error = val;
58927                 return improveOsmDetails;
58928             };
58929
58930
58931             return improveOsmDetails;
58932         }
58933
58934         function uiImproveOsmHeader() {
58935             var _error;
58936
58937
58938             function errorTitle(d) {
58939                 var unknown = t('inspector.unknown');
58940
58941                 if (!d) return unknown;
58942                 var errorType = d.error_key;
58943                 var et = en.QA.improveOSM.error_types[errorType];
58944
58945                 if (et && et.title) {
58946                     return t('QA.improveOSM.error_types.' + errorType + '.title');
58947                 } else {
58948                     return unknown;
58949                 }
58950             }
58951
58952
58953             function improveOsmHeader(selection) {
58954                 var header = selection.selectAll('.error-header')
58955                     .data(
58956                         (_error ? [_error] : []),
58957                         function(d) { return d.id + '-' + (d.status || 0); }
58958                     );
58959
58960                 header.exit()
58961                     .remove();
58962
58963                 var headerEnter = header.enter()
58964                     .append('div')
58965                     .attr('class', 'error-header');
58966
58967                 var iconEnter = headerEnter
58968                     .append('div')
58969                     .attr('class', 'error-header-icon')
58970                     .classed('new', function(d) { return d.id < 0; });
58971
58972                 var svgEnter = iconEnter
58973                     .append('svg')
58974                     .attr('width', '20px')
58975                     .attr('height', '30px')
58976                     .attr('viewbox', '0 0 20 30')
58977                     .attr('class', function(d) {
58978                         return [
58979                             'preset-icon-28',
58980                             'qa_error',
58981                             d.service,
58982                             'error_id-' + d.id,
58983                             'error_type-' + d.error_type,
58984                             'category-' + d.category
58985                         ].join(' ');
58986                     });
58987
58988                 svgEnter
58989                     .append('polygon')
58990                     .attr('fill', 'currentColor')
58991                     .attr('class', 'qa_error-fill')
58992                     .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');
58993
58994                 svgEnter
58995                     .append('use')
58996                     .attr('class', 'icon-annotation')
58997                     .attr('width', '11px')
58998                     .attr('height', '11px')
58999                     .attr('transform', 'translate(4.5, 7)')
59000                     .attr('xlink:href', function(d) {
59001                         var picon = d.icon;
59002
59003                         if (!picon) {
59004                             return '';
59005                         } else {
59006                             var isMaki = /^maki-/.test(picon);
59007                             return '#' + picon + (isMaki ? '-11' : '');
59008                         }
59009                     });
59010
59011                 headerEnter
59012                     .append('div')
59013                     .attr('class', 'error-header-label')
59014                     .text(errorTitle);
59015             }
59016
59017
59018             improveOsmHeader.error = function(val) {
59019                 if (!arguments.length) return _error;
59020                 _error = val;
59021                 return improveOsmHeader;
59022             };
59023
59024
59025             return improveOsmHeader;
59026         }
59027
59028         function uiImproveOsmEditor(context) {
59029             var dispatch$1 = dispatch('change');
59030             var errorDetails = uiImproveOsmDetails(context);
59031             var errorComments = uiImproveOsmComments(context);
59032             var errorHeader = uiImproveOsmHeader(context);
59033             var quickLinks = uiQuickLinks();
59034
59035             var _error;
59036
59037
59038             function improveOsmEditor(selection) {
59039                 // quick links
59040                 var choices = [{
59041                     id: 'zoom_to',
59042                     label: 'inspector.zoom_to.title',
59043                     tooltip: function() {
59044                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59045                     },
59046                     click: function zoomTo() {
59047                         context.mode().zoomToSelected();
59048                     }
59049                 }];
59050
59051
59052                 var header = selection.selectAll('.header')
59053                     .data([0]);
59054
59055                 var headerEnter = header.enter()
59056                     .append('div')
59057                     .attr('class', 'header fillL');
59058
59059                 headerEnter
59060                     .append('button')
59061                     .attr('class', 'fr error-editor-close')
59062                     .on('click', function() {
59063                         context.enter(modeBrowse(context));
59064                     })
59065                     .call(svgIcon('#iD-icon-close'));
59066
59067                 headerEnter
59068                     .append('h3')
59069                     .text(t('QA.improveOSM.title'));
59070
59071
59072                 var body = selection.selectAll('.body')
59073                     .data([0]);
59074
59075                 body = body.enter()
59076                     .append('div')
59077                     .attr('class', 'body')
59078                     .merge(body);
59079
59080                 var editor = body.selectAll('.error-editor')
59081                     .data([0]);
59082
59083                 editor.enter()
59084                     .append('div')
59085                     .attr('class', 'modal-section error-editor')
59086                     .merge(editor)
59087                     .call(errorHeader.error(_error))
59088                     .call(quickLinks.choices(choices))
59089                     .call(errorDetails.error(_error))
59090                     .call(errorComments.error(_error))
59091                     .call(improveOsmSaveSection);
59092             }
59093
59094             function improveOsmSaveSection(selection) {
59095                 var isSelected = (_error && _error.id === context.selectedErrorID());
59096                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59097                 var saveSection = selection.selectAll('.error-save')
59098                     .data(
59099                         (isShown ? [_error] : []),
59100                         function(d) { return d.id + '-' + (d.status || 0); }
59101                     );
59102
59103                 // exit
59104                 saveSection.exit()
59105                     .remove();
59106
59107                 // enter
59108                 var saveSectionEnter = saveSection.enter()
59109                     .append('div')
59110                     .attr('class', 'error-save save-section cf');
59111
59112                 saveSectionEnter
59113                     .append('h4')
59114                     .attr('class', '.error-save-header')
59115                     .text(t('note.newComment'));
59116
59117                 saveSectionEnter
59118                     .append('textarea')
59119                     .attr('class', 'new-comment-input')
59120                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59121                     .attr('maxlength', 1000)
59122                     .property('value', function(d) { return d.newComment; })
59123                     .call(utilNoAuto)
59124                     .on('input', changeInput)
59125                     .on('blur', changeInput);
59126
59127                 // update
59128                 saveSection = saveSectionEnter
59129                     .merge(saveSection)
59130                     .call(errorSaveButtons);
59131
59132                 function changeInput() {
59133                     var input = d3_select(this);
59134                     var val = input.property('value').trim();
59135
59136                     if (val === '') {
59137                         val = undefined;
59138                     }
59139
59140                     // store the unsaved comment with the error itself
59141                     _error = _error.update({ newComment: val });
59142
59143                     var errorService = services$1.improveOSM;
59144                     if (errorService) {
59145                         errorService.replaceError(_error);
59146                     }
59147
59148                     saveSection
59149                         .call(errorSaveButtons);
59150                 }
59151             }
59152
59153             function errorSaveButtons(selection) {
59154                 var isSelected = (_error && _error.id === context.selectedErrorID());
59155                 var buttonSection = selection.selectAll('.buttons')
59156                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59157
59158                 // exit
59159                 buttonSection.exit()
59160                     .remove();
59161
59162                 // enter
59163                 var buttonEnter = buttonSection.enter()
59164                     .append('div')
59165                     .attr('class', 'buttons');
59166
59167                 buttonEnter
59168                     .append('button')
59169                     .attr('class', 'button comment-button action')
59170                     .text(t('QA.keepRight.save_comment'));
59171
59172                 buttonEnter
59173                     .append('button')
59174                     .attr('class', 'button close-button action');
59175
59176                 buttonEnter
59177                     .append('button')
59178                     .attr('class', 'button ignore-button action');
59179
59180
59181                 // update
59182                 buttonSection = buttonSection
59183                     .merge(buttonEnter);
59184
59185                 buttonSection.select('.comment-button')
59186                     .attr('disabled', function(d) {
59187                         return d.newComment === undefined ? true : null;
59188                     })
59189                     .on('click.comment', function(d) {
59190                         this.blur();    // avoid keeping focus on the button - #4641
59191                         var errorService = services$1.improveOSM;
59192                         if (errorService) {
59193                             errorService.postUpdate(d, function(err, error) {
59194                                 dispatch$1.call('change', error);
59195                             });
59196                         }
59197                     });
59198
59199                 buttonSection.select('.close-button')
59200                     .text(function(d) {
59201                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59202                         return t('QA.keepRight.close' + andComment);
59203                     })
59204                     .on('click.close', function(d) {
59205                         this.blur();    // avoid keeping focus on the button - #4641
59206                         var errorService = services$1.improveOSM;
59207                         if (errorService) {
59208                             d.newStatus = 'SOLVED';
59209                             errorService.postUpdate(d, function(err, error) {
59210                                 dispatch$1.call('change', error);
59211                             });
59212                         }
59213                     });
59214
59215                 buttonSection.select('.ignore-button')
59216                     .text(function(d) {
59217                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59218                         return t('QA.keepRight.ignore' + andComment);
59219                     })
59220                     .on('click.ignore', function(d) {
59221                         this.blur();    // avoid keeping focus on the button - #4641
59222                         var errorService = services$1.improveOSM;
59223                         if (errorService) {
59224                             d.newStatus = 'INVALID';
59225                             errorService.postUpdate(d, function(err, error) {
59226                                 dispatch$1.call('change', error);
59227                             });
59228                         }
59229                     });
59230             }
59231
59232             improveOsmEditor.error = function(val) {
59233                 if (!arguments.length) return _error;
59234                 _error = val;
59235                 return improveOsmEditor;
59236             };
59237
59238
59239             return utilRebind(improveOsmEditor, dispatch$1, 'on');
59240         }
59241
59242         function uiKeepRightDetails(context) {
59243             var _error;
59244
59245
59246             function errorDetail(d) {
59247                 var unknown = t('inspector.unknown');
59248
59249                 if (!d) return unknown;
59250                 var errorType = d.error_type;
59251                 var parentErrorType = d.parent_error_type;
59252
59253                 var et = en.QA.keepRight.errorTypes[errorType];
59254                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59255
59256                 var detail;
59257                 if (et && et.description) {
59258                     detail = t('QA.keepRight.errorTypes.' + errorType + '.description', d.replacements);
59259                 } else if (pt && pt.description) {
59260                     detail = t('QA.keepRight.errorTypes.' + parentErrorType + '.description', d.replacements);
59261                 } else {
59262                     detail = unknown;
59263                 }
59264
59265                 return detail;
59266             }
59267
59268
59269             function keepRightDetails(selection) {
59270                 var details = selection.selectAll('.error-details')
59271                     .data(
59272                         (_error ? [_error] : []),
59273                         function(d) { return d.id + '-' + (d.status || 0); }
59274                     );
59275
59276                 details.exit()
59277                     .remove();
59278
59279                 var detailsEnter = details.enter()
59280                     .append('div')
59281                     .attr('class', 'error-details error-details-container');
59282
59283
59284                 // description
59285                 var descriptionEnter = detailsEnter
59286                     .append('div')
59287                     .attr('class', 'error-details-description');
59288
59289                 descriptionEnter
59290                     .append('h4')
59291                     .text(function() { return t('QA.keepRight.detail_description'); });
59292
59293                 descriptionEnter
59294                     .append('div')
59295                     .attr('class', 'error-details-description-text')
59296                     .html(errorDetail);
59297
59298                 // If there are entity links in the error message..
59299                 var relatedEntities = [];
59300                 descriptionEnter.selectAll('.error_entity_link, .error_object_link')
59301                     .each(function() {
59302                         var link = d3_select(this);
59303                         var isObjectLink = link.classed('error_object_link');
59304                         var entityID = isObjectLink ?
59305                             (utilEntityRoot(_error.object_type) + _error.object_id)
59306                             : this.textContent;
59307                         var entity = context.hasEntity(entityID);
59308
59309                         relatedEntities.push(entityID);
59310
59311                         // Add click handler
59312                         link
59313                             .on('mouseover', function() {
59314                                 context.surface().selectAll(utilEntityOrMemberSelector([entityID], context.graph()))
59315                                     .classed('hover', true);
59316                             })
59317                             .on('mouseout', function() {
59318                                 context.surface().selectAll('.hover')
59319                                     .classed('hover', false);
59320                             })
59321                             .on('click', function() {
59322                                 event.preventDefault();
59323                                 var osmlayer = context.layers().layer('osm');
59324                                 if (!osmlayer.enabled()) {
59325                                     osmlayer.enabled(true);
59326                                 }
59327
59328                                 context.map().centerZoomEase(_error.loc, 20);
59329
59330                                 if (entity) {
59331                                     context.enter(modeSelect(context, [entityID]));
59332                                 } else {
59333                                     context.loadEntity(entityID, function() {
59334                                         context.enter(modeSelect(context, [entityID]));
59335                                     });
59336                                 }
59337                             });
59338
59339                         // Replace with friendly name if possible
59340                         // (The entity may not yet be loaded into the graph)
59341                         if (entity) {
59342                             var name = utilDisplayName(entity);  // try to use common name
59343
59344                             if (!name && !isObjectLink) {
59345                                 var preset = context.presets().match(entity, context.graph());
59346                                 name = preset && !preset.isFallback() && preset.name();  // fallback to preset name
59347                             }
59348
59349                             if (name) {
59350                                 this.innerText = name;
59351                             }
59352                         }
59353                     });
59354
59355                 // Don't hide entities related to this error - #5880
59356                 context.features().forceVisible(relatedEntities);
59357             }
59358
59359
59360             keepRightDetails.error = function(val) {
59361                 if (!arguments.length) return _error;
59362                 _error = val;
59363                 return keepRightDetails;
59364             };
59365
59366
59367             return keepRightDetails;
59368         }
59369
59370         function uiKeepRightHeader() {
59371             var _error;
59372
59373
59374             function errorTitle(d) {
59375                 var unknown = t('inspector.unknown');
59376
59377                 if (!d) return unknown;
59378                 var errorType = d.error_type;
59379                 var parentErrorType = d.parent_error_type;
59380
59381                 var et = en.QA.keepRight.errorTypes[errorType];
59382                 var pt = en.QA.keepRight.errorTypes[parentErrorType];
59383
59384                 if (et && et.title) {
59385                     return t('QA.keepRight.errorTypes.' + errorType + '.title');
59386                 } else if (pt && pt.title) {
59387                     return t('QA.keepRight.errorTypes.' + parentErrorType + '.title');
59388                 } else {
59389                     return unknown;
59390                 }
59391             }
59392
59393
59394             function keepRightHeader(selection) {
59395                 var header = selection.selectAll('.error-header')
59396                     .data(
59397                         (_error ? [_error] : []),
59398                         function(d) { return d.id + '-' + (d.status || 0); }
59399                     );
59400
59401                 header.exit()
59402                     .remove();
59403
59404                 var headerEnter = header.enter()
59405                     .append('div')
59406                     .attr('class', 'error-header');
59407
59408                 var iconEnter = headerEnter
59409                     .append('div')
59410                     .attr('class', 'error-header-icon')
59411                     .classed('new', function(d) { return d.id < 0; });
59412
59413                 iconEnter
59414                     .append('div')
59415                     .attr('class', function(d) {
59416                         return 'preset-icon-28 qa_error ' + d.service + ' error_id-' + d.id + ' error_type-' + d.parent_error_type;
59417                     })
59418                     .call(svgIcon('#iD-icon-bolt', 'qa_error-fill'));
59419
59420                 headerEnter
59421                     .append('div')
59422                     .attr('class', 'error-header-label')
59423                     .text(errorTitle);
59424             }
59425
59426
59427             keepRightHeader.error = function(val) {
59428                 if (!arguments.length) return _error;
59429                 _error = val;
59430                 return keepRightHeader;
59431             };
59432
59433
59434             return keepRightHeader;
59435         }
59436
59437         function uiViewOnKeepRight() {
59438             var _error;   // a keepright error
59439
59440
59441             function viewOnKeepRight(selection) {
59442                 var url;
59443                 if (services$1.keepRight && (_error instanceof qaError)) {
59444                     url = services$1.keepRight.errorURL(_error);
59445                 }
59446
59447                 var link = selection.selectAll('.view-on-keepRight')
59448                     .data(url ? [url] : []);
59449
59450                 // exit
59451                 link.exit()
59452                     .remove();
59453
59454                 // enter
59455                 var linkEnter = link.enter()
59456                     .append('a')
59457                     .attr('class', 'view-on-keepRight')
59458                     .attr('target', '_blank')
59459                     .attr('href', function(d) { return d; })
59460                     .call(svgIcon('#iD-icon-out-link', 'inline'));
59461
59462                 linkEnter
59463                     .append('span')
59464                     .text(t('inspector.view_on_keepRight'));
59465             }
59466
59467
59468             viewOnKeepRight.what = function(val) {
59469                 if (!arguments.length) return _error;
59470                 _error = val;
59471                 return viewOnKeepRight;
59472             };
59473
59474             return viewOnKeepRight;
59475         }
59476
59477         function uiKeepRightEditor(context) {
59478             var dispatch$1 = dispatch('change');
59479             var keepRightDetails = uiKeepRightDetails(context);
59480             var keepRightHeader = uiKeepRightHeader(context);
59481             var quickLinks = uiQuickLinks();
59482
59483             var _error;
59484
59485
59486             function keepRightEditor(selection) {
59487                 // quick links
59488                 var choices = [{
59489                     id: 'zoom_to',
59490                     label: 'inspector.zoom_to.title',
59491                     tooltip: function() {
59492                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_issue'), t('inspector.zoom_to.key'));
59493                     },
59494                     click: function zoomTo() {
59495                         context.mode().zoomToSelected();
59496                     }
59497                 }];
59498
59499
59500                 var header = selection.selectAll('.header')
59501                     .data([0]);
59502
59503                 var headerEnter = header.enter()
59504                     .append('div')
59505                     .attr('class', 'header fillL');
59506
59507                 headerEnter
59508                     .append('button')
59509                     .attr('class', 'fr error-editor-close')
59510                     .on('click', function() {
59511                         context.enter(modeBrowse(context));
59512                     })
59513                     .call(svgIcon('#iD-icon-close'));
59514
59515                 headerEnter
59516                     .append('h3')
59517                     .text(t('QA.keepRight.title'));
59518
59519
59520                 var body = selection.selectAll('.body')
59521                     .data([0]);
59522
59523                 body = body.enter()
59524                     .append('div')
59525                     .attr('class', 'body')
59526                     .merge(body);
59527
59528                 var editor = body.selectAll('.error-editor')
59529                     .data([0]);
59530
59531                 editor.enter()
59532                     .append('div')
59533                     .attr('class', 'modal-section error-editor')
59534                     .merge(editor)
59535                     .call(keepRightHeader.error(_error))
59536                     .call(quickLinks.choices(choices))
59537                     .call(keepRightDetails.error(_error))
59538                     .call(keepRightSaveSection);
59539
59540
59541                 var footer = selection.selectAll('.footer')
59542                     .data([0]);
59543
59544                 footer.enter()
59545                     .append('div')
59546                     .attr('class', 'footer')
59547                     .merge(footer)
59548                     .call(uiViewOnKeepRight(context).what(_error));
59549             }
59550
59551
59552             function keepRightSaveSection(selection) {
59553                 var isSelected = (_error && _error.id === context.selectedErrorID());
59554                 var isShown = (_error && (isSelected || _error.newComment || _error.comment));
59555                 var saveSection = selection.selectAll('.error-save')
59556                     .data(
59557                         (isShown ? [_error] : []),
59558                         function(d) { return d.id + '-' + (d.status || 0); }
59559                     );
59560
59561                 // exit
59562                 saveSection.exit()
59563                     .remove();
59564
59565                 // enter
59566                 var saveSectionEnter = saveSection.enter()
59567                     .append('div')
59568                     .attr('class', 'error-save save-section cf');
59569
59570                 saveSectionEnter
59571                     .append('h4')
59572                     .attr('class', '.error-save-header')
59573                     .text(t('QA.keepRight.comment'));
59574
59575                 saveSectionEnter
59576                     .append('textarea')
59577                     .attr('class', 'new-comment-input')
59578                     .attr('placeholder', t('QA.keepRight.comment_placeholder'))
59579                     .attr('maxlength', 1000)
59580                     .property('value', function(d) { return d.newComment || d.comment; })
59581                     .call(utilNoAuto)
59582                     .on('input', changeInput)
59583                     .on('blur', changeInput);
59584
59585                 // update
59586                 saveSection = saveSectionEnter
59587                     .merge(saveSection)
59588                     .call(keepRightSaveButtons);
59589
59590
59591                 function changeInput() {
59592                     var input = d3_select(this);
59593                     var val = input.property('value').trim();
59594
59595                     if (val === _error.comment) {
59596                         val = undefined;
59597                     }
59598
59599                     // store the unsaved comment with the error itself
59600                     _error = _error.update({ newComment: val });
59601
59602                     var keepRight = services$1.keepRight;
59603                     if (keepRight) {
59604                         keepRight.replaceError(_error);  // update keepright cache
59605                     }
59606
59607                     saveSection
59608                         .call(keepRightSaveButtons);
59609                 }
59610             }
59611
59612
59613             function keepRightSaveButtons(selection) {
59614                 var isSelected = (_error && _error.id === context.selectedErrorID());
59615                 var buttonSection = selection.selectAll('.buttons')
59616                     .data((isSelected ? [_error] : []), function(d) { return d.status + d.id; });
59617
59618                 // exit
59619                 buttonSection.exit()
59620                     .remove();
59621
59622                 // enter
59623                 var buttonEnter = buttonSection.enter()
59624                     .append('div')
59625                     .attr('class', 'buttons');
59626
59627                 buttonEnter
59628                     .append('button')
59629                     .attr('class', 'button comment-button action')
59630                     .text(t('QA.keepRight.save_comment'));
59631
59632                 buttonEnter
59633                     .append('button')
59634                     .attr('class', 'button close-button action');
59635
59636                 buttonEnter
59637                     .append('button')
59638                     .attr('class', 'button ignore-button action');
59639
59640
59641                 // update
59642                 buttonSection = buttonSection
59643                     .merge(buttonEnter);
59644
59645                 buttonSection.select('.comment-button')   // select and propagate data
59646                     .attr('disabled', function(d) {
59647                         return d.newComment === undefined ? true : null;
59648                     })
59649                     .on('click.comment', function(d) {
59650                         this.blur();    // avoid keeping focus on the button - #4641
59651                         var keepRight = services$1.keepRight;
59652                         if (keepRight) {
59653                             keepRight.postKeepRightUpdate(d, function(err, error) {
59654                                 dispatch$1.call('change', error);
59655                             });
59656                         }
59657                     });
59658
59659                 buttonSection.select('.close-button')   // select and propagate data
59660                     .text(function(d) {
59661                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59662                         return t('QA.keepRight.close' + andComment);
59663                     })
59664                     .on('click.close', function(d) {
59665                         this.blur();    // avoid keeping focus on the button - #4641
59666                         var keepRight = services$1.keepRight;
59667                         if (keepRight) {
59668                             d.state = 'ignore_t';   // ignore temporarily (error fixed)
59669                             keepRight.postKeepRightUpdate(d, function(err, error) {
59670                                 dispatch$1.call('change', error);
59671                             });
59672                         }
59673                     });
59674
59675                 buttonSection.select('.ignore-button')   // select and propagate data
59676                     .text(function(d) {
59677                         var andComment = (d.newComment !== undefined ? '_comment' : '');
59678                         return t('QA.keepRight.ignore' + andComment);
59679                     })
59680                     .on('click.ignore', function(d) {
59681                         this.blur();    // avoid keeping focus on the button - #4641
59682                         var keepRight = services$1.keepRight;
59683                         if (keepRight) {
59684                             d.state = 'ignore';   // ignore permanently (false positive)
59685                             keepRight.postKeepRightUpdate(d, function(err, error) {
59686                                 dispatch$1.call('change', error);
59687                             });
59688                         }
59689                     });
59690             }
59691
59692
59693             keepRightEditor.error = function(val) {
59694                 if (!arguments.length) return _error;
59695                 _error = val;
59696                 return keepRightEditor;
59697             };
59698
59699
59700             return utilRebind(keepRightEditor, dispatch$1, 'on');
59701         }
59702
59703         function modeSelectError(context, selectedErrorID, selectedErrorService) {
59704             var mode = {
59705                 id: 'select-error',
59706                 button: 'browse'
59707             };
59708
59709             var keybinding = utilKeybinding('select-error');
59710
59711             var errorService = services$1[selectedErrorService];
59712             var errorEditor;
59713             switch (selectedErrorService) {
59714                 case 'improveOSM':
59715                     errorEditor = uiImproveOsmEditor(context)
59716                     .on('change', function() {
59717                         context.map().pan([0,0]);  // trigger a redraw
59718                         var error = checkSelectedID();
59719                         if (!error) return;
59720                         context.ui().sidebar
59721                             .show(errorEditor.error(error));
59722                     });
59723                     break;
59724                 case 'keepRight':
59725                     errorEditor = uiKeepRightEditor(context)
59726                     .on('change', function() {
59727                         context.map().pan([0,0]);  // trigger a redraw
59728                         var error = checkSelectedID();
59729                         if (!error) return;
59730                         context.ui().sidebar
59731                             .show(errorEditor.error(error));
59732                     });
59733                     break;
59734             }
59735
59736
59737             var behaviors = [
59738                 behaviorBreathe(context),
59739                 behaviorHover(context),
59740                 behaviorSelect(context),
59741                 behaviorLasso(context),
59742                 modeDragNode(context).behavior,
59743                 modeDragNote(context).behavior
59744             ];
59745
59746
59747             function checkSelectedID() {
59748                 if (!errorService) return;
59749                 var error = errorService.getError(selectedErrorID);
59750                 if (!error) {
59751                     context.enter(modeBrowse(context));
59752                 }
59753                 return error;
59754             }
59755
59756
59757             mode.zoomToSelected = function() {
59758                 if (!errorService) return;
59759                 var error = errorService.getError(selectedErrorID);
59760                 if (error) {
59761                     context.map().centerZoomEase(error.loc, 20);
59762                 }
59763             };
59764
59765
59766             mode.enter = function() {
59767                 var error = checkSelectedID();
59768                 if (!error) return;
59769
59770                 behaviors.forEach(context.install);
59771                 keybinding
59772                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
59773                     .on('⎋', esc, true);
59774
59775                 d3_select(document)
59776                     .call(keybinding);
59777
59778                 selectError();
59779
59780                 var sidebar = context.ui().sidebar;
59781                 sidebar.show(errorEditor.error(error));
59782
59783                 context.map()
59784                     .on('drawn.select-error', selectError);
59785
59786
59787                 // class the error as selected, or return to browse mode if the error is gone
59788                 function selectError(drawn) {
59789                     if (!checkSelectedID()) return;
59790
59791                     var selection = context.surface()
59792                         .selectAll('.error_id-' + selectedErrorID + '.' + selectedErrorService);
59793
59794                     if (selection.empty()) {
59795                         // Return to browse mode if selected DOM elements have
59796                         // disappeared because the user moved them out of view..
59797                         var source = event && event.type === 'zoom' && event.sourceEvent;
59798                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
59799                             context.enter(modeBrowse(context));
59800                         }
59801
59802                     } else {
59803                         selection
59804                             .classed('selected', true);
59805
59806                         context.selectedErrorID(selectedErrorID);
59807                     }
59808                 }
59809
59810                 function esc() {
59811                     if (d3_select('.combobox').size()) return;
59812                     context.enter(modeBrowse(context));
59813                 }
59814             };
59815
59816
59817             mode.exit = function() {
59818                 behaviors.forEach(context.uninstall);
59819
59820                 d3_select(document)
59821                     .call(keybinding.unbind);
59822
59823                 context.surface()
59824                     .selectAll('.qa_error.selected')
59825                     .classed('selected hover', false);
59826
59827                 context.map()
59828                     .on('drawn.select-error', null);
59829
59830                 context.ui().sidebar
59831                     .hide();
59832
59833                 context.selectedErrorID(null);
59834                 context.features().forceVisible([]);
59835             };
59836
59837
59838             return mode;
59839         }
59840
59841         function behaviorSelect(context) {
59842             // legacy option to show menu on every click
59843             var isShowAlways = +context.storage('edit-menu-show-always') === 1;
59844             var tolerance = 4;
59845             var _lastMouse = null;
59846             var _suppressMenu = true;
59847             var _p1 = null;
59848
59849
59850             function point() {
59851                 return d3_mouse(context.container().node());
59852             }
59853
59854
59855             function keydown() {
59856                 var e = event;
59857                 if (e && e.shiftKey) {
59858                     context.surface()
59859                         .classed('behavior-multiselect', true);
59860                 }
59861
59862                 if (e && e.keyCode === 93) {  // context menu
59863                     e.preventDefault();
59864                     e.stopPropagation();
59865                 }
59866             }
59867
59868
59869             function keyup() {
59870                 var e = event;
59871                 if (!e || !e.shiftKey) {
59872                     context.surface()
59873                         .classed('behavior-multiselect', false);
59874                 }
59875
59876
59877                 if (e && e.keyCode === 93) {  // context menu
59878                     e.preventDefault();
59879                     e.stopPropagation();
59880                     contextmenu();
59881                 }
59882             }
59883
59884
59885             function mousedown() {
59886                 if (!_p1) {
59887                     _p1 = point();
59888                 }
59889                 d3_select(window)
59890                     .on('mouseup.select', mouseup, true);
59891
59892                 _suppressMenu = !isShowAlways;
59893             }
59894
59895
59896             function mousemove() {
59897                 if (event) {
59898                     _lastMouse = event;
59899                 }
59900             }
59901
59902
59903             function mouseup() {
59904                 click();
59905             }
59906
59907
59908             function contextmenu() {
59909                 var e = event;
59910                 e.preventDefault();
59911                 e.stopPropagation();
59912
59913                 if (!+e.clientX && !+e.clientY) {
59914                     if (_lastMouse) {
59915                         e.sourceEvent = _lastMouse;
59916                     } else {
59917                         return;
59918                     }
59919                 }
59920
59921                 if (!_p1) {
59922                     _p1 = point();
59923                 }
59924                 _suppressMenu = false;
59925                 click();
59926             }
59927
59928
59929             function click() {
59930                 d3_select(window)
59931                     .on('mouseup.select', null, true);
59932
59933                 if (!_p1) return;
59934                 var p2 = point();
59935                 var dist = geoVecLength(_p1, p2);
59936                 _p1 = null;
59937                 if (dist > tolerance) return;
59938
59939                 // Defer processing the click,
59940                 // because this click may trigger a blur event,
59941                 // and the blur event may trigger a tag change,
59942                 // and we really want that tag change to go to the already selected entity
59943                 // and not the one that we are about to select with the click  #6028, #5878
59944                 // (Be very careful entering modeSelect anywhere that might also blur a field!)
59945                 var datum = event.target.__data__ || (_lastMouse && _lastMouse.target.__data__);
59946                 var isMultiselect = event.shiftKey || d3_select('#surface .lasso').node();
59947                 window.setTimeout(function() {
59948                     processClick(datum, isMultiselect);
59949                 }, 20);  // delay > whatever raw_tag_editor.js `scheduleChange` does (10ms).
59950             }
59951
59952
59953             function processClick(datum, isMultiselect) {
59954                 var mode = context.mode();
59955
59956                 var entity = datum && datum.properties && datum.properties.entity;
59957                 if (entity) datum = entity;
59958
59959                 if (datum && datum.type === 'midpoint') {
59960                     datum = datum.parents[0];
59961                 }
59962
59963                 if (datum instanceof osmEntity) {    // clicked an entity..
59964                     var selectedIDs = context.selectedIDs();
59965                     context.selectedNoteID(null);
59966                     context.selectedErrorID(null);
59967
59968                     if (!isMultiselect) {
59969                         if (selectedIDs.length > 1 && (!_suppressMenu && !isShowAlways)) {
59970                             // multiple things already selected, just show the menu...
59971                             mode.suppressMenu(false).reselect();
59972                         } else {
59973                             // select a single thing..
59974                             context.enter(modeSelect(context, [datum.id]).suppressMenu(_suppressMenu));
59975                         }
59976
59977                     } else {
59978                         if (selectedIDs.indexOf(datum.id) !== -1) {
59979                             // clicked entity is already in the selectedIDs list..
59980                             if (!_suppressMenu && !isShowAlways) {
59981                                 // don't deselect clicked entity, just show the menu.
59982                                 mode.suppressMenu(false).reselect();
59983                             } else {
59984                                 // deselect clicked entity, then reenter select mode or return to browse mode..
59985                                 selectedIDs = selectedIDs.filter(function(id) { return id !== datum.id; });
59986                                 context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
59987                             }
59988                         } else {
59989                             // clicked entity is not in the selected list, add it..
59990                             selectedIDs = selectedIDs.concat([datum.id]);
59991                             context.enter(modeSelect(context, selectedIDs).suppressMenu(_suppressMenu));
59992                         }
59993                     }
59994
59995                 } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
59996                     context
59997                         .selectedNoteID(null)
59998                         .enter(modeSelectData(context, datum));
59999
60000                 } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
60001                     context
60002                         .selectedNoteID(datum.id)
60003                         .enter(modeSelectNote(context, datum.id));
60004
60005                 } else if (datum instanceof qaError & !isMultiselect) {  // clicked an external QA error
60006                     context
60007                         .selectedErrorID(datum.id)
60008                         .enter(modeSelectError(context, datum.id, datum.service));
60009
60010                 } else {    // clicked nothing..
60011                     context.selectedNoteID(null);
60012                     context.selectedErrorID(null);
60013                     if (!isMultiselect && mode.id !== 'browse') {
60014                         context.enter(modeBrowse(context));
60015                     }
60016                 }
60017
60018                 // reset for next time..
60019                 _suppressMenu = true;
60020             }
60021
60022
60023             function behavior(selection) {
60024                 _lastMouse = null;
60025                 _suppressMenu = true;
60026                 _p1 = null;
60027
60028                 d3_select(window)
60029                     .on('keydown.select', keydown)
60030                     .on('keyup.select', keyup)
60031                     .on('contextmenu.select-window', function() {
60032                         // Edge and IE really like to show the contextmenu on the
60033                         // menubar when user presses a keyboard menu button
60034                         // even after we've already preventdefaulted the key event.
60035                         var e = event;
60036                         if (+e.clientX === 0 && +e.clientY === 0) {
60037                             event.preventDefault();
60038                             event.stopPropagation();
60039                         }
60040                     });
60041
60042                 selection
60043                     .on('mousedown.select', mousedown)
60044                     .on('mousemove.select', mousemove)
60045                     .on('contextmenu.select', contextmenu);
60046
60047                 if (event && event.shiftKey) {
60048                     context.surface()
60049                         .classed('behavior-multiselect', true);
60050                 }
60051             }
60052
60053
60054             behavior.off = function(selection) {
60055                 d3_select(window)
60056                     .on('keydown.select', null)
60057                     .on('keyup.select', null)
60058                     .on('contextmenu.select-window', null)
60059                     .on('mouseup.select', null, true);
60060
60061                 selection
60062                     .on('mousedown.select', null)
60063                     .on('mousemove.select', null)
60064                     .on('contextmenu.select', null);
60065
60066                 context.surface()
60067                     .classed('behavior-multiselect', false);
60068             };
60069
60070
60071             return behavior;
60072         }
60073
60074         function behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph) {
60075
60076             var origWay = context.entity(wayID);
60077
60078             var annotation = t((origWay.isDegenerate() ?
60079                 'operations.start.annotation.' :
60080                 'operations.continue.annotation.') + context.geometry(wayID)
60081             );
60082
60083             var behavior = behaviorDraw(context);
60084             behavior.hover().initialNodeID(index ? origWay.nodes[index] :
60085                 (origWay.isClosed() ? origWay.nodes[origWay.nodes.length - 2] : origWay.nodes[origWay.nodes.length - 1]));
60086
60087             var _tempEdits = 0;
60088
60089             var end = osmNode({ loc: context.map().mouseCoordinates() });
60090
60091             // Push an annotated state for undo to return back to.
60092             // We must make sure to remove this edit later.
60093             context.pauseChangeDispatch();
60094             context.perform(actionNoop(), annotation);
60095             _tempEdits++;
60096
60097             // Add the drawing node to the graph.
60098             // We must make sure to remove this edit later.
60099             context.perform(_actionAddDrawNode());
60100             _tempEdits++;
60101             context.resumeChangeDispatch();
60102
60103
60104             function keydown() {
60105                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60106                     if (context.surface().classed('nope')) {
60107                         context.surface()
60108                             .classed('nope-suppressed', true);
60109                     }
60110                     context.surface()
60111                         .classed('nope', false)
60112                         .classed('nope-disabled', true);
60113                 }
60114             }
60115
60116
60117             function keyup() {
60118                 if (event.keyCode === utilKeybinding.modifierCodes.alt) {
60119                     if (context.surface().classed('nope-suppressed')) {
60120                         context.surface()
60121                             .classed('nope', true);
60122                     }
60123                     context.surface()
60124                         .classed('nope-suppressed', false)
60125                         .classed('nope-disabled', false);
60126                 }
60127             }
60128
60129
60130             function allowsVertex(d) {
60131                 return d.geometry(context.graph()) === 'vertex' || context.presets().allowsVertex(d, context.graph());
60132             }
60133
60134
60135             // related code
60136             // - `mode/drag_node.js`     `doMode()`
60137             // - `behavior/draw.js`      `click()`
60138             // - `behavior/draw_way.js`  `move()`
60139             function move(datum) {
60140                 context.surface().classed('nope-disabled', event.altKey);
60141
60142                 var targetLoc = datum && datum.properties && datum.properties.entity && allowsVertex(datum.properties.entity) && datum.properties.entity.loc;
60143                 var targetNodes = datum && datum.properties && datum.properties.nodes;
60144                 var loc = context.map().mouseCoordinates();
60145
60146                 if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
60147                     loc = targetLoc;
60148
60149                 } else if (targetNodes) {   // snap to way - a line target with `.nodes`
60150                     var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
60151                     if (choice) {
60152                         loc = choice.loc;
60153                     }
60154                 }
60155
60156                 context.replace(actionMoveNode(end.id, loc));
60157                 end = context.entity(end.id);
60158                 checkGeometry(false);
60159             }
60160
60161
60162             // Check whether this edit causes the geometry to break.
60163             // If so, class the surface with a nope cursor.
60164             // `finishDraw` - Only checks the relevant line segments if finishing drawing
60165             function checkGeometry(finishDraw) {
60166                 var nopeDisabled = context.surface().classed('nope-disabled');
60167                 var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
60168
60169                 if (nopeDisabled) {
60170                     context.surface()
60171                         .classed('nope', false)
60172                         .classed('nope-suppressed', isInvalid);
60173                 } else {
60174                     context.surface()
60175                         .classed('nope', isInvalid)
60176                         .classed('nope-suppressed', false);
60177                 }
60178             }
60179
60180
60181             function isInvalidGeometry(entity, graph, finishDraw) {
60182                 var parents = graph.parentWays(entity);
60183
60184                 for (var i = 0; i < parents.length; i++) {
60185                     var parent = parents[i];
60186                     var nodes = graph.childNodes(parent).slice();  // shallow copy
60187
60188                     if (origWay.isClosed()) { // Check if Area
60189                         if (finishDraw) {
60190                             if (nodes.length < 3) return false;
60191                             nodes.splice(-2, 1);
60192                             entity = nodes[nodes.length-2];
60193                         } else {
60194                             nodes.pop();
60195                         }
60196                     } else { // Line
60197                         if (finishDraw) {
60198                             nodes.pop();
60199                         }
60200                     }
60201
60202                     if (geoHasSelfIntersections(nodes, entity.id)) {
60203                         return true;
60204                     }
60205                 }
60206
60207                 return false;
60208             }
60209
60210
60211             function undone() {
60212                 context.pauseChangeDispatch();
60213                 // Undo popped the history back to the initial annotated no-op edit.
60214                 _tempEdits = 0;     // We will deal with the temp edits here
60215                 context.pop(1);     // Remove initial no-op edit
60216
60217                 if (context.graph() === baselineGraph) {    // We've undone back to the beginning
60218                     // baselineGraph may be behind startGraph if this way was added rather than continued
60219                     resetToStartGraph();
60220                     context.resumeChangeDispatch();
60221                     context.enter(modeSelect(context, [wayID]));
60222                 } else {
60223                     // Remove whatever segment was drawn previously and continue drawing
60224                     context.pop(1);
60225                     context.resumeChangeDispatch();
60226                     context.enter(mode);
60227                 }
60228             }
60229
60230
60231             function setActiveElements() {
60232                 context.surface().selectAll('.' + end.id)
60233                     .classed('active', true);
60234             }
60235
60236
60237             function resetToStartGraph() {
60238                 while (context.graph() !== startGraph) {
60239                     context.pop();
60240                 }
60241             }
60242
60243
60244             var drawWay = function(surface) {
60245                 behavior
60246                     .on('move', move)
60247                     .on('click', drawWay.add)
60248                     .on('clickWay', drawWay.addWay)
60249                     .on('clickNode', drawWay.addNode)
60250                     .on('undo', context.undo)
60251                     .on('cancel', drawWay.cancel)
60252                     .on('finish', drawWay.finish);
60253
60254                 d3_select(window)
60255                     .on('keydown.drawWay', keydown)
60256                     .on('keyup.drawWay', keyup);
60257
60258                 context.map()
60259                     .dblclickEnable(false)
60260                     .on('drawn.draw', setActiveElements);
60261
60262                 setActiveElements();
60263
60264                 surface.call(behavior);
60265
60266                 context.history()
60267                     .on('undone.draw', undone);
60268             };
60269
60270
60271             drawWay.off = function(surface) {
60272                 // Drawing was interrupted unexpectedly.
60273                 // This can happen if the user changes modes,
60274                 // clicks geolocate button, a hashchange event occurs, etc.
60275                 if (_tempEdits) {
60276                     context.pauseChangeDispatch();
60277                     context.pop(_tempEdits);
60278                     resetToStartGraph();
60279                     context.resumeChangeDispatch();
60280                 }
60281
60282                 context.map()
60283                     .on('drawn.draw', null);
60284
60285                 surface.call(behavior.off)
60286                     .selectAll('.active')
60287                     .classed('active', false);
60288
60289                 surface
60290                     .classed('nope', false)
60291                     .classed('nope-suppressed', false)
60292                     .classed('nope-disabled', false);
60293
60294                 d3_select(window)
60295                     .on('keydown.hover', null)
60296                     .on('keyup.hover', null);
60297
60298                 context.history()
60299                     .on('undone.draw', null);
60300             };
60301
60302
60303             function _actionAddDrawNode() {
60304                 return function(graph) {
60305                     return graph
60306                         .replace(end)
60307                         .replace(origWay.addNode(end.id, index));
60308                 };
60309             }
60310
60311
60312             function _actionReplaceDrawNode(newNode) {
60313                 return function(graph) {
60314                     return graph
60315                         .replace(origWay.addNode(newNode.id, index))
60316                         .remove(end);
60317                 };
60318             }
60319
60320
60321             // Accept the current position of the drawing node and continue drawing.
60322             drawWay.add = function(loc, d) {
60323                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60324                     return;   // can't click here
60325                 }
60326
60327                 context.pauseChangeDispatch();
60328                 context.pop(_tempEdits);
60329                 _tempEdits = 0;
60330
60331                 context.perform(
60332                     _actionAddDrawNode(),
60333                     annotation
60334                 );
60335
60336                 context.resumeChangeDispatch();
60337                 checkGeometry(false);   // finishDraw = false
60338                 context.enter(mode);
60339             };
60340
60341
60342             // Connect the way to an existing way.
60343             drawWay.addWay = function(loc, edge, d) {
60344                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60345                     return;   // can't click here
60346                 }
60347
60348                 context.pauseChangeDispatch();
60349                 context.pop(_tempEdits);
60350                 _tempEdits = 0;
60351
60352                 context.perform(
60353                     _actionAddDrawNode(),
60354                     actionAddMidpoint({ loc: loc, edge: edge }, end),
60355                     annotation
60356                 );
60357
60358                 context.resumeChangeDispatch();
60359                 checkGeometry(false);   // finishDraw = false
60360                 context.enter(mode);
60361             };
60362
60363
60364             // Connect the way to an existing node and continue drawing.
60365             drawWay.addNode = function(node, d) {
60366                 if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
60367                     return;   // can't click here
60368                 }
60369
60370                 context.pauseChangeDispatch();
60371                 context.pop(_tempEdits);
60372                 _tempEdits = 0;
60373
60374                 context.perform(
60375                     _actionReplaceDrawNode(node),
60376                     annotation
60377                 );
60378
60379                 context.resumeChangeDispatch();
60380                 checkGeometry(false);   // finishDraw = false
60381                 context.enter(mode);
60382             };
60383
60384
60385             // Finish the draw operation, removing the temporary edits.
60386             // If the way has enough nodes to be valid, it's selected.
60387             // Otherwise, delete everything and return to browse mode.
60388             drawWay.finish = function() {
60389                 checkGeometry(true);   // finishDraw = true
60390                 if (context.surface().classed('nope')) {
60391                     return;   // can't click here
60392                 }
60393
60394                 context.pauseChangeDispatch();
60395                 context.pop(_tempEdits);
60396                 _tempEdits = 0;
60397
60398                 var way = context.hasEntity(wayID);
60399                 if (!way || way.isDegenerate()) {
60400                     drawWay.cancel();
60401                     return;
60402                 }
60403
60404                 context.resumeChangeDispatch();
60405
60406                 window.setTimeout(function() {
60407                     context.map().dblclickEnable(true);
60408                 }, 1000);
60409
60410                 var isNewFeature = !mode.isContinuing;
60411                 context.enter(modeSelect(context, [wayID]).newFeature(isNewFeature));
60412             };
60413
60414
60415             // Cancel the draw operation, delete everything, and return to browse mode.
60416             drawWay.cancel = function() {
60417                 context.pauseChangeDispatch();
60418                 context.pop(_tempEdits);
60419                 _tempEdits = 0;
60420
60421                 resetToStartGraph();
60422                 context.resumeChangeDispatch();
60423
60424                 window.setTimeout(function() {
60425                     context.map().dblclickEnable(true);
60426                 }, 1000);
60427
60428                 context.surface()
60429                     .classed('nope', false)
60430                     .classed('nope-disabled', false)
60431                     .classed('nope-suppressed', false);
60432
60433                 context.enter(modeBrowse(context));
60434             };
60435
60436
60437             drawWay.activeID = function() {
60438                 if (!arguments.length) return end.id;
60439                 // no assign
60440                 return drawWay;
60441             };
60442
60443
60444             drawWay.tail = function(text) {
60445                 behavior.tail(text);
60446                 return drawWay;
60447             };
60448
60449
60450             return drawWay;
60451         }
60452
60453         function modeDrawLine(context, wayID, startGraph, baselineGraph, button, affix, continuing) {
60454             var mode = {
60455                 button: button,
60456                 id: 'draw-line'
60457             };
60458
60459             var behavior;
60460
60461             mode.wayID = wayID;
60462
60463             mode.isContinuing = continuing;
60464
60465             mode.enter = function() {
60466                 var way = context.entity(wayID);
60467                 var index = (affix === 'prefix') ? 0 : undefined;
60468                 var headID = (affix === 'prefix') ? way.first() : way.last();
60469
60470                 behavior = behaviorDrawWay(context, wayID, index, mode, startGraph, baselineGraph)
60471                     .tail(t('modes.draw_line.tail'));
60472
60473                 var addNode = behavior.addNode;
60474                 behavior.addNode = function(node, d) {
60475                     if (node.id === headID) {
60476                         behavior.finish();
60477                     } else {
60478                         addNode(node, d);
60479                     }
60480                 };
60481
60482                 context.install(behavior);
60483             };
60484
60485
60486             mode.exit = function() {
60487                 context.uninstall(behavior);
60488             };
60489
60490
60491             mode.selectedIDs = function() {
60492                 return [wayID];
60493             };
60494
60495
60496             mode.activeID = function() {
60497                 return (behavior && behavior.activeID()) || [];
60498             };
60499
60500             return mode;
60501         }
60502
60503         function operationContinue(selectedIDs, context) {
60504             var graph = context.graph();
60505             var entities = selectedIDs.map(function(id) { return graph.entity(id); });
60506             var geometries = Object.assign(
60507                 { line: [], vertex: [] },
60508                 utilArrayGroupBy(entities, function(entity) { return entity.geometry(graph); })
60509             );
60510             var vertex = geometries.vertex[0];
60511
60512
60513             function candidateWays() {
60514                 return graph.parentWays(vertex).filter(function(parent) {
60515                     return parent.geometry(graph) === 'line' &&
60516                         !parent.isClosed() &&
60517                         parent.affix(vertex.id) &&
60518                         (geometries.line.length === 0 || geometries.line[0] === parent);
60519                 });
60520             }
60521
60522
60523             var operation = function() {
60524                 var candidate = candidateWays()[0];
60525                 context.enter(
60526                     modeDrawLine(context, candidate.id, context.graph(), context.graph(), 'line', candidate.affix(vertex.id), true)
60527                 );
60528             };
60529
60530
60531             operation.available = function() {
60532                 return geometries.vertex.length === 1 &&
60533                     geometries.line.length <= 1 &&
60534                     !context.features().hasHiddenConnections(vertex, context.graph());
60535             };
60536
60537
60538             operation.disabled = function() {
60539                 var candidates = candidateWays();
60540                 if (candidates.length === 0) {
60541                     return 'not_eligible';
60542                 } else if (candidates.length > 1) {
60543                     return 'multiple';
60544                 }
60545
60546                 return false;
60547             };
60548
60549
60550             operation.tooltip = function() {
60551                 var disable = operation.disabled();
60552                 return disable ?
60553                     t('operations.continue.' + disable) :
60554                     t('operations.continue.description');
60555             };
60556
60557
60558             operation.annotation = function() {
60559                 return t('operations.continue.annotation.line');
60560             };
60561
60562
60563             operation.id = 'continue';
60564             operation.keys = [t('operations.continue.key')];
60565             operation.title = t('operations.continue.title');
60566             operation.behavior = behaviorOperation(context).which(operation);
60567
60568             return operation;
60569         }
60570
60571         function operationDisconnect(selectedIDs, context) {
60572             var vertexIDs = [];
60573             var wayIDs = [];
60574             var otherIDs = [];
60575             var actions = [];
60576
60577             selectedIDs.forEach(function(id) {
60578                 if (context.geometry(id) === 'vertex') {
60579                     vertexIDs.push(id);
60580                 } else if (context.entity(id).type === 'way'){
60581                     wayIDs.push(id);
60582                 } else {
60583                     otherIDs.push(id);
60584                 }
60585             });
60586
60587             var disconnectingWayID = (vertexIDs.length === 0 && wayIDs.length === 1 && wayIDs[0]);
60588             var extent, nodes, coords;
60589
60590             if (disconnectingWayID) {   // disconnecting a way
60591                 var way = context.entity(disconnectingWayID);
60592                 extent = way.extent(context.graph());
60593                 nodes = utilGetAllNodes([disconnectingWayID], context.graph());
60594                 coords = nodes.map(function(n) { return n.loc; });
60595
60596                 way.nodes.forEach(function(vertexID) {
60597                     var action = actionDisconnect(vertexID).limitWays(wayIDs);
60598                     if (action.disabled(context.graph()) !== 'not_connected') {
60599                         actions.push(action);
60600                     }
60601                 });
60602
60603             } else {    // disconnecting a vertex
60604                 vertexIDs.forEach(function(vertexID) {
60605                     var action = actionDisconnect(vertexID);
60606
60607                     if (wayIDs.length > 0) {
60608                         var waysIDsForVertex = wayIDs.filter(function(wayID) {
60609                             var way = context.entity(wayID);
60610                             return way.nodes.indexOf(vertexID) !== -1;
60611                         });
60612                         action.limitWays(waysIDsForVertex);
60613                     }
60614                     actions.push(action);
60615                 });
60616             }
60617
60618
60619             var operation = function() {
60620                 context.perform(function(graph) {
60621                     return actions.reduce(function(graph, action) { return action(graph); }, graph);
60622                 }, operation.annotation());
60623
60624                 context.validator().validate();
60625             };
60626
60627
60628             operation.available = function() {
60629                 if (actions.length === 0) return false;
60630                 if (otherIDs.length !== 0) return false;
60631
60632                 if (vertexIDs.length !== 0 && wayIDs.length !== 0 && !wayIDs.every(function(wayID) {
60633                     return vertexIDs.some(function(vertexID) {
60634                         var way = context.entity(wayID);
60635                         return way.nodes.indexOf(vertexID) !== -1;
60636                     });
60637                 })) return false;
60638
60639                 return true;
60640             };
60641
60642
60643             operation.disabled = function() {
60644                 var reason;
60645                 for (var actionIndex in actions) {
60646                     reason = actions[actionIndex].disabled(context.graph());
60647                     if (reason) return reason;
60648                 }
60649
60650                 if (disconnectingWayID && extent.percentContainedIn(context.extent()) < 0.8) {
60651                     return 'too_large.single';
60652                 } else if (disconnectingWayID && someMissing()) {
60653                     return 'not_downloaded';
60654                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
60655                     return 'connected_to_hidden';
60656                 }
60657
60658                 return false;
60659
60660
60661                 function someMissing() {
60662                     if (context.inIntro()) return false;
60663                     var osm = context.connection();
60664                     if (osm) {
60665                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
60666                         if (missing.length) {
60667                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
60668                             return true;
60669                         }
60670                     }
60671                     return false;
60672                 }
60673             };
60674
60675
60676             operation.tooltip = function() {
60677                 var disable = operation.disabled();
60678                 if (disable) {
60679                     return t('operations.disconnect.' + disable);
60680                 }
60681                 if (disconnectingWayID) {
60682                     return t('operations.disconnect.' + context.geometry(disconnectingWayID) + '.description');
60683                 }
60684                 return t('operations.disconnect.description');
60685             };
60686
60687
60688             operation.annotation = function() {
60689                 return t('operations.disconnect.annotation');
60690             };
60691
60692
60693             operation.id = 'disconnect';
60694             operation.keys = [t('operations.disconnect.key')];
60695             operation.title = t('operations.disconnect.title');
60696             operation.behavior = behaviorOperation(context).which(operation);
60697
60698             return operation;
60699         }
60700
60701         function operationDowngrade(selectedIDs, context) {
60702             var affectedFeatureCount = 0;
60703             var downgradeType;
60704
60705             setDowngradeTypeForEntityIDs();
60706
60707             var multi = affectedFeatureCount === 1 ? 'single' : 'multiple';
60708
60709             function setDowngradeTypeForEntityIDs() {
60710                 for (var i in selectedIDs) {
60711                     var entityID = selectedIDs[i];
60712                     var type = downgradeTypeForEntityID(entityID);
60713                     if (type) {
60714                         affectedFeatureCount += 1;
60715                         if (downgradeType && type !== downgradeType) {
60716                             downgradeType = 'building_address';
60717                         } else {
60718                             downgradeType = type;
60719                         }
60720                     }
60721                 }
60722             }
60723
60724             function downgradeTypeForEntityID(entityID) {
60725                 var graph = context.graph();
60726                 var entity = graph.entity(entityID);
60727                 var preset = context.presets().match(entity, graph);
60728
60729                 if (preset.isFallback()) return null;
60730
60731                 if (entity.type === 'node' &&
60732                     preset.id !== 'address' &&
60733                     Object.keys(entity.tags).some(function(key) {
60734                         return key.match(/^addr:.{1,}/);
60735                     })) {
60736
60737                     return 'address';
60738                 }
60739                 if (entity.geometry(graph) === 'area' &&
60740                     entity.tags.building &&
60741                     !preset.tags.building) {
60742
60743                     return 'building';
60744                 }
60745
60746                 return null;
60747             }
60748
60749             var buildingKeysToKeep = ['architect', 'building', 'height', 'layer', 'source', 'type', 'wheelchair'];
60750             var addressKeysToKeep = ['source'];
60751
60752             var operation = function () {
60753                 context.perform(function(graph) {
60754
60755                     for (var i in selectedIDs) {
60756                         var entityID = selectedIDs[i];
60757                         var type = downgradeTypeForEntityID(entityID);
60758                         if (!type) continue;
60759
60760                         var tags = Object.assign({}, graph.entity(entityID).tags);  // shallow copy
60761                         for (var key in tags) {
60762                             if (type === 'address' && addressKeysToKeep.indexOf(key) !== -1) continue;
60763                             if (type === 'building') {
60764                                 if (buildingKeysToKeep.indexOf(key) !== -1 ||
60765                                     key.match(/^building:.{1,}/) ||
60766                                     key.match(/^roof:.{1,}/)) continue;
60767                             }
60768                             // keep address tags for buildings too
60769                             if (key.match(/^addr:.{1,}/)) continue;
60770
60771                             delete tags[key];
60772                         }
60773                         graph = actionChangeTags(entityID, tags)(graph);
60774                     }
60775                     return graph;
60776                 }, operation.annotation());
60777
60778                 context.validator().validate();
60779
60780                 // refresh the select mode to enable the delete operation
60781                 context.enter(modeSelect(context, selectedIDs));
60782             };
60783
60784
60785             operation.available = function () {
60786                 return downgradeType;
60787             };
60788
60789
60790             operation.disabled = function () {
60791                 if (selectedIDs.some(hasWikidataTag)) {
60792                     return 'has_wikidata_tag';
60793                 }
60794                 return false;
60795
60796                 function hasWikidataTag(id) {
60797                     var entity = context.entity(id);
60798                     return entity.tags.wikidata && entity.tags.wikidata.trim().length > 0;
60799                 }
60800             };
60801
60802
60803             operation.tooltip = function () {
60804                 var disable = operation.disabled();
60805                 return disable ?
60806                     t('operations.downgrade.' + disable + '.' + multi) :
60807                     t('operations.downgrade.description.' + downgradeType);
60808             };
60809
60810
60811             operation.annotation = function () {
60812                 var suffix;
60813                 if (downgradeType === 'building_address') {
60814                     suffix = 'multiple';
60815                 } else {
60816                     suffix = downgradeType + '.' + multi;
60817                 }
60818                 return t('operations.downgrade.annotation.' + suffix, { n: affectedFeatureCount});
60819             };
60820
60821
60822             operation.id = 'downgrade';
60823             operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
60824             operation.title = t('operations.downgrade.title');
60825             operation.behavior = behaviorOperation(context).which(operation);
60826
60827
60828             return operation;
60829         }
60830
60831         function operationExtract(selectedIDs, context) {
60832             var entityID = selectedIDs.length && selectedIDs[0];
60833             var action = actionExtract(entityID, context.projection);
60834
60835             var geometry = entityID && context.geometry(entityID);
60836             var extent = geometry === 'area' && context.entity(entityID).extent(context.graph());
60837
60838
60839             var operation = function () {
60840                 context.perform(action);  // do the extract
60841                 context.validator().validate();
60842
60843                 var extractedNodeID = action.getExtractedNodeID();
60844
60845                 var mouse = context.map().mouseCoordinates();
60846                 if (mouse.some(isNaN)) {
60847                     enterMoveMode();
60848
60849                 } else {
60850                     // move detached node to the mouse location (transitioned)
60851                     context.perform(actionMoveNode(extractedNodeID, mouse));
60852
60853                     // after transition completes, put at final mouse location and enter move mode.
60854                     window.setTimeout(function() {
60855                         mouse = context.map().mouseCoordinates();
60856                         context.replace(actionMoveNode(extractedNodeID, mouse));
60857                         enterMoveMode();
60858                     }, 150);
60859                 }
60860
60861                 function enterMoveMode() {
60862                     var baseGraph = context.graph();
60863                     context.enter(modeMove(context, [extractedNodeID], baseGraph));
60864                 }
60865             };
60866
60867
60868             operation.available = function () {
60869                 if (selectedIDs.length !== 1) return false;
60870
60871                 var graph = context.graph();
60872                 var entity = graph.hasEntity(entityID);
60873                 if (!entity) return false;
60874
60875                 if (!entity.hasInterestingTags()) return false;
60876
60877                 if (geometry === 'area') {
60878                     var preset = context.presets().match(entity, graph);
60879                     return preset.geometry.indexOf('point') !== -1;
60880                 }
60881
60882                 return entity.type === 'node' && graph.parentWays(entity).length > 0;
60883             };
60884
60885
60886             operation.disabled = function () {
60887                 var reason = action.disabled(context.graph());
60888                 if (reason) {
60889                     return reason;
60890                 } else if (geometry === 'vertex' && selectedIDs.some(context.hasHiddenConnections)) {
60891                     return 'connected_to_hidden';
60892                 } else if (extent && extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
60893                     return 'too_large';
60894                 }
60895
60896                 return false;
60897             };
60898
60899
60900             operation.tooltip = function () {
60901                 var disableReason = operation.disabled();
60902                 if (disableReason) {
60903                     return t('operations.extract.' + disableReason + '.' + geometry + '.single',
60904                         { relation: context.presets().item('type/restriction').name() });
60905                 } else {
60906                     return t('operations.extract.description.' + geometry + '.single');
60907                 }
60908             };
60909
60910
60911             operation.annotation = function () {
60912                 return t('operations.extract.annotation.single');
60913             };
60914
60915
60916             operation.id = 'extract';
60917             operation.keys = [t('operations.extract.key')];
60918             operation.title = t('operations.extract.title');
60919             operation.behavior = behaviorOperation(context).which(operation);
60920
60921
60922             return operation;
60923         }
60924
60925         function operationMerge(selectedIDs, context) {
60926
60927             function updatePresetTags(newGraph, ids) {
60928                 var id = ids[0];
60929                 var newEntity = newGraph.hasEntity(id);
60930
60931                 if (!newEntity) return;
60932                 var newPreset = context.presets().match(newEntity, newGraph);
60933                 context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
60934             }
60935
60936
60937             var join = actionJoin(selectedIDs);
60938             var merge = actionMerge(selectedIDs);
60939             var mergePolygon = actionMergePolygon(selectedIDs);
60940             var mergeNodes = actionMergeNodes(selectedIDs);
60941
60942
60943             var operation = function() {
60944                 var doUpdateTags;
60945                 var action;
60946
60947                 if (!join.disabled(context.graph())) {
60948                     doUpdateTags = false;
60949                     action = join;
60950                 } else if (!merge.disabled(context.graph())) {
60951                     doUpdateTags = true;
60952                     action = merge;
60953                 } else if (!mergePolygon.disabled(context.graph())) {
60954                     doUpdateTags = false;
60955                     action = mergePolygon;
60956                 } else {
60957                     doUpdateTags = true;
60958                     action = mergeNodes;
60959                 }
60960
60961                 context.perform(action, operation.annotation());
60962
60963                 var ids = selectedIDs.filter(function(id) {
60964                     var entity = context.hasEntity(id);
60965                     return entity && entity.type !== 'node';
60966                 });
60967
60968                 // if we merged tags, rematch preset to update tags if necessary (#3851)
60969                 if (doUpdateTags) {
60970                     updatePresetTags(context.graph(), ids);
60971                 }
60972
60973                 context.validator().validate();
60974                 context.enter(modeSelect(context, ids));
60975             };
60976
60977
60978             operation.available = function() {
60979                 return selectedIDs.length >= 2;
60980             };
60981
60982
60983             operation.disabled = function() {
60984                 return join.disabled(context.graph()) &&
60985                     merge.disabled(context.graph()) &&
60986                     mergePolygon.disabled(context.graph()) &&
60987                     mergeNodes.disabled(context.graph());
60988             };
60989
60990
60991             operation.tooltip = function() {
60992                 var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
60993                 var m = merge.disabled(context.graph());         // 'not_eligible'
60994                 var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
60995                 var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
60996
60997                 // disabled for one of various reasons
60998                 if (j && m && p && n) {
60999                     if (j === 'restriction' || n === 'restriction') {
61000                         return t('operations.merge.restriction',
61001                             { relation: context.presets().item('type/restriction').name() });
61002
61003                     } else if (p === 'incomplete_relation') {
61004                         return t('operations.merge.incomplete_relation');
61005
61006                     } else if (n === 'relation') {
61007                         return t('operations.merge.relation');
61008
61009                     } else {
61010                         return t('operations.merge.' + j);
61011                     }
61012
61013                 } else {
61014                     return t('operations.merge.description');
61015                 }
61016             };
61017
61018
61019             operation.annotation = function() {
61020                 return t('operations.merge.annotation', { n: selectedIDs.length });
61021             };
61022
61023
61024             operation.id = 'merge';
61025             operation.keys = [t('operations.merge.key')];
61026             operation.title = t('operations.merge.title');
61027             operation.behavior = behaviorOperation(context).which(operation);
61028
61029             return operation;
61030         }
61031
61032         function operationReverse(selectedIDs, context) {
61033             var entityID = selectedIDs[0];
61034
61035             var operation = function() {
61036                 context.perform(actionReverse(entityID), operation.annotation());
61037                 context.validator().validate();
61038             };
61039
61040
61041             operation.available = function() {
61042                 return selectedIDs.length === 1 && context.geometry(entityID) === 'line';
61043             };
61044
61045
61046             operation.disabled = function() {
61047                 return false;
61048             };
61049
61050
61051             operation.tooltip = function() {
61052                 return t('operations.reverse.description');
61053             };
61054
61055
61056             operation.annotation = function() {
61057                 return t('operations.reverse.annotation');
61058             };
61059
61060
61061             operation.id = 'reverse';
61062             operation.keys = [t('operations.reverse.key')];
61063             operation.title = t('operations.reverse.title');
61064             operation.behavior = behaviorOperation(context).which(operation);
61065
61066             return operation;
61067         }
61068
61069         function operationSplit(selectedIDs, context) {
61070             var vertices = selectedIDs
61071                 .filter(function(id) { return context.geometry(id) === 'vertex'; });
61072             var entityID = vertices[0];
61073             var action = actionSplit(entityID);
61074             var ways = [];
61075
61076             if (vertices.length === 1) {
61077                 if (entityID && selectedIDs.length > 1) {
61078                     var ids = selectedIDs.filter(function(id) { return id !== entityID; });
61079                     action.limitWays(ids);
61080                 }
61081                 ways = action.ways(context.graph());
61082             }
61083
61084
61085             var operation = function() {
61086                 var difference = context.perform(action, operation.annotation());
61087                 context.enter(modeSelect(context, difference.extantIDs()));
61088             };
61089
61090
61091             operation.available = function() {
61092                 return vertices.length === 1;
61093             };
61094
61095
61096             operation.disabled = function() {
61097                 var reason = action.disabled(context.graph());
61098                 if (reason) {
61099                     return reason;
61100                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61101                     return 'connected_to_hidden';
61102                 }
61103
61104                 return false;
61105             };
61106
61107
61108             operation.tooltip = function() {
61109                 var disable = operation.disabled();
61110                 if (disable) {
61111                     return t('operations.split.' + disable);
61112                 } else if (ways.length === 1) {
61113                     return t('operations.split.description.' + context.geometry(ways[0].id));
61114                 } else {
61115                     return t('operations.split.description.multiple');
61116                 }
61117             };
61118
61119
61120             operation.annotation = function() {
61121                 return ways.length === 1 ?
61122                     t('operations.split.annotation.' + context.geometry(ways[0].id)) :
61123                     t('operations.split.annotation.multiple', { n: ways.length });
61124             };
61125
61126
61127             operation.id = 'split';
61128             operation.keys = [t('operations.split.key')];
61129             operation.title = t('operations.split.title');
61130             operation.behavior = behaviorOperation(context).which(operation);
61131
61132             return operation;
61133         }
61134
61135         function operationStraighten(selectedIDs, context) {
61136             var wayIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'w'; });
61137             var nodeIDs = selectedIDs.filter(function(id) { return id.charAt(0) === 'n'; });
61138
61139             var nodes = utilGetAllNodes(selectedIDs, context.graph());
61140             var coords = nodes.map(function(n) { return n.loc; });
61141             var action = chooseAction();
61142             var geometry;
61143
61144
61145             function chooseAction() {
61146                 // straighten selected nodes
61147                 if (wayIDs.length === 0 && nodeIDs.length > 2) {
61148                     geometry = 'points';
61149                     return actionStraightenNodes(nodeIDs, context.projection);
61150
61151                 // straighten selected ways (possibly between range of 2 selected nodes)
61152                 } else if (wayIDs.length > 0 && (nodeIDs.length === 0 || nodeIDs.length === 2)) {
61153                     var startNodeIDs = [];
61154                     var endNodeIDs = [];
61155
61156                     for (var i = 0; i < selectedIDs.length; i++) {
61157                         var entity = context.entity(selectedIDs[i]);
61158                         if (entity.type === 'node') {
61159                             continue;
61160                         } else if (entity.type !== 'way' || entity.isClosed()) {
61161                             return false;  // exit early, can't straighten these
61162                         }
61163
61164                         startNodeIDs.push(entity.first());
61165                         endNodeIDs.push(entity.last());
61166                     }
61167
61168                     // Remove duplicate end/startNodeIDs (duplicate nodes cannot be at the line end)
61169                     startNodeIDs = startNodeIDs.filter(function(n) {
61170                         return startNodeIDs.indexOf(n) === startNodeIDs.lastIndexOf(n);
61171                     });
61172                     endNodeIDs = endNodeIDs.filter(function(n) {
61173                         return endNodeIDs.indexOf(n) === endNodeIDs.lastIndexOf(n);
61174                     });
61175
61176                     // Ensure all ways are connected (i.e. only 2 unique endpoints/startpoints)
61177                     if (utilArrayDifference(startNodeIDs, endNodeIDs).length +
61178                         utilArrayDifference(endNodeIDs, startNodeIDs).length !== 2) return false;
61179
61180                     // Ensure path contains at least 3 unique nodes
61181                     var wayNodeIDs = utilGetAllNodes(wayIDs, context.graph())
61182                         .map(function(node) { return node.id; });
61183                     if (wayNodeIDs.length <= 2) return false;
61184
61185                     // If range of 2 selected nodes is supplied, ensure nodes lie on the selected path
61186                     if (nodeIDs.length === 2 && (
61187                         wayNodeIDs.indexOf(nodeIDs[0]) === -1 || wayNodeIDs.indexOf(nodeIDs[1]) === -1
61188                     )) return false;
61189
61190                     geometry = 'line';
61191                     return actionStraightenWay(selectedIDs, context.projection);
61192                 }
61193
61194                 return false;
61195             }
61196
61197
61198             function operation() {
61199                 if (!action) return;
61200
61201                 context.perform(action, operation.annotation());
61202
61203                 window.setTimeout(function() {
61204                     context.validator().validate();
61205                 }, 300);  // after any transition
61206             }
61207
61208
61209             operation.available = function() {
61210                 return Boolean(action);
61211             };
61212
61213
61214             operation.disabled = function() {
61215                 var reason = action.disabled(context.graph());
61216                 if (reason) {
61217                     return reason;
61218                 } else if (someMissing()) {
61219                     return 'not_downloaded';
61220                 } else if (selectedIDs.some(context.hasHiddenConnections)) {
61221                     return 'connected_to_hidden';
61222                 }
61223
61224                 return false;
61225
61226
61227                 function someMissing() {
61228                     if (context.inIntro()) return false;
61229                     var osm = context.connection();
61230                     if (osm) {
61231                         var missing = coords.filter(function(loc) { return !osm.isDataLoaded(loc); });
61232                         if (missing.length) {
61233                             missing.forEach(function(loc) { context.loadTileAtLoc(loc); });
61234                             return true;
61235                         }
61236                     }
61237                     return false;
61238                 }
61239             };
61240
61241
61242             operation.tooltip = function() {
61243                 var disable = operation.disabled();
61244                 return disable ?
61245                     t('operations.straighten.' + disable) :
61246                     t('operations.straighten.description.' + geometry);
61247             };
61248
61249
61250             operation.annotation = function() {
61251                 return t('operations.straighten.annotation.' + geometry);
61252             };
61253
61254
61255             operation.id = 'straighten';
61256             operation.keys = [t('operations.straighten.key')];
61257             operation.title = t('operations.straighten.title');
61258             operation.behavior = behaviorOperation(context).which(operation);
61259
61260             return operation;
61261         }
61262
61263
61264
61265         var Operations = /*#__PURE__*/Object.freeze({
61266                 operationCircularize: operationCircularize,
61267                 operationContinue: operationContinue,
61268                 operationDelete: operationDelete,
61269                 operationDisconnect: operationDisconnect,
61270                 operationDowngrade: operationDowngrade,
61271                 operationExtract: operationExtract,
61272                 operationMerge: operationMerge,
61273                 operationMove: operationMove,
61274                 operationOrthogonalize: operationOrthogonalize,
61275                 operationReflectShort: operationReflectShort,
61276                 operationReflectLong: operationReflectLong,
61277                 operationReverse: operationReverse,
61278                 operationRotate: operationRotate,
61279                 operationSplit: operationSplit,
61280                 operationStraighten: operationStraighten
61281         });
61282
61283         function uiEditMenu(context, operations) {
61284             var menu;
61285             var center = [0, 0];
61286             var offset = [0, 0];
61287             var tooltip;
61288
61289             var p = 8;               // top padding
61290             var m = 4;               // top margin
61291             var h = 15;              // height of icon
61292             var vpBottomMargin = 45; // viewport bottom margin
61293             var vpSideMargin = 35;   // viewport side margin
61294             var buttonWidth = 44;
61295             var buttonHeight = (2 * p + h);
61296             var menuWidth = buttonWidth;
61297             var menuHeight = (2 * m) + operations.length * buttonHeight;
61298             var menuSideMargin = 10;
61299             var tooltipWidth = 200;
61300             var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
61301
61302
61303             var editMenu = function (selection) {
61304                 if (!operations.length) return;
61305
61306                 selection.node().parentNode.focus();
61307
61308                 var isRTL = textDirection === 'rtl';
61309                 var viewport = context.surfaceRect();
61310
61311                 if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
61312                     // menu is going left-to-right and near right viewport edge, go left instead
61313                     isRTL = true;
61314                 } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
61315                     // menu is going right-to-left and near left viewport edge, go right instead
61316                     isRTL = false;
61317                 }
61318
61319                 offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
61320
61321                 if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
61322                     // menu is near bottom viewport edge, shift upwards
61323                     offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
61324                 }
61325
61326                 var origin = geoVecAdd(center, offset);
61327
61328                 menu = selection
61329                     .append('g')
61330                     .attr('class', 'edit-menu')
61331                     .attr('transform', 'translate(' + origin + ')')
61332                     .attr('opacity', 0);
61333
61334                 menu
61335                     .transition()
61336                     .attr('opacity', 1);
61337
61338                 menu
61339                     .append('rect')
61340                     .attr('class', 'edit-menu-background')
61341                     .attr('x', 4)
61342                     .attr('rx', 4)
61343                     .attr('ry', 4)
61344                     .attr('width', menuWidth)
61345                     .attr('height', menuHeight)
61346                     .attr('stroke-linecap', 'round');
61347
61348
61349                 var buttons = menu.selectAll('.edit-menu-item')
61350                     .data(operations);
61351
61352                 // enter
61353                 var buttonsEnter = buttons.enter()
61354                     .append('g')
61355                     .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
61356                     .attr('transform', function(d, i) {
61357                         return 'translate(' + geoVecFloor([0, m + i * buttonHeight]).join(',') + ')';
61358                     });
61359
61360                 buttonsEnter
61361                     .append('rect')
61362                     .attr('x', 4)
61363                     .attr('width', buttonWidth)
61364                     .attr('height', buttonHeight)
61365                     .on('click', click)
61366                     .on('mousedown', mousedown)
61367                     .on('mouseover', mouseover)
61368                     .on('mouseout', mouseout);
61369
61370                 buttonsEnter
61371                     .append('use')
61372                     .attr('width', '20')
61373                     .attr('height', '20')
61374                     .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
61375                     .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
61376
61377                 // update
61378                 buttons = buttonsEnter
61379                     .merge(buttons)
61380                     .classed('disabled', function(d) { return d.disabled(); });
61381
61382
61383                 tooltip = d3_select('#id-container')
61384                     .append('div')
61385                     .attr('class', 'tooltip-inner edit-menu-tooltip');
61386
61387
61388                 function click(operation) {
61389                     event.stopPropagation();
61390                     if (operation.disabled()) return;
61391                     operation();
61392                     editMenu.close();
61393                 }
61394
61395                 function mousedown() {
61396                     event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
61397                 }
61398
61399                 function mouseover(d, i) {
61400                     var tipX, tipY;
61401
61402                     if (!isRTL) {
61403                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61404                     } else {
61405                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61406                     }
61407
61408                     if (tipX + tooltipWidth > viewport.right) {
61409                         // tip is going left-to-right and near right viewport edge, go left instead
61410                         tipX = viewport.left + origin[0] - 4 - tooltipWidth;
61411                     } else if (tipX < viewport.left) {
61412                         // tip is going right-to-left and near left viewport edge, go right instead
61413                         tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
61414                     }
61415
61416                     tipY = viewport.top + origin[1] + (i * buttonHeight);
61417                     if (tipY + tooltipHeight > viewport.bottom) {
61418                         // tip is near bottom viewport edge, shift upwards
61419                         tipY -= tipY + tooltipHeight - viewport.bottom;
61420                     }
61421
61422                     tooltip
61423                         .style('left', tipX + 'px')
61424                         .style('top', tipY + 'px')
61425                         .style('display', 'block')
61426                         .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
61427
61428                     // update disabled again, just in case tooltip and disabled state disagree
61429                     // https://github.com/openstreetmap/iD/issues/6296#issuecomment-489259027
61430                     d3_select(this.parentNode)
61431                         .classed('disabled', d.disabled());
61432
61433                 }
61434
61435                 function mouseout() {
61436                     tooltip.style('display', 'none');
61437                 }
61438             };
61439
61440
61441             editMenu.close = function () {
61442                 if (menu) {
61443                     menu
61444                         .style('pointer-events', 'none')
61445                         .transition()
61446                         .attr('opacity', 0)
61447                         .remove();
61448                 }
61449
61450                 if (tooltip) {
61451                     tooltip.remove();
61452                 }
61453             };
61454
61455
61456             editMenu.center = function(val) {
61457                 if (!arguments.length) return center;
61458                 center = val;
61459                 return editMenu;
61460             };
61461
61462
61463             return editMenu;
61464         }
61465
61466         function uiSelectionList(context, selectedIDs) {
61467
61468             function selectEntity(entity) {
61469                 context.enter(modeSelect(context, [entity.id]));
61470             }
61471
61472
61473             function deselectEntity(entity) {
61474                 event.stopPropagation();
61475                 var index = selectedIDs.indexOf(entity.id);
61476                 if (index > -1) {
61477                     selectedIDs.splice(index, 1);
61478                 }
61479                 context.enter(modeSelect(context, selectedIDs));
61480             }
61481
61482
61483             function selectionList(selection) {
61484                 selection.classed('selection-list-pane', true);
61485
61486                 var header = selection
61487                     .append('div')
61488                     .attr('class', 'header fillL cf');
61489
61490                 header
61491                     .append('h3')
61492                     .text(t('inspector.multiselect'));
61493
61494                 var listWrap = selection
61495                     .append('div')
61496                     .attr('class', 'inspector-body');
61497
61498                 var list = listWrap
61499                     .append('div')
61500                     .attr('class', 'feature-list cf');
61501
61502
61503                 context.history()
61504                     .on('change.selectionList', function(difference) {
61505                         if (difference) drawList();
61506                     });
61507
61508                 drawList();
61509
61510
61511                 function drawList() {
61512                     var entities = selectedIDs
61513                         .map(function(id) { return context.hasEntity(id); })
61514                         .filter(function(entity) { return entity; });
61515
61516                     var items = list.selectAll('.feature-list-item')
61517                         .data(entities, osmEntity.key);
61518
61519                     items.exit()
61520                         .remove();
61521
61522                     // Enter
61523                     var enter = items.enter()
61524                         .append('div')
61525                         .attr('class', 'feature-list-item')
61526                         .on('click', selectEntity);
61527
61528                     enter
61529                         .each(function(d) {
61530                             d3_select(this).on('mouseover', function() {
61531                                 utilHighlightEntities([d.id], true, context);
61532                             });
61533                             d3_select(this).on('mouseout', function() {
61534                                 utilHighlightEntities([d.id], false, context);
61535                             });
61536                         });
61537
61538                     var label = enter
61539                         .append('button')
61540                         .attr('class', 'label');
61541
61542                     enter
61543                         .append('button')
61544                         .attr('class', 'close')
61545                         .on('click', deselectEntity)
61546                         .call(svgIcon('#iD-icon-close'));
61547
61548                     label
61549                         .append('span')
61550                         .attr('class', 'entity-geom-icon')
61551                         .call(svgIcon('', 'pre-text'));
61552
61553                     label
61554                         .append('span')
61555                         .attr('class', 'entity-type');
61556
61557                     label
61558                         .append('span')
61559                         .attr('class', 'entity-name');
61560
61561                     // Update
61562                     items = items.merge(enter);
61563
61564                     items.selectAll('.entity-geom-icon use')
61565                         .attr('href', function() {
61566                             var entity = this.parentNode.parentNode.__data__;
61567                             return '#iD-icon-' + context.geometry(entity.id);
61568                         });
61569
61570                     items.selectAll('.entity-type')
61571                         .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
61572
61573                     items.selectAll('.entity-name')
61574                         .text(function(entity) { return utilDisplayName(entity); });
61575                 }
61576             }
61577
61578             return selectionList;
61579         }
61580
61581         function uiRadialMenu(context, operations) {
61582             var menu;
61583             var center = [0, 0];
61584             var tooltip;
61585
61586
61587             var radialMenu = function(selection) {
61588                 if (!operations.length) return;
61589
61590                 selection.node().parentNode.focus();
61591
61592                 function click(operation) {
61593                     event.stopPropagation();
61594                     if (operation.disabled()) return;
61595                     operation();
61596                     radialMenu.close();
61597                 }
61598
61599                 menu = selection
61600                     .append('g')
61601                     .attr('class', 'radial-menu')
61602                     .attr('transform', 'translate(' + center + ')')
61603                     .attr('opacity', 0);
61604
61605                 menu
61606                     .transition()
61607                     .attr('opacity', 1);
61608
61609                 var r = 50;
61610                 var a = Math.PI / 4;
61611                 var a0 = -Math.PI / 4;
61612                 var a1 = a0 + (operations.length - 1) * a;
61613
61614                 menu
61615                     .append('path')
61616                     .attr('class', 'radial-menu-background')
61617                     .attr('d', 'M' + r * Math.sin(a0) + ',' +
61618                                      r * Math.cos(a0) +
61619                               ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
61620                                      (r * Math.sin(a1) + 1e-3) + ',' +
61621                                      (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
61622                     .attr('stroke-width', 50)
61623                     .attr('stroke-linecap', 'round');
61624
61625                 var button = menu.selectAll()
61626                     .data(operations)
61627                     .enter()
61628                     .append('g')
61629                     .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
61630                     .classed('disabled', function(d) { return d.disabled(); })
61631                     .attr('transform', function(d, i) {
61632                         return 'translate(' + geoVecFloor([
61633                                 r * Math.sin(a0 + i * a),
61634                                 r * Math.cos(a0 + i * a)]).join(',') + ')';
61635                     });
61636
61637                 button
61638                     .append('circle')
61639                     .attr('r', 15)
61640                     .on('click', click)
61641                     .on('mousedown', mousedown)
61642                     .on('mouseover', mouseover)
61643                     .on('mouseout', mouseout);
61644
61645                 button
61646                     .append('use')
61647                     .attr('transform', 'translate(-10,-10)')
61648                     .attr('width', '20')
61649                     .attr('height', '20')
61650                     .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
61651
61652                 tooltip = d3_select(document.body)
61653                     .append('div')
61654                     .attr('class', 'tooltip-inner radial-menu-tooltip');
61655
61656                 function mousedown() {
61657                     event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
61658                 }
61659
61660                 function mouseover(d, i) {
61661                     var rect = context.surfaceRect();
61662                     var angle = a0 + i * a;
61663                     var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
61664                     var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
61665                     var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
61666                     var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
61667
61668                     tooltip
61669                         .style('top', null)
61670                         .style('left', null)
61671                         .style('bottom', null)
61672                         .style('right', null)
61673                         .style('display', 'block')
61674                         .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
61675
61676                     if (i === 0) {
61677                         tooltip
61678                             .style('right', right)
61679                             .style('top', top);
61680                     } else if (i >= 4) {
61681                         tooltip
61682                             .style('left', left)
61683                             .style('bottom', bottom);
61684                     } else {
61685                         tooltip
61686                             .style('left', left)
61687                             .style('top', top);
61688                     }
61689                 }
61690
61691                 function mouseout() {
61692                     tooltip.style('display', 'none');
61693                 }
61694             };
61695
61696
61697             radialMenu.close = function() {
61698                 if (menu) {
61699                     menu
61700                         .style('pointer-events', 'none')
61701                         .transition()
61702                         .attr('opacity', 0)
61703                         .remove();
61704                 }
61705
61706                 if (tooltip) {
61707                     tooltip.remove();
61708                 }
61709             };
61710
61711
61712             radialMenu.center = function(_) {
61713                 if (!arguments.length) return center;
61714                 center = _;
61715                 return radialMenu;
61716             };
61717
61718
61719             return radialMenu;
61720         }
61721
61722         var _relatedParent;
61723
61724
61725         function modeSelect(context, selectedIDs) {
61726             var mode = {
61727                 id: 'select',
61728                 button: 'browse'
61729             };
61730
61731             var keybinding = utilKeybinding('select');
61732             var behaviors = [
61733                 behaviorCopy(context),
61734                 behaviorPaste(context),
61735                 behaviorBreathe(context),
61736                 behaviorHover(context),
61737                 behaviorSelect(context),
61738                 behaviorLasso(context),
61739                 modeDragNode(context).restoreSelectedIDs(selectedIDs).behavior,
61740                 modeDragNote(context).behavior
61741             ];
61742             var editMenu;
61743             var _timeout = null;
61744             var _newFeature = false;
61745             var _suppressMenu = true;
61746             var _follow = false;
61747
61748
61749             var wrap = context.container()
61750                 .select('.inspector-wrap');
61751
61752
61753             function singular() {
61754                 if (selectedIDs && selectedIDs.length === 1) {
61755                     return context.hasEntity(selectedIDs[0]);
61756                 }
61757             }
61758
61759
61760             function checkSelectedIDs() {
61761                 var ids = [];
61762                 if (Array.isArray(selectedIDs)) {
61763                     ids = selectedIDs.filter(function(id) {
61764                         return context.hasEntity(id);
61765                     });
61766                 }
61767
61768                 if (ids.length) {
61769                     selectedIDs = ids;
61770                 } else {
61771                     context.enter(modeBrowse(context));
61772                 }
61773                 return !!ids.length;
61774             }
61775
61776
61777             // find the common parent ways for nextVertex, previousVertex
61778             function commonParents() {
61779                 var graph = context.graph();
61780                 var commonParents = [];
61781
61782                 for (var i = 0; i < selectedIDs.length; i++) {
61783                     var entity = context.hasEntity(selectedIDs[i]);
61784                     if (!entity || entity.geometry(graph) !== 'vertex') {
61785                         return [];  // selection includes some not vertexes
61786                     }
61787
61788                     var currParents = graph.parentWays(entity).map(function(w) { return w.id; });
61789                     if (!commonParents.length) {
61790                         commonParents = currParents;
61791                         continue;
61792                     }
61793
61794                     commonParents = utilArrayIntersection(commonParents, currParents);
61795                     if (!commonParents.length) {
61796                         return [];
61797                     }
61798                 }
61799
61800                 return commonParents;
61801             }
61802
61803
61804             function singularParent() {
61805                 var parents = commonParents();
61806                 if (!parents || parents.length === 0) {
61807                     _relatedParent = null;
61808                     return null;
61809                 }
61810
61811                 // relatedParent is used when we visit a vertex with multiple
61812                 // parents, and we want to remember which parent line we started on.
61813
61814                 if (parents.length === 1) {
61815                     _relatedParent = parents[0];  // remember this parent for later
61816                     return _relatedParent;
61817                 }
61818
61819                 if (parents.indexOf(_relatedParent) !== -1) {
61820                     return _relatedParent;   // prefer the previously seen parent
61821                 }
61822
61823                 return parents[0];
61824             }
61825
61826
61827             function closeMenu() {
61828                 if (editMenu) {
61829                     context.surface().call(editMenu.close);
61830                 }
61831             }
61832
61833
61834             function positionMenu() {
61835                 if (!editMenu) return;
61836
61837                 var entity = singular();
61838                 if (entity && context.geometry(entity.id) === 'relation') {
61839                     _suppressMenu = true;
61840                 } else {
61841                     var point = context.mouse();
61842                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
61843
61844                     if (point && geoPointInPolygon(point, viewport)) {
61845                         editMenu.center(point);
61846                     } else {
61847                         _suppressMenu = true;
61848                     }
61849                 }
61850             }
61851
61852
61853             function showMenu() {
61854                 closeMenu();
61855                 if (editMenu) {
61856                     context.surface().call(editMenu);
61857                 }
61858             }
61859
61860
61861             function toggleMenu() {
61862                 // deprecation warning - Radial Menu to be removed in iD v3
61863                 if (d3_select('.edit-menu, .radial-menu').empty()) {
61864                     positionMenu();
61865                     showMenu();
61866                 } else {
61867                     closeMenu();
61868                 }
61869             }
61870
61871
61872             mode.selectedIDs = function() {
61873                 return selectedIDs;
61874             };
61875
61876
61877             mode.zoomToSelected = function() {
61878                 var entity = singular();
61879                 if (entity) {
61880                     context.map().zoomToEase(entity);
61881                 }
61882             };
61883
61884
61885             mode.reselect = function() {
61886                 if (!checkSelectedIDs()) return;
61887
61888                 var surfaceNode = context.surface().node();
61889                 if (surfaceNode.focus) {   // FF doesn't support it
61890                     surfaceNode.focus();
61891                 }
61892
61893                 positionMenu();
61894                 if (!_suppressMenu) {
61895                     showMenu();
61896                 }
61897             };
61898
61899
61900             mode.newFeature = function(val) {
61901                 if (!arguments.length) return _newFeature;
61902                 _newFeature = val;
61903                 return mode;
61904             };
61905
61906
61907             mode.suppressMenu = function(val) {
61908                 if (!arguments.length) return _suppressMenu;
61909                 _suppressMenu = val;
61910                 return mode;
61911             };
61912
61913
61914             mode.follow = function(val) {
61915                 if (!arguments.length) return _follow;
61916                 _follow = val;
61917                 return mode;
61918             };
61919
61920
61921             mode.enter = function() {
61922                 if (!checkSelectedIDs()) return;
61923
61924                 context.features().forceVisible(selectedIDs);
61925
61926                 var operations = Object.values(Operations)
61927                     .map(function(o) { return o(selectedIDs, context); })
61928                     .filter(function(o) { return o.available() && o.id !== 'delete' && o.id !== 'downgrade'; });
61929
61930                 var downgradeOperation = operationDowngrade(selectedIDs, context);
61931                 // don't allow delete if downgrade is available
61932                 var lastOperation = !context.inIntro() && downgradeOperation.available() ? downgradeOperation : operationDelete(selectedIDs, context);
61933
61934                 // deprecation warning - Radial Menu to be removed in iD v3
61935                 var isRadialMenu = context.storage('edit-menu-style') === 'radial';
61936                 if (isRadialMenu) {
61937                     operations = operations.slice(0,7);
61938                     operations.unshift(lastOperation);
61939                 } else {
61940                     operations.push(lastOperation);
61941                 }
61942
61943                 operations.forEach(function(operation) {
61944                     if (operation.behavior) {
61945                         behaviors.push(operation.behavior);
61946                     }
61947                 });
61948
61949                 behaviors.forEach(context.install);
61950
61951                 keybinding
61952                     .on(t('inspector.zoom_to.key'), mode.zoomToSelected)
61953                     .on(['[', 'pgup'], previousVertex)
61954                     .on([']', 'pgdown'], nextVertex)
61955                     .on(['{', uiCmd('⌘['), 'home'], firstVertex)
61956                     .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
61957                     .on(['\\', 'pause'], nextParent)
61958                     .on('⎋', esc, true)
61959                     .on('space', toggleMenu);
61960
61961                 d3_select(document)
61962                     .call(keybinding);
61963
61964
61965                 // deprecation warning - Radial Menu to be removed in iD v3
61966                 editMenu = isRadialMenu
61967                     ? uiRadialMenu(context, operations)
61968                     : uiEditMenu(context, operations);
61969
61970                 context.ui().sidebar
61971                     .select(singular() ? singular().id : null, _newFeature);
61972
61973                 context.history()
61974                     .on('undone.select', update)
61975                     .on('redone.select', update);
61976
61977                 context.map()
61978                     .on('move.select', closeMenu)
61979                     .on('drawn.select', selectElements);
61980
61981                 context.surface()
61982                     .on('dblclick.select', dblclick);
61983
61984
61985                 selectElements();
61986
61987                 if (selectedIDs.length > 1) {
61988                     var entities = uiSelectionList(context, selectedIDs);
61989                     context.ui().sidebar.show(entities);
61990                 }
61991
61992                 if (_follow) {
61993                     var extent = geoExtent();
61994                     var graph = context.graph();
61995                     selectedIDs.forEach(function(id) {
61996                         var entity = context.entity(id);
61997                         extent._extend(entity.extent(graph));
61998                     });
61999
62000                     var loc = extent.center();
62001                     context.map().centerEase(loc);
62002                 } else if (singular() && singular().type === 'way') {
62003                     context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
62004                 }
62005
62006                 _timeout = window.setTimeout(function() {
62007                     positionMenu();
62008                     if (!_suppressMenu) {
62009                         showMenu();
62010                     }
62011                 }, 270);  /* after any centerEase completes */
62012
62013
62014                 function update() {
62015                     closeMenu();
62016                     checkSelectedIDs();
62017                 }
62018
62019
62020                 function dblclick() {
62021                     var target = d3_select(event.target);
62022
62023                     var datum = target.datum();
62024                     var entity = datum && datum.properties && datum.properties.entity;
62025                     if (!entity) return;
62026
62027                     if (entity instanceof osmWay && target.classed('target')) {
62028                         var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
62029                         var prev = entity.nodes[choice.index - 1];
62030                         var next = entity.nodes[choice.index];
62031
62032                         context.perform(
62033                             actionAddMidpoint({ loc: choice.loc, edge: [prev, next] }, osmNode()),
62034                             t('operations.add.annotation.vertex')
62035                         );
62036
62037                         event.preventDefault();
62038                         event.stopPropagation();
62039
62040                     } else if (entity.type === 'midpoint') {
62041                         context.perform(
62042                             actionAddMidpoint({ loc: entity.loc, edge: entity.edge }, osmNode()),
62043                             t('operations.add.annotation.vertex'));
62044
62045                         event.preventDefault();
62046                         event.stopPropagation();
62047                     }
62048                 }
62049
62050
62051                 function selectElements(drawn) {
62052                     if (!checkSelectedIDs()) return;
62053
62054                     var surface = context.surface();
62055                     var entity = singular();
62056
62057                     if (entity && context.geometry(entity.id) === 'relation') {
62058                         _suppressMenu = true;
62059                         return;
62060                     }
62061
62062                     surface.selectAll('.related')
62063                         .classed('related', false);
62064
62065                     singularParent();
62066                     if (_relatedParent) {
62067                         surface.selectAll(utilEntitySelector([_relatedParent]))
62068                             .classed('related', true);
62069                     }
62070
62071                     var selection = context.surface()
62072                         .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
62073
62074                     if (selection.empty()) {
62075                         // Return to browse mode if selected DOM elements have
62076                         // disappeared because the user moved them out of view..
62077                         var source = event && event.type === 'zoom' && event.sourceEvent;
62078                         if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
62079                             context.enter(modeBrowse(context));
62080                         }
62081                     } else {
62082                         selection
62083                             .classed('selected', true);
62084                     }
62085                 }
62086
62087
62088                 function esc() {
62089                     if (d3_select('.combobox').size()) return;
62090                     context.enter(modeBrowse(context));
62091                 }
62092
62093
62094                 function firstVertex() {
62095                     event.preventDefault();
62096                     var entity = singular();
62097                     var parent = singularParent();
62098                     var way;
62099
62100                     if (entity && entity.type === 'way') {
62101                         way = entity;
62102                     } else if (parent) {
62103                         way = context.entity(parent);
62104                     }
62105
62106                     if (way) {
62107                         context.enter(
62108                             modeSelect(context, [way.first()]).follow(true)
62109                         );
62110                     }
62111                 }
62112
62113
62114                 function lastVertex() {
62115                     event.preventDefault();
62116                     var entity = singular();
62117                     var parent = singularParent();
62118                     var way;
62119
62120                     if (entity && entity.type === 'way') {
62121                         way = entity;
62122                     } else if (parent) {
62123                         way = context.entity(parent);
62124                     }
62125
62126                     if (way) {
62127                         context.enter(
62128                             modeSelect(context, [way.last()]).follow(true)
62129                         );
62130                     }
62131                 }
62132
62133
62134                 function previousVertex() {
62135                     event.preventDefault();
62136                     var parent = singularParent();
62137                     if (!parent) return;
62138
62139                     var way = context.entity(parent);
62140                     var length = way.nodes.length;
62141                     var curr = way.nodes.indexOf(selectedIDs[0]);
62142                     var index = -1;
62143
62144                     if (curr > 0) {
62145                         index = curr - 1;
62146                     } else if (way.isClosed()) {
62147                         index = length - 2;
62148                     }
62149
62150                     if (index !== -1) {
62151                         context.enter(
62152                             modeSelect(context, [way.nodes[index]]).follow(true)
62153                         );
62154                     }
62155                 }
62156
62157
62158                 function nextVertex() {
62159                     event.preventDefault();
62160                     var parent = singularParent();
62161                     if (!parent) return;
62162
62163                     var way = context.entity(parent);
62164                     var length = way.nodes.length;
62165                     var curr = way.nodes.indexOf(selectedIDs[0]);
62166                     var index = -1;
62167
62168                     if (curr < length - 1) {
62169                         index = curr + 1;
62170                     } else if (way.isClosed()) {
62171                         index = 0;
62172                     }
62173
62174                     if (index !== -1) {
62175                         context.enter(
62176                             modeSelect(context, [way.nodes[index]]).follow(true)
62177                         );
62178                     }
62179                 }
62180
62181
62182                 function nextParent() {
62183                     event.preventDefault();
62184                     var parents = commonParents();
62185                     if (!parents || parents.length < 2) return;
62186
62187                     var index = parents.indexOf(_relatedParent);
62188                     if (index < 0 || index > parents.length - 2) {
62189                         _relatedParent = parents[0];
62190                     } else {
62191                         _relatedParent = parents[index + 1];
62192                     }
62193
62194                     var surface = context.surface();
62195                     surface.selectAll('.related')
62196                         .classed('related', false);
62197
62198                     if (_relatedParent) {
62199                         surface.selectAll(utilEntitySelector([_relatedParent]))
62200                             .classed('related', true);
62201                     }
62202                 }
62203             };
62204
62205
62206             mode.exit = function() {
62207                 if (_timeout) window.clearTimeout(_timeout);
62208
62209                 behaviors.forEach(context.uninstall);
62210
62211                 d3_select(document)
62212                     .call(keybinding.unbind);
62213
62214                 closeMenu();
62215                 editMenu = undefined;
62216
62217                 context.history()
62218                     .on('undone.select', null)
62219                     .on('redone.select', null);
62220
62221                 var surface = context.surface();
62222
62223                 surface
62224                     .on('dblclick.select', null);
62225
62226                 surface
62227                     .selectAll('.selected')
62228                     .classed('selected', false);
62229
62230                 surface
62231                     .selectAll('.related')
62232                     .classed('related', false);
62233
62234                 context.map().on('drawn.select', null);
62235                 context.ui().sidebar.hide();
62236                 context.features().forceVisible([]);
62237
62238                 var entity = singular();
62239                 if (_newFeature && entity && entity.type === 'relation' &&
62240                     // no tags
62241                     Object.keys(entity.tags).length === 0 &&
62242                     // no parent relations
62243                     context.graph().parentRelations(entity).length === 0 &&
62244                     // no members or one member with no role
62245                     (entity.members.length === 0 || (entity.members.length === 1 && !entity.members[0].role))
62246                 ) {
62247                     // the user added this relation but didn't edit it at all, so just delete it
62248                     var deleteAction = actionDeleteRelation(entity.id, true /* don't delete untagged members */);
62249                     context.perform(deleteAction, t('operations.delete.annotation.relation'));
62250                 }
62251             };
62252
62253
62254             return mode;
62255         }
62256
62257         function uiLasso(context) {
62258             var group, polygon;
62259
62260             lasso.coordinates = [];
62261
62262             function lasso(selection) {
62263                 context.container()
62264                     .classed('lasso', true);
62265
62266                 group = selection
62267                     .append('g')
62268                     .attr('class', 'lasso hide');
62269
62270                 polygon = group
62271                     .append('path')
62272                     .attr('class', 'lasso-path');
62273
62274                 group
62275                     .call(uiToggle(true));
62276             }
62277
62278
62279             function draw() {
62280                 if (polygon) {
62281                     polygon.data([lasso.coordinates])
62282                         .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
62283                 }
62284             }
62285
62286
62287             lasso.extent = function () {
62288                 return lasso.coordinates.reduce(function(extent, point) {
62289                     return extent.extend(geoExtent(point));
62290                 }, geoExtent());
62291             };
62292
62293
62294             lasso.p = function(_) {
62295                 if (!arguments.length) return lasso;
62296                 lasso.coordinates.push(_);
62297                 draw();
62298                 return lasso;
62299             };
62300
62301
62302             lasso.close = function() {
62303                 if (group) {
62304                     group.call(uiToggle(false, function() {
62305                         d3_select(this).remove();
62306                     }));
62307                 }
62308                 context.container().classed('lasso', false);
62309             };
62310
62311
62312             return lasso;
62313         }
62314
62315         function behaviorLasso(context) {
62316
62317             var behavior = function(selection) {
62318                 var lasso;
62319
62320
62321                 function mousedown() {
62322                     var button = 0;  // left
62323                     if (event.button === button && event.shiftKey === true) {
62324                         lasso = null;
62325
62326                         d3_select(window)
62327                             .on('mousemove.lasso', mousemove)
62328                             .on('mouseup.lasso', mouseup);
62329
62330                         event.stopPropagation();
62331                     }
62332                 }
62333
62334
62335                 function mousemove() {
62336                     if (!lasso) {
62337                         lasso = uiLasso(context);
62338                         context.surface().call(lasso);
62339                     }
62340
62341                     lasso.p(context.mouse());
62342                 }
62343
62344
62345                 function normalize(a, b) {
62346                     return [
62347                         [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
62348                         [Math.max(a[0], b[0]), Math.max(a[1], b[1])]
62349                     ];
62350                 }
62351
62352
62353                 function lassoed() {
62354                     if (!lasso) return [];
62355
62356                     var graph = context.graph();
62357                     var bounds = lasso.extent().map(context.projection.invert);
62358                     var extent = geoExtent(normalize(bounds[0], bounds[1]));
62359
62360                     var intersects = context.intersects(extent).filter(function(entity) {
62361                         return entity.type === 'node' &&
62362                             geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
62363                             !context.features().isHidden(entity, graph, entity.geometry(graph));
62364                     });
62365
62366                     return intersects.map(function(entity) { return entity.id; });
62367                 }
62368
62369
62370                 function mouseup() {
62371                     d3_select(window)
62372                         .on('mousemove.lasso', null)
62373                         .on('mouseup.lasso', null);
62374
62375                     if (!lasso) return;
62376
62377                     var ids = lassoed();
62378                     lasso.close();
62379
62380                     if (ids.length) {
62381                         context.enter(modeSelect(context, ids));
62382                     }
62383                 }
62384
62385                 selection
62386                     .on('mousedown.lasso', mousedown);
62387             };
62388
62389
62390             behavior.off = function(selection) {
62391                 selection.on('mousedown.lasso', null);
62392             };
62393
62394
62395             return behavior;
62396         }
62397
62398         function modeBrowse(context) {
62399             var mode = {
62400                 button: 'browse',
62401                 id: 'browse',
62402                 title: t('modes.browse.title'),
62403                 description: t('modes.browse.description')
62404             }, sidebar;
62405
62406             var behaviors = [
62407                 behaviorPaste(context),
62408                 behaviorHover(context).on('hover', context.ui().sidebar.hover),
62409                 behaviorSelect(context),
62410                 behaviorLasso(context),
62411                 modeDragNode(context).behavior,
62412                 modeDragNote(context).behavior
62413             ];
62414
62415
62416             mode.enter = function() {
62417                 behaviors.forEach(context.install);
62418
62419                 // Get focus on the body.
62420                 if (document.activeElement && document.activeElement.blur) {
62421                     document.activeElement.blur();
62422                 }
62423
62424                 if (sidebar) {
62425                     context.ui().sidebar.show(sidebar);
62426                 } else {
62427                     context.ui().sidebar.select(null);
62428                 }
62429             };
62430
62431
62432             mode.exit = function() {
62433                 context.ui().sidebar.hover.cancel();
62434                 behaviors.forEach(context.uninstall);
62435
62436                 if (sidebar) {
62437                     context.ui().sidebar.hide();
62438                 }
62439             };
62440
62441
62442             mode.sidebar = function(_) {
62443                 if (!arguments.length) return sidebar;
62444                 sidebar = _;
62445                 return mode;
62446             };
62447
62448
62449             return mode;
62450         }
62451
62452         function behaviorAddWay(context) {
62453             var dispatch$1 = dispatch('start', 'startFromWay', 'startFromNode');
62454             var draw = behaviorDraw(context);
62455
62456             function behavior(surface) {
62457                 draw.on('click', function() { dispatch$1.apply('start', this, arguments); })
62458                     .on('clickWay', function() { dispatch$1.apply('startFromWay', this, arguments); })
62459                     .on('clickNode', function() { dispatch$1.apply('startFromNode', this, arguments); })
62460                     .on('cancel', behavior.cancel)
62461                     .on('finish', behavior.cancel);
62462
62463                 context.map()
62464                     .dblclickEnable(false);
62465
62466                 surface.call(draw);
62467             }
62468
62469
62470             behavior.off = function(surface) {
62471                 surface.call(draw.off);
62472             };
62473
62474
62475             behavior.cancel = function() {
62476                 window.setTimeout(function() {
62477                     context.map().dblclickEnable(true);
62478                 }, 1000);
62479
62480                 context.enter(modeBrowse(context));
62481             };
62482
62483
62484             behavior.tail = function(text) {
62485                 draw.tail(text);
62486                 return behavior;
62487             };
62488
62489
62490             return utilRebind(behavior, dispatch$1, 'on');
62491         }
62492
62493         function behaviorHash(context) {
62494             var s0 = null; // cached window.location.hash
62495             var lat = 90 - 1e-8; // allowable latitude range
62496
62497
62498             var parser = function(map, s) {
62499                 var q = utilStringQs(s);
62500                 var args = (q.map || '').split('/').map(Number);
62501
62502                 if (args.length < 3 || args.some(isNaN)) {
62503                     return true; // replace bogus hash
62504
62505                 } else if (s !== formatter(map).slice(1)) {   // hash has changed
62506                     var mode = context.mode();
62507                     var dist = geoSphericalDistance(map.center(), [args[2], args[1]]);
62508                     var maxdist = 500;
62509
62510                     // Don't allow the hash location to change too much while drawing
62511                     // This can happen if the user accidently hit the back button.  #3996
62512                     if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
62513                         context.enter(modeBrowse(context));
62514                     }
62515
62516                     map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
62517                 }
62518             };
62519
62520
62521             var formatter = function(map) {
62522                 var center = map.center();
62523                 var zoom = map.zoom();
62524                 var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
62525                 var q = utilObjectOmit(utilStringQs(window.location.hash.substring(1)),
62526                     ['comment', 'source', 'hashtags', 'walkthrough']
62527                 );
62528                 var newParams = {};
62529
62530                 delete q.id;
62531                 var selected = context.selectedIDs().filter(function(id) {
62532                     return !context.entity(id).isNew();
62533                 });
62534                 if (selected.length) {
62535                     newParams.id = selected.join(',');
62536                 }
62537
62538                 newParams.map = zoom.toFixed(2) +
62539                     '/' + center[1].toFixed(precision) +
62540                     '/' + center[0].toFixed(precision);
62541
62542                 return '#' + utilQsString(Object.assign(q, newParams), true);
62543             };
62544
62545
62546             function update() {
62547                 if (context.inIntro()) return;
62548                 var s1 = formatter(context.map());
62549                 if (s0 !== s1) {
62550                     window.location.replace(s0 = s1);  // don't recenter the map!
62551                 }
62552             }
62553
62554
62555             var throttledUpdate = throttle(update, 500);
62556
62557
62558             function hashchange() {
62559                 if (window.location.hash === s0) return;  // ignore spurious hashchange events
62560                 if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
62561                     update(); // replace bogus hash
62562                 }
62563             }
62564
62565
62566             function behavior() {
62567                 context.map()
62568                     .on('move.hash', throttledUpdate);
62569
62570                 context
62571                     .on('enter.hash', throttledUpdate);
62572
62573                 d3_select(window)
62574                     .on('hashchange.hash', hashchange);
62575
62576                 if (window.location.hash) {
62577                     var q = utilStringQs(window.location.hash.substring(1));
62578
62579                     if (q.id) {
62580                         context.zoomToEntity(q.id.split(',')[0], !q.map);
62581                     }
62582
62583                     if (q.comment) {
62584                         context.storage('comment', q.comment);
62585                         context.storage('commentDate', Date.now());
62586                     }
62587
62588                     if (q.source) {
62589                         context.storage('source', q.source);
62590                         context.storage('commentDate', Date.now());
62591                     }
62592
62593                     if (q.hashtags) {
62594                         context.storage('hashtags', q.hashtags);
62595                     }
62596
62597                     if (q.walkthrough === 'true') {
62598                         behavior.startWalkthrough = true;
62599                     }
62600
62601                     hashchange();
62602
62603                     if (q.map) {
62604                         behavior.hadHash = true;
62605                     }
62606                 }
62607             }
62608
62609
62610             behavior.off = function() {
62611                 throttledUpdate.cancel();
62612
62613                 context.map()
62614                     .on('move.hash', null);
62615
62616                 context
62617                     .on('enter.hash', null);
62618
62619                 d3_select(window)
62620                     .on('hashchange.hash', null);
62621
62622                 window.location.hash = '';
62623             };
62624
62625
62626             return behavior;
62627         }
62628
62629         /*
62630             iD.coreDifference represents the difference between two graphs.
62631             It knows how to calculate the set of entities that were
62632             created, modified, or deleted, and also contains the logic
62633             for recursively extending a difference to the complete set
62634             of entities that will require a redraw, taking into account
62635             child and parent relationships.
62636          */
62637         function coreDifference(base, head) {
62638             var _changes = {};
62639             var _didChange = {};  // 'addition', 'deletion', 'geometry', 'properties'
62640             var _diff = {};
62641
62642             function checkEntityID(id) {
62643                 var h = head.entities[id];
62644                 var b = base.entities[id];
62645
62646                 if (h === b) return;
62647                 if (_changes[id]) return;
62648
62649                 if (!h && b) {
62650                     _changes[id] = { base: b, head: h };
62651                     _didChange.deletion = true;
62652                     return;
62653                 }
62654                 if (h && !b) {
62655                     _changes[id] = { base: b, head: h };
62656                     _didChange.addition = true;
62657                     return;
62658                 }
62659
62660                 if (h && b) {
62661                     if (h.members && b.members && !fastDeepEqual(h.members, b.members)) {
62662                         _changes[id] = { base: b, head: h };
62663                         _didChange.geometry = true;
62664                         _didChange.properties = true;
62665                         return;
62666                     }
62667                     if (h.loc && b.loc && !geoVecEqual(h.loc, b.loc)) {
62668                         _changes[id] = { base: b, head: h };
62669                         _didChange.geometry = true;
62670                     }
62671                     if (h.nodes && b.nodes && !fastDeepEqual(h.nodes, b.nodes)) {
62672                         _changes[id] = { base: b, head: h };
62673                         _didChange.geometry = true;
62674                     }
62675                     if (h.tags && b.tags && !fastDeepEqual(h.tags, b.tags)) {
62676                         _changes[id] = { base: b, head: h };
62677                         _didChange.properties = true;
62678                     }
62679                 }
62680             }
62681
62682             Object.keys(head.entities).forEach(checkEntityID);
62683             Object.keys(base.entities).forEach(checkEntityID);
62684
62685
62686             _diff.length = function length() {
62687                 return Object.keys(_changes).length;
62688             };
62689
62690
62691             _diff.changes = function changes() {
62692                 return _changes;
62693             };
62694
62695             _diff.didChange = _didChange;
62696
62697
62698             // pass true to include affected relation members
62699             _diff.extantIDs = function extantIDs(includeRelMembers) {
62700                 var result = new Set();
62701                 Object.keys(_changes).forEach(function(id) {
62702                     if (_changes[id].head) {
62703                         result.add(id);
62704                     }
62705
62706                     var h = _changes[id].head;
62707                     var b = _changes[id].base;
62708                     var entity = h || b;
62709
62710                     if (includeRelMembers && entity.type === 'relation') {
62711                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62712                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62713                         utilArrayUnion(mh, mb).forEach(function(memberID) {
62714                             if (head.hasEntity(memberID)) {
62715                                 result.add(memberID);
62716                             }
62717                         });
62718                     }
62719                 });
62720
62721                 return Array.from(result);
62722             };
62723
62724
62725             _diff.modified = function modified() {
62726                 var result = [];
62727                 Object.values(_changes).forEach(function(change) {
62728                     if (change.base && change.head) {
62729                         result.push(change.head);
62730                     }
62731                 });
62732                 return result;
62733             };
62734
62735
62736             _diff.created = function created() {
62737                 var result = [];
62738                 Object.values(_changes).forEach(function(change) {
62739                     if (!change.base && change.head) {
62740                         result.push(change.head);
62741                     }
62742                 });
62743                 return result;
62744             };
62745
62746
62747             _diff.deleted = function deleted() {
62748                 var result = [];
62749                 Object.values(_changes).forEach(function(change) {
62750                     if (change.base && !change.head) {
62751                         result.push(change.base);
62752                     }
62753                 });
62754                 return result;
62755             };
62756
62757
62758             _diff.summary = function summary() {
62759                 var relevant = {};
62760
62761                 var keys = Object.keys(_changes);
62762                 for (var i = 0; i < keys.length; i++) {
62763                     var change = _changes[keys[i]];
62764
62765                     if (change.head && change.head.geometry(head) !== 'vertex') {
62766                         addEntity(change.head, head, change.base ? 'modified' : 'created');
62767
62768                     } else if (change.base && change.base.geometry(base) !== 'vertex') {
62769                         addEntity(change.base, base, 'deleted');
62770
62771                     } else if (change.base && change.head) { // modified vertex
62772                         var moved    = !fastDeepEqual(change.base.loc,  change.head.loc);
62773                         var retagged = !fastDeepEqual(change.base.tags, change.head.tags);
62774
62775                         if (moved) {
62776                             addParents(change.head);
62777                         }
62778
62779                         if (retagged || (moved && change.head.hasInterestingTags())) {
62780                             addEntity(change.head, head, 'modified');
62781                         }
62782
62783                     } else if (change.head && change.head.hasInterestingTags()) { // created vertex
62784                         addEntity(change.head, head, 'created');
62785
62786                     } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
62787                         addEntity(change.base, base, 'deleted');
62788                     }
62789                 }
62790
62791                 return Object.values(relevant);
62792
62793
62794                 function addEntity(entity, graph, changeType) {
62795                     relevant[entity.id] = {
62796                         entity: entity,
62797                         graph: graph,
62798                         changeType: changeType
62799                     };
62800                 }
62801
62802                 function addParents(entity) {
62803                     var parents = head.parentWays(entity);
62804                     for (var j = parents.length - 1; j >= 0; j--) {
62805                         var parent = parents[j];
62806                         if (!(parent.id in relevant)) {
62807                             addEntity(parent, head, 'modified');
62808                         }
62809                     }
62810                 }
62811             };
62812
62813
62814             // returns complete set of entities that require a redraw
62815             //  (optionally within given `extent`)
62816             _diff.complete = function complete(extent) {
62817                 var result = {};
62818                 var id, change;
62819
62820                 for (id in _changes) {
62821                     change = _changes[id];
62822
62823                     var h = change.head;
62824                     var b = change.base;
62825                     var entity = h || b;
62826                     var i;
62827
62828                     if (extent &&
62829                         (!h || !h.intersects(extent, head)) &&
62830                         (!b || !b.intersects(extent, base)))
62831                         continue;
62832
62833                     result[id] = h;
62834
62835                     if (entity.type === 'way') {
62836                         var nh = h ? h.nodes : [];
62837                         var nb = b ? b.nodes : [];
62838                         var diff;
62839
62840                         diff = utilArrayDifference(nh, nb);
62841                         for (i = 0; i < diff.length; i++) {
62842                             result[diff[i]] = head.hasEntity(diff[i]);
62843                         }
62844
62845                         diff = utilArrayDifference(nb, nh);
62846                         for (i = 0; i < diff.length; i++) {
62847                             result[diff[i]] = head.hasEntity(diff[i]);
62848                         }
62849                     }
62850
62851                     if (entity.type === 'relation' && entity.isMultipolygon()) {
62852                         var mh = h ? h.members.map(function(m) { return m.id; }) : [];
62853                         var mb = b ? b.members.map(function(m) { return m.id; }) : [];
62854                         var ids = utilArrayUnion(mh, mb);
62855                         for (i = 0; i < ids.length; i++) {
62856                             var member = head.hasEntity(ids[i]);
62857                             if (!member) continue;   // not downloaded
62858                             if (extent && !member.intersects(extent, head)) continue;   // not visible
62859                             result[ids[i]] = member;
62860                         }
62861                     }
62862
62863                     addParents(head.parentWays(entity), result);
62864                     addParents(head.parentRelations(entity), result);
62865                 }
62866
62867                 return result;
62868
62869
62870                 function addParents(parents, result) {
62871                     for (var i = 0; i < parents.length; i++) {
62872                         var parent = parents[i];
62873                         if (parent.id in result) continue;
62874
62875                         result[parent.id] = parent;
62876                         addParents(head.parentRelations(parent), result);
62877                     }
62878                 }
62879             };
62880
62881
62882             return _diff;
62883         }
62884
62885         function coreTree(head) {
62886             var rtree = rbush_1();
62887             var bboxes = {};
62888             var tree = {};
62889
62890
62891             function entityBBox(entity) {
62892                 var bbox = entity.extent(head).bbox();
62893                 bbox.id = entity.id;
62894                 bboxes[entity.id] = bbox;
62895                 return bbox;
62896             }
62897
62898
62899             function updateParents(entity, insertions, memo) {
62900                 head.parentWays(entity).forEach(function(way) {
62901                     if (bboxes[way.id]) {
62902                         rtree.remove(bboxes[way.id]);
62903                         insertions[way.id] = way;
62904                     }
62905                     updateParents(way, insertions, memo);
62906                 });
62907
62908                 head.parentRelations(entity).forEach(function(relation) {
62909                     if (memo[entity.id]) return;
62910                     memo[entity.id] = true;
62911                     if (bboxes[relation.id]) {
62912                         rtree.remove(bboxes[relation.id]);
62913                         insertions[relation.id] = relation;
62914                     }
62915                     updateParents(relation, insertions, memo);
62916                 });
62917             }
62918
62919
62920             tree.rebase = function(entities, force) {
62921                 var insertions = {};
62922
62923                 for (var i = 0; i < entities.length; i++) {
62924                     var entity = entities[i];
62925                     if (!entity.visible) continue;
62926
62927                     if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
62928                         if (!force) {
62929                             continue;
62930                         } else if (bboxes[entity.id]) {
62931                             rtree.remove(bboxes[entity.id]);
62932                         }
62933                     }
62934
62935                     insertions[entity.id] = entity;
62936                     updateParents(entity, insertions, {});
62937                 }
62938
62939                 rtree.load(Object.values(insertions).map(entityBBox));
62940
62941                 return tree;
62942             };
62943
62944
62945             tree.intersects = function(extent, graph) {
62946                 if (graph !== head) {
62947                     var diff = coreDifference(head, graph);
62948                     var changed = diff.didChange;
62949
62950                     if (changed.addition || changed.deletion || changed.geometry) {
62951                         var insertions = {};
62952                         head = graph;
62953
62954                         if (changed.deletion) {
62955                             diff.deleted().forEach(function(entity) {
62956                                 rtree.remove(bboxes[entity.id]);
62957                                 delete bboxes[entity.id];
62958                             });
62959                         }
62960
62961                         if (changed.geometry) {
62962                             diff.modified().forEach(function(entity) {
62963                                 rtree.remove(bboxes[entity.id]);
62964                                 insertions[entity.id] = entity;
62965                                 updateParents(entity, insertions, {});
62966                             });
62967                         }
62968
62969                         if (changed.addition) {
62970                             diff.created().forEach(function(entity) {
62971                                 insertions[entity.id] = entity;
62972                             });
62973                         }
62974
62975                         rtree.load(Object.values(insertions).map(entityBBox));
62976                     }
62977                 }
62978
62979                 return rtree.search(extent.bbox())
62980                     .map(function(bbox) { return graph.entity(bbox.id); });
62981             };
62982
62983
62984             return tree;
62985         }
62986
62987         function uiModal(selection, blocking) {
62988             var keybinding = utilKeybinding('modal');
62989             var previous = selection.select('div.modal');
62990             var animate = previous.empty();
62991
62992             previous.transition()
62993                 .duration(200)
62994                 .style('opacity', 0)
62995                 .remove();
62996
62997             var shaded = selection
62998                 .append('div')
62999                 .attr('class', 'shaded')
63000                 .style('opacity', 0);
63001
63002             shaded.close = function() {
63003                 shaded
63004                     .transition()
63005                     .duration(200)
63006                     .style('opacity',0)
63007                     .remove();
63008
63009                 modal
63010                     .transition()
63011                     .duration(200)
63012                     .style('top','0px');
63013
63014                 d3_select(document)
63015                     .call(keybinding.unbind);
63016             };
63017
63018
63019             var modal = shaded
63020                 .append('div')
63021                 .attr('class', 'modal fillL');
63022
63023             if (!blocking) {
63024                 shaded.on('click.remove-modal', function() {
63025                     if (event.target === this) {
63026                         shaded.close();
63027                     }
63028                 });
63029
63030                 modal.append('button')
63031                     .attr('class', 'close')
63032                     .on('click', shaded.close)
63033                     .call(svgIcon('#iD-icon-close'));
63034
63035                 keybinding
63036                     .on('⌫', shaded.close)
63037                     .on('⎋', shaded.close);
63038
63039                 d3_select(document)
63040                     .call(keybinding);
63041             }
63042
63043             modal
63044                 .append('div')
63045                 .attr('class', 'content');
63046
63047             if (animate) {
63048                 shaded.transition().style('opacity', 1);
63049             } else {
63050                 shaded.style('opacity', 1);
63051             }
63052
63053
63054             return shaded;
63055         }
63056
63057         function uiLoading(context) {
63058             var _modalSelection = d3_select(null);
63059             var _message = '';
63060             var _blocking = false;
63061
63062
63063             var loading = function(selection) {
63064                 _modalSelection = uiModal(selection, _blocking);
63065
63066                 var loadertext = _modalSelection.select('.content')
63067                     .classed('loading-modal', true)
63068                     .append('div')
63069                     .attr('class', 'modal-section fillL');
63070
63071                 loadertext
63072                     .append('img')
63073                     .attr('class', 'loader')
63074                     .attr('src', context.imagePath('loader-white.gif'));
63075
63076                 loadertext
63077                     .append('h3')
63078                     .text(_message);
63079
63080                 _modalSelection.select('button.close')
63081                     .attr('class', 'hide');
63082
63083                 return loading;
63084             };
63085
63086
63087             loading.message = function(_) {
63088                 if (!arguments.length) return _message;
63089                 _message = _;
63090                 return loading;
63091             };
63092
63093
63094             loading.blocking = function(_) {
63095                 if (!arguments.length) return _blocking;
63096                 _blocking = _;
63097                 return loading;
63098             };
63099
63100
63101             loading.close = function() {
63102                 _modalSelection.remove();
63103             };
63104
63105
63106             return loading;
63107         }
63108
63109         function coreHistory(context) {
63110             var dispatch$1 = dispatch('change', 'merge', 'restore', 'undone', 'redone');
63111             var lock = utilSessionMutex('lock');
63112             var duration = 150;
63113             var _imageryUsed = [];
63114             var _photoOverlaysUsed = [];
63115             var _checkpoints = {};
63116             var _pausedGraph;
63117             var _stack;
63118             var _index;
63119             var _tree;
63120
63121
63122             // internal _act, accepts list of actions and eased time
63123             function _act(actions, t) {
63124                 actions = Array.prototype.slice.call(actions);
63125
63126                 var annotation;
63127                 if (typeof actions[actions.length - 1] !== 'function') {
63128                     annotation = actions.pop();
63129                 }
63130
63131                 var graph = _stack[_index].graph;
63132                 for (var i = 0; i < actions.length; i++) {
63133                     graph = actions[i](graph, t);
63134                 }
63135
63136                 return {
63137                     graph: graph,
63138                     annotation: annotation,
63139                     imageryUsed: _imageryUsed,
63140                     photoOverlaysUsed: _photoOverlaysUsed,
63141                     transform: context.projection.transform(),
63142                     selectedIDs: context.selectedIDs()
63143                 };
63144             }
63145
63146
63147             // internal _perform with eased time
63148             function _perform(args, t) {
63149                 var previous = _stack[_index].graph;
63150                 _stack = _stack.slice(0, _index + 1);
63151                 var actionResult = _act(args, t);
63152                 _stack.push(actionResult);
63153                 _index++;
63154                 return change(previous);
63155             }
63156
63157
63158             // internal _replace with eased time
63159             function _replace(args, t) {
63160                 var previous = _stack[_index].graph;
63161                 // assert(_index == _stack.length - 1)
63162                 var actionResult = _act(args, t);
63163                 _stack[_index] = actionResult;
63164                 return change(previous);
63165             }
63166
63167
63168             // internal _overwrite with eased time
63169             function _overwrite(args, t) {
63170                 var previous = _stack[_index].graph;
63171                 if (_index > 0) {
63172                     _index--;
63173                     _stack.pop();
63174                 }
63175                 _stack = _stack.slice(0, _index + 1);
63176                 var actionResult = _act(args, t);
63177                 _stack.push(actionResult);
63178                 _index++;
63179                 return change(previous);
63180             }
63181
63182
63183             // determine difference and dispatch a change event
63184             function change(previous) {
63185                 var difference = coreDifference(previous, history.graph());
63186                 if (!_pausedGraph) {
63187                     dispatch$1.call('change', this, difference);
63188                 }
63189                 return difference;
63190             }
63191
63192
63193             // iD uses namespaced keys so multiple installations do not conflict
63194             function getKey(n) {
63195                 return 'iD_' + window.location.origin + '_' + n;
63196             }
63197
63198
63199             var history = {
63200
63201                 graph: function() {
63202                     return _stack[_index].graph;
63203                 },
63204
63205
63206                 tree: function() {
63207                     return _tree;
63208                 },
63209
63210
63211                 base: function() {
63212                     return _stack[0].graph;
63213                 },
63214
63215
63216                 merge: function(entities, extent) {
63217                     var stack = _stack.map(function(state) { return state.graph; });
63218                     _stack[0].graph.rebase(entities, stack, false);
63219                     _tree.rebase(entities, false);
63220
63221                     dispatch$1.call('merge', this, entities);
63222                 },
63223
63224
63225                 perform: function() {
63226                     // complete any transition already in progress
63227                     d3_select(document).interrupt('history.perform');
63228
63229                     var transitionable = false;
63230                     var action0 = arguments[0];
63231
63232                     if (arguments.length === 1 ||
63233                         (arguments.length === 2 && (typeof arguments[1] !== 'function'))) {
63234                         transitionable = !!action0.transitionable;
63235                     }
63236
63237                     if (transitionable) {
63238                         var origArguments = arguments;
63239                         d3_select(document)
63240                             .transition('history.perform')
63241                             .duration(duration)
63242                             .ease(linear$1)
63243                             .tween('history.tween', function() {
63244                                 return function(t) {
63245                                     if (t < 1) _overwrite([action0], t);
63246                                 };
63247                             })
63248                             .on('start', function() {
63249                                 _perform([action0], 0);
63250                             })
63251                             .on('end interrupt', function() {
63252                                 _overwrite(origArguments, 1);
63253                             });
63254
63255                     } else {
63256                         return _perform(arguments);
63257                     }
63258                 },
63259
63260
63261                 replace: function() {
63262                     d3_select(document).interrupt('history.perform');
63263                     return _replace(arguments, 1);
63264                 },
63265
63266
63267                 // Same as calling pop and then perform
63268                 overwrite: function() {
63269                     d3_select(document).interrupt('history.perform');
63270                     return _overwrite(arguments, 1);
63271                 },
63272
63273
63274                 pop: function(n) {
63275                     d3_select(document).interrupt('history.perform');
63276
63277                     var previous = _stack[_index].graph;
63278                     if (isNaN(+n) || +n < 0) {
63279                         n = 1;
63280                     }
63281                     while (n-- > 0 && _index > 0) {
63282                         _index--;
63283                         _stack.pop();
63284                     }
63285                     return change(previous);
63286                 },
63287
63288
63289                 // Back to the previous annotated state or _index = 0.
63290                 undo: function() {
63291                     d3_select(document).interrupt('history.perform');
63292
63293                     var previousStack = _stack[_index];
63294                     var previous = previousStack.graph;
63295                     while (_index > 0) {
63296                         _index--;
63297                         if (_stack[_index].annotation) break;
63298                     }
63299
63300                     dispatch$1.call('undone', this, _stack[_index], previousStack);
63301                     return change(previous);
63302                 },
63303
63304
63305                 // Forward to the next annotated state.
63306                 redo: function() {
63307                     d3_select(document).interrupt('history.perform');
63308
63309                     var previousStack = _stack[_index];
63310                     var previous = previousStack.graph;
63311                     var tryIndex = _index;
63312                     while (tryIndex < _stack.length - 1) {
63313                         tryIndex++;
63314                         if (_stack[tryIndex].annotation) {
63315                             _index = tryIndex;
63316                             dispatch$1.call('redone', this, _stack[_index], previousStack);
63317                             break;
63318                         }
63319                     }
63320
63321                     return change(previous);
63322                 },
63323
63324
63325                 pauseChangeDispatch: function() {
63326                     if (!_pausedGraph) {
63327                         _pausedGraph = _stack[_index].graph;
63328                     }
63329                 },
63330
63331
63332                 resumeChangeDispatch: function() {
63333                     if (_pausedGraph) {
63334                         var previous = _pausedGraph;
63335                         _pausedGraph = null;
63336                         return change(previous);
63337                     }
63338                 },
63339
63340
63341                 undoAnnotation: function() {
63342                     var i = _index;
63343                     while (i >= 0) {
63344                         if (_stack[i].annotation) return _stack[i].annotation;
63345                         i--;
63346                     }
63347                 },
63348
63349
63350                 redoAnnotation: function() {
63351                     var i = _index + 1;
63352                     while (i <= _stack.length - 1) {
63353                         if (_stack[i].annotation) return _stack[i].annotation;
63354                         i++;
63355                     }
63356                 },
63357
63358
63359                 intersects: function(extent) {
63360                     return _tree.intersects(extent, _stack[_index].graph);
63361                 },
63362
63363
63364                 difference: function() {
63365                     var base = _stack[0].graph;
63366                     var head = _stack[_index].graph;
63367                     return coreDifference(base, head);
63368                 },
63369
63370
63371                 changes: function(action) {
63372                     var base = _stack[0].graph;
63373                     var head = _stack[_index].graph;
63374
63375                     if (action) {
63376                         head = action(head);
63377                     }
63378
63379                     var difference = coreDifference(base, head);
63380
63381                     return {
63382                         modified: difference.modified(),
63383                         created: difference.created(),
63384                         deleted: difference.deleted()
63385                     };
63386                 },
63387
63388
63389                 hasChanges: function() {
63390                     return this.difference().length() > 0;
63391                 },
63392
63393
63394                 imageryUsed: function(sources) {
63395                     if (sources) {
63396                         _imageryUsed = sources;
63397                         return history;
63398                     } else {
63399                         var s = new Set();
63400                         _stack.slice(1, _index + 1).forEach(function(state) {
63401                             state.imageryUsed.forEach(function(source) {
63402                                 if (source !== 'Custom') {
63403                                     s.add(source);
63404                                 }
63405                             });
63406                         });
63407                         return Array.from(s);
63408                     }
63409                 },
63410
63411
63412                 photoOverlaysUsed: function(sources) {
63413                     if (sources) {
63414                         _photoOverlaysUsed = sources;
63415                         return history;
63416                     } else {
63417                         var s = new Set();
63418                         _stack.slice(1, _index + 1).forEach(function(state) {
63419                             state.photoOverlaysUsed.forEach(function(photoOverlay) {
63420                                 s.add(photoOverlay);
63421                             });
63422                         });
63423                         return Array.from(s);
63424                     }
63425                 },
63426
63427
63428                 // save the current history state
63429                 checkpoint: function(key) {
63430                     _checkpoints[key] = {
63431                         stack: _stack,
63432                         index: _index
63433                     };
63434                     return history;
63435                 },
63436
63437
63438                 // restore history state to a given checkpoint or reset completely
63439                 reset: function(key) {
63440                     if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
63441                         _stack = _checkpoints[key].stack;
63442                         _index = _checkpoints[key].index;
63443                     } else {
63444                         _stack = [{graph: coreGraph()}];
63445                         _index = 0;
63446                         _tree = coreTree(_stack[0].graph);
63447                         _checkpoints = {};
63448                     }
63449                     dispatch$1.call('change');
63450                     return history;
63451                 },
63452
63453
63454                 // `toIntroGraph()` is used to export the intro graph used by the walkthrough.
63455                 //
63456                 // To use it:
63457                 //  1. Start the walkthrough.
63458                 //  2. Get to a "free editing" tutorial step
63459                 //  3. Make your edits to the walkthrough map
63460                 //  4. In your browser dev console run:
63461                 //        `id.history().toIntroGraph()`
63462                 //  5. This outputs stringified JSON to the browser console
63463                 //  6. Copy it to `data/intro_graph.json` and prettify it in your code editor
63464                 toIntroGraph: function() {
63465                     var nextID = { n: 0, r: 0, w: 0 };
63466                     var permIDs = {};
63467                     var graph = this.graph();
63468                     var baseEntities = {};
63469
63470                     // clone base entities..
63471                     Object.values(graph.base().entities).forEach(function(entity) {
63472                         var copy = copyIntroEntity(entity);
63473                         baseEntities[copy.id] = copy;
63474                     });
63475
63476                     // replace base entities with head entities..
63477                     Object.keys(graph.entities).forEach(function(id) {
63478                         var entity = graph.entities[id];
63479                         if (entity) {
63480                             var copy = copyIntroEntity(entity);
63481                             baseEntities[copy.id] = copy;
63482                         } else {
63483                             delete baseEntities[id];
63484                         }
63485                     });
63486
63487                     // swap temporary for permanent ids..
63488                     Object.values(baseEntities).forEach(function(entity) {
63489                         if (Array.isArray(entity.nodes)) {
63490                             entity.nodes = entity.nodes.map(function(node) {
63491                                 return permIDs[node] || node;
63492                             });
63493                         }
63494                         if (Array.isArray(entity.members)) {
63495                             entity.members = entity.members.map(function(member) {
63496                                 member.id = permIDs[member.id] || member.id;
63497                                 return member;
63498                             });
63499                         }
63500                     });
63501
63502                     return JSON.stringify({ dataIntroGraph: baseEntities });
63503
63504
63505                     function copyIntroEntity(source) {
63506                         var copy = utilObjectOmit(source, ['type', 'user', 'v', 'version', 'visible']);
63507
63508                         // Note: the copy is no longer an osmEntity, so it might not have `tags`
63509                         if (copy.tags && !Object.keys(copy.tags)) {
63510                             delete copy.tags;
63511                         }
63512
63513                         if (Array.isArray(copy.loc)) {
63514                             copy.loc[0] = +copy.loc[0].toFixed(6);
63515                             copy.loc[1] = +copy.loc[1].toFixed(6);
63516                         }
63517
63518                         var match = source.id.match(/([nrw])-\d*/);  // temporary id
63519                         if (match !== null) {
63520                             var nrw = match[1];
63521                             var permID;
63522                             do { permID = nrw + (++nextID[nrw]); }
63523                             while (baseEntities.hasOwnProperty(permID));
63524
63525                             copy.id = permIDs[source.id] = permID;
63526                         }
63527                         return copy;
63528                     }
63529                 },
63530
63531
63532                 toJSON: function() {
63533                     if (!this.hasChanges()) return;
63534
63535                     var allEntities = {};
63536                     var baseEntities = {};
63537                     var base = _stack[0];
63538
63539                     var s = _stack.map(function(i) {
63540                         var modified = [];
63541                         var deleted = [];
63542
63543                         Object.keys(i.graph.entities).forEach(function(id) {
63544                             var entity = i.graph.entities[id];
63545                             if (entity) {
63546                                 var key = osmEntity.key(entity);
63547                                 allEntities[key] = entity;
63548                                 modified.push(key);
63549                             } else {
63550                                 deleted.push(id);
63551                             }
63552
63553                             // make sure that the originals of changed or deleted entities get merged
63554                             // into the base of the _stack after restoring the data from JSON.
63555                             if (id in base.graph.entities) {
63556                                 baseEntities[id] = base.graph.entities[id];
63557                             }
63558                             if (entity && entity.nodes) {
63559                                 // get originals of pre-existing child nodes
63560                                 entity.nodes.forEach(function(nodeID) {
63561                                     if (nodeID in base.graph.entities) {
63562                                         baseEntities[nodeID] = base.graph.entities[nodeID];
63563                                     }
63564                                 });
63565                             }
63566                             // get originals of parent entities too
63567                             var baseParents = base.graph._parentWays[id];
63568                             if (baseParents) {
63569                                 baseParents.forEach(function(parentID) {
63570                                     if (parentID in base.graph.entities) {
63571                                         baseEntities[parentID] = base.graph.entities[parentID];
63572                                     }
63573                                 });
63574                             }
63575                         });
63576
63577                         var x = {};
63578
63579                         if (modified.length) x.modified = modified;
63580                         if (deleted.length) x.deleted = deleted;
63581                         if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
63582                         if (i.photoOverlaysUsed) x.photoOverlaysUsed = i.photoOverlaysUsed;
63583                         if (i.annotation) x.annotation = i.annotation;
63584                         if (i.transform) x.transform = i.transform;
63585                         if (i.selectedIDs) x.selectedIDs = i.selectedIDs;
63586
63587                         return x;
63588                     });
63589
63590                     return JSON.stringify({
63591                         version: 3,
63592                         entities: Object.values(allEntities),
63593                         baseEntities: Object.values(baseEntities),
63594                         stack: s,
63595                         nextIDs: osmEntity.id.next,
63596                         index: _index
63597                     });
63598                 },
63599
63600
63601                 fromJSON: function(json, loadChildNodes) {
63602                     var h = JSON.parse(json);
63603                     var loadComplete = true;
63604
63605                     osmEntity.id.next = h.nextIDs;
63606                     _index = h.index;
63607
63608                     if (h.version === 2 || h.version === 3) {
63609                         var allEntities = {};
63610
63611                         h.entities.forEach(function(entity) {
63612                             allEntities[osmEntity.key(entity)] = osmEntity(entity);
63613                         });
63614
63615                         if (h.version === 3) {
63616                             // This merges originals for changed entities into the base of
63617                             // the _stack even if the current _stack doesn't have them (for
63618                             // example when iD has been restarted in a different region)
63619                             var baseEntities = h.baseEntities.map(function(d) { return osmEntity(d); });
63620                             var stack = _stack.map(function(state) { return state.graph; });
63621                             _stack[0].graph.rebase(baseEntities, stack, true);
63622                             _tree.rebase(baseEntities, true);
63623
63624                             // When we restore a modified way, we also need to fetch any missing
63625                             // childnodes that would normally have been downloaded with it.. #2142
63626                             if (loadChildNodes) {
63627                                 var osm = context.connection();
63628                                 var baseWays = baseEntities
63629                                     .filter(function(e) { return e.type === 'way'; });
63630                                 var nodeIDs = baseWays
63631                                     .reduce(function(acc, way) { return utilArrayUnion(acc, way.nodes); }, []);
63632                                 var missing = nodeIDs
63633                                     .filter(function(n) { return !_stack[0].graph.hasEntity(n); });
63634
63635                                 if (missing.length && osm) {
63636                                     loadComplete = false;
63637                                     context.redrawEnable(false);
63638
63639                                     var loading = uiLoading(context).blocking(true);
63640                                     context.container().call(loading);
63641
63642                                     var childNodesLoaded = function(err, result) {
63643                                         if (!err) {
63644                                             var visibleGroups = utilArrayGroupBy(result.data, 'visible');
63645                                             var visibles = visibleGroups.true || [];      // alive nodes
63646                                             var invisibles = visibleGroups.false || [];   // deleted nodes
63647
63648                                             if (visibles.length) {
63649                                                 var visibleIDs = visibles.map(function(entity) { return entity.id; });
63650                                                 var stack = _stack.map(function(state) { return state.graph; });
63651                                                 missing = utilArrayDifference(missing, visibleIDs);
63652                                                 _stack[0].graph.rebase(visibles, stack, true);
63653                                                 _tree.rebase(visibles, true);
63654                                             }
63655
63656                                             // fetch older versions of nodes that were deleted..
63657                                             invisibles.forEach(function(entity) {
63658                                                 osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
63659                                             });
63660                                         }
63661
63662                                         if (err || !missing.length) {
63663                                             loading.close();
63664                                             context.redrawEnable(true);
63665                                             dispatch$1.call('change');
63666                                             dispatch$1.call('restore', this);
63667                                         }
63668                                     };
63669
63670                                     osm.loadMultiple(missing, childNodesLoaded);
63671                                 }
63672                             }
63673                         }
63674
63675                         _stack = h.stack.map(function(d) {
63676                             var entities = {}, entity;
63677
63678                             if (d.modified) {
63679                                 d.modified.forEach(function(key) {
63680                                     entity = allEntities[key];
63681                                     entities[entity.id] = entity;
63682                                 });
63683                             }
63684
63685                             if (d.deleted) {
63686                                 d.deleted.forEach(function(id) {
63687                                     entities[id] = undefined;
63688                                 });
63689                             }
63690
63691                             return {
63692                                 graph: coreGraph(_stack[0].graph).load(entities),
63693                                 annotation: d.annotation,
63694                                 imageryUsed: d.imageryUsed,
63695                                 photoOverlaysUsed: d.photoOverlaysUsed,
63696                                 transform: d.transform,
63697                                 selectedIDs: d.selectedIDs
63698                             };
63699                         });
63700
63701                     } else { // original version
63702                         _stack = h.stack.map(function(d) {
63703                             var entities = {};
63704
63705                             for (var i in d.entities) {
63706                                 var entity = d.entities[i];
63707                                 entities[i] = entity === 'undefined' ? undefined : osmEntity(entity);
63708                             }
63709
63710                             d.graph = coreGraph(_stack[0].graph).load(entities);
63711                             return d;
63712                         });
63713                     }
63714
63715                     var transform = _stack[_index].transform;
63716                     if (transform) {
63717                         context.map().transformEase(transform, 0);   // 0 = immediate, no easing
63718                     }
63719
63720                     if (loadComplete) {
63721                         dispatch$1.call('change');
63722                         dispatch$1.call('restore', this);
63723                     }
63724
63725                     return history;
63726                 },
63727
63728
63729                 save: function() {
63730                     if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
63731                     return history;
63732                 },
63733
63734
63735                 clearSaved: function() {
63736                     context.debouncedSave.cancel();
63737                     if (lock.locked()) context.storage(getKey('saved_history'), null);
63738                     return history;
63739                 },
63740
63741
63742                 lock: function() {
63743                     return lock.lock();
63744                 },
63745
63746
63747                 unlock: function() {
63748                     lock.unlock();
63749                 },
63750
63751
63752                 // is iD not open in another window and it detects that
63753                 // there's a history stored in localStorage that's recoverable?
63754                 restorableChanges: function() {
63755                     return lock.locked() && !!context.storage(getKey('saved_history'));
63756                 },
63757
63758
63759                 // load history from a version stored in localStorage
63760                 restore: function() {
63761                     if (!lock.locked()) return;
63762
63763                     var json = context.storage(getKey('saved_history'));
63764                     if (json) history.fromJSON(json, true);
63765                 },
63766
63767
63768                 _getKey: getKey
63769
63770             };
63771
63772
63773             history.reset();
63774
63775             return utilRebind(history, dispatch$1, 'on');
63776         }
63777
63778         /**
63779          * Look for roads that can be connected to other roads with a short extension
63780          */
63781         function validationAlmostJunction() {
63782             var type = 'almost_junction';
63783
63784
63785             function isHighway(entity) {
63786                 return entity.type === 'way' &&
63787                     osmRoutableHighwayTagValues[entity.tags.highway];
63788             }
63789
63790             function isTaggedAsNotContinuing(node) {
63791                 return node.tags.noexit === 'yes' ||
63792                     node.tags.amenity === 'parking_entrance' ||
63793                     (node.tags.entrance && node.tags.entrance !== 'no');
63794             }
63795
63796
63797             var validation = function checkAlmostJunction(entity, context) {
63798                 if (!isHighway(entity)) return [];
63799                 if (entity.isDegenerate()) return [];
63800
63801                 var graph = context.graph();
63802                 var tree = context.history().tree();
63803                 var issues = [];
63804
63805                 var extendableNodeInfos = findConnectableEndNodesByExtension(entity);
63806                 extendableNodeInfos.forEach(function(extendableNodeInfo) {
63807                     var node = extendableNodeInfo.node;
63808                     var edgeHighway = graph.entity(extendableNodeInfo.wid);
63809
63810                     var fixes = [new validationIssueFix({
63811                         icon: 'iD-icon-abutment',
63812                         title: t('issues.fix.connect_features.title'),
63813                         onClick: function() {
63814                             var endNodeId = this.issue.entityIds[1];
63815                             var endNode = context.entity(endNodeId);
63816                             var targetEdge = this.issue.data.edge;
63817                             var crossLoc = this.issue.data.cross_loc;
63818                             var edgeNodes = [context.entity(targetEdge[0]), context.entity(targetEdge[1])];
63819                             var closestNodeInfo = geoSphericalClosestNode(edgeNodes, crossLoc);
63820
63821                             var annotation = t('issues.fix.connect_almost_junction.annotation');
63822                             // already a point nearby, just connect to that
63823                             if (closestNodeInfo.distance < 0.75) {
63824                                 context.perform(
63825                                     actionMergeNodes([closestNodeInfo.node.id, endNode.id], closestNodeInfo.node.loc),
63826                                     annotation
63827                                 );
63828                             // else add the end node to the edge way
63829                             } else {
63830                                 context.perform(
63831                                     actionAddMidpoint({loc: crossLoc, edge: targetEdge}, endNode),
63832                                     annotation
63833                                 );
63834                             }
63835                         }
63836                     })];
63837
63838                     if (Object.keys(node.tags).length === 0) {
63839                         // node has no tags, suggest noexit fix
63840                         fixes.push(new validationIssueFix({
63841                             icon: 'maki-barrier',
63842                             title: t('issues.fix.tag_as_disconnected.title'),
63843                             onClick: function() {
63844                                 var nodeID = this.issue.entityIds[1];
63845                                 context.perform(
63846                                     actionChangeTags(nodeID, { noexit: 'yes' }),
63847                                     t('issues.fix.tag_as_disconnected.annotation')
63848                                 );
63849                             }
63850                         }));
63851                     }
63852
63853                     issues.push(new validationIssue({
63854                         type: type,
63855                         severity: 'warning',
63856                         message: function() {
63857                             var entity1 = context.hasEntity(this.entityIds[0]);
63858                             if (this.entityIds[0] === this.entityIds[2]) {
63859                                 return entity1 ? t('issues.almost_junction.self.message', {
63860                                     feature: utilDisplayLabel(entity1, context)
63861                                 }) : '';
63862                             } else {
63863                                 var entity2 = context.hasEntity(this.entityIds[2]);
63864                                 return (entity1 && entity2) ? t('issues.almost_junction.message', {
63865                                     feature: utilDisplayLabel(entity1, context),
63866                                     feature2: utilDisplayLabel(entity2, context)
63867                                 }) : '';
63868                             }
63869                         },
63870                         reference: showReference,
63871                         entityIds: [entity.id, node.id, edgeHighway.id],
63872                         loc: extendableNodeInfo.node.loc,
63873                         hash: JSON.stringify(extendableNodeInfo.node.loc),
63874                         data: {
63875                             edge: extendableNodeInfo.edge,
63876                             cross_loc: extendableNodeInfo.cross_loc
63877                         },
63878                         fixes: fixes
63879                     }));
63880                 });
63881
63882                 return issues;
63883
63884
63885                 function showReference(selection) {
63886                     selection.selectAll('.issue-reference')
63887                         .data([0])
63888                         .enter()
63889                         .append('div')
63890                         .attr('class', 'issue-reference')
63891                         .text(t('issues.almost_junction.highway-highway.reference'));
63892                 }
63893
63894
63895                 function isExtendableCandidate(node, way) {
63896                     // can not accurately test vertices on tiles not downloaded from osm - #5938
63897                     var osm = context.connection();
63898                     if (osm && !osm.isDataLoaded(node.loc)) {
63899                         return false;
63900                     }
63901                     if (isTaggedAsNotContinuing(node) || graph.parentWays(node).length !== 1) {
63902                         return false;
63903                     }
63904
63905                     var occurences = 0;
63906                     for (var index in way.nodes) {
63907                         if (way.nodes[index] === node.id) {
63908                             occurences += 1;
63909                             if (occurences > 1) {
63910                                 return false;
63911                             }
63912                         }
63913                     }
63914                     return true;
63915                 }
63916
63917
63918                 function findConnectableEndNodesByExtension(way) {
63919                     var results = [];
63920                     if (way.isClosed()) return results;
63921
63922                     var testNodes;
63923                     var indices = [0, way.nodes.length - 1];
63924                     indices.forEach(function(nodeIndex) {
63925                         var nodeID = way.nodes[nodeIndex];
63926                         var node = graph.entity(nodeID);
63927
63928                         if (!isExtendableCandidate(node, way)) return;
63929
63930                         var connectionInfo = canConnectByExtend(way, nodeIndex);
63931                         if (!connectionInfo) return;
63932
63933                         testNodes = graph.childNodes(way).slice();   // shallow copy
63934                         testNodes[nodeIndex] = testNodes[nodeIndex].move(connectionInfo.cross_loc);
63935
63936                         // don't flag issue if connecting the ways would cause self-intersection
63937                         if (geoHasSelfIntersections(testNodes, nodeID)) return;
63938
63939                         results.push(connectionInfo);
63940                     });
63941
63942                     return results;
63943                 }
63944
63945                 function hasTag(tags, key) {
63946                     return tags[key] !== undefined && tags[key] !== 'no';
63947                 }
63948
63949                 function canConnectWays(way, way2) {
63950
63951                     // allow self-connections
63952                     if (way.id === way2.id) return true;
63953
63954                     // if one is bridge or tunnel, both must be bridge or tunnel
63955                     if ((hasTag(way.tags, 'bridge') || hasTag(way2.tags, 'bridge')) &&
63956                         !(hasTag(way.tags, 'bridge') && hasTag(way2.tags, 'bridge'))) return false;
63957                     if ((hasTag(way.tags, 'tunnel') || hasTag(way2.tags, 'tunnel')) &&
63958                         !(hasTag(way.tags, 'tunnel') && hasTag(way2.tags, 'tunnel'))) return false;
63959
63960                     // must have equivalent layers and levels
63961                     var layer1 = way.tags.layer || '0',
63962                         layer2 = way2.tags.layer || '0';
63963                     if (layer1 !== layer2) return false;
63964
63965                     var level1 = way.tags.level || '0',
63966                         level2 = way2.tags.level || '0';
63967                     if (level1 !== level2) return false;
63968
63969                     return true;
63970                 }
63971
63972
63973                 function canConnectByExtend(way, endNodeIdx) {
63974                     var EXTEND_TH_METERS = 5;
63975                     var tipNid = way.nodes[endNodeIdx];  // the 'tip' node for extension point
63976                     var midNid = endNodeIdx === 0 ? way.nodes[1] : way.nodes[way.nodes.length - 2];  // the other node of the edge
63977                     var tipNode = graph.entity(tipNid);
63978                     var midNode = graph.entity(midNid);
63979                     var lon = tipNode.loc[0];
63980                     var lat = tipNode.loc[1];
63981                     var lon_range = geoMetersToLon(EXTEND_TH_METERS, lat) / 2;
63982                     var lat_range = geoMetersToLat(EXTEND_TH_METERS) / 2;
63983                     var queryExtent = geoExtent([
63984                         [lon - lon_range, lat - lat_range],
63985                         [lon + lon_range, lat + lat_range]
63986                     ]);
63987
63988                     // first, extend the edge of [midNode -> tipNode] by EXTEND_TH_METERS and find the "extended tip" location
63989                     var edgeLen = geoSphericalDistance(midNode.loc, tipNode.loc);
63990                     var t = EXTEND_TH_METERS / edgeLen + 1.0;
63991                     var extTipLoc = geoVecInterp(midNode.loc, tipNode.loc, t);
63992
63993                     // then, check if the extension part [tipNode.loc -> extTipLoc] intersects any other ways
63994                     var intersected = tree.intersects(queryExtent, graph);
63995                     for (var i = 0; i < intersected.length; i++) {
63996                         var way2 = intersected[i];
63997
63998                         if (!isHighway(way2)) continue;
63999
64000                         if (!canConnectWays(way, way2)) continue;
64001
64002                         for (var j = 0; j < way2.nodes.length - 1; j++) {
64003                             var nAid = way2.nodes[j],
64004                                 nBid = way2.nodes[j + 1];
64005
64006                             if (nAid === tipNid || nBid === tipNid) continue;
64007
64008                             var nA = graph.entity(nAid),
64009                                 nB = graph.entity(nBid);
64010                             var crossLoc = geoLineIntersection([tipNode.loc, extTipLoc], [nA.loc, nB.loc]);
64011                             if (crossLoc) {
64012                                 return {
64013                                     node: tipNode,
64014                                     wid: way2.id,
64015                                     edge: [nA.id, nB.id],
64016                                     cross_loc: crossLoc
64017                                 };
64018                             }
64019                         }
64020                     }
64021                     return null;
64022                 }
64023             };
64024
64025             validation.type = type;
64026
64027             return validation;
64028         }
64029
64030         function validationCloseNodes() {
64031             var type = 'close_nodes';
64032
64033             var pointThresholdMeters = 0.2;
64034
64035             var defaultWayThresholdMeters = 0.2;
64036             // expect some features to be mapped with higher levels of detail
64037             var indoorThresholdMeters = 0.01;
64038             var buildingThresholdMeters = 0.05;
64039             var pathThresholdMeters = 0.1;
64040
64041             function featureTypeForWay(way, graph) {
64042
64043                 if (way.tags.boundary && way.tags.boundary !== 'no') return 'boundary';
64044                 if (way.tags.indoor && way.tags.indoor !== 'no') return 'indoor';
64045                 if ((way.tags.building && way.tags.building !== 'no') ||
64046                     (way.tags['building:part'] && way.tags['building:part'] !== 'no')) return 'building';
64047                 if (osmPathHighwayTagValues[way.tags.highway]) return 'path';
64048
64049                 var parentRelations = graph.parentRelations(way);
64050                 for (var i in parentRelations) {
64051                     var relation = parentRelations[i];
64052
64053                     if (relation.tags.type === 'boundary') return 'boundary';
64054
64055                     if (relation.isMultipolygon()) {
64056                         if (relation.tags.indoor && relation.tags.indoor !== 'no') return 'indoor';
64057                         if ((relation.tags.building && relation.tags.building !== 'no') ||
64058                             (relation.tags['building:part'] && relation.tags['building:part'] !== 'no')) return 'building';
64059                     }
64060                 }
64061
64062                 return 'other';
64063             }
64064
64065             function shouldCheckWay(way, context) {
64066
64067                 // don't flag issues where merging would create degenerate ways
64068                 if (way.nodes.length <= 2 ||
64069                     (way.isClosed() && way.nodes.length <= 4)) return false;
64070
64071                 var featureType = featureTypeForWay(way, context.graph());
64072                 if (featureType === 'boundary') return false;
64073
64074                 var bbox = way.extent(context.graph()).bbox();
64075                 var hypotenuseMeters = geoSphericalDistance([bbox.minX, bbox.minY], [bbox.maxX, bbox.maxY]);
64076                 // don't flag close nodes in very small ways
64077                 if (hypotenuseMeters < 1.5) return false;
64078
64079                 return true;
64080             }
64081
64082             function getIssuesForWay(way, context) {
64083                 if (!shouldCheckWay(way, context)) return [];
64084
64085                 var issues = [],
64086                     nodes = context.graph().childNodes(way);
64087                 for (var i = 0; i < nodes.length - 1; i++) {
64088                     var node1 = nodes[i];
64089                     var node2 = nodes[i+1];
64090
64091                     var issue = getWayIssueIfAny(node1, node2, way, context);
64092                     if (issue) issues.push(issue);
64093                 }
64094                 return issues;
64095             }
64096
64097             function getIssuesForVertex(node, parentWays, context) {
64098                 var issues = [];
64099
64100                 function checkForCloseness(node1, node2, way) {
64101                     var issue = getWayIssueIfAny(node1, node2, way, context);
64102                     if (issue) issues.push(issue);
64103                 }
64104
64105                 for (var i = 0; i < parentWays.length; i++) {
64106                     var parentWay = parentWays[i];
64107
64108                     if (!shouldCheckWay(parentWay, context)) continue;
64109
64110                     var lastIndex = parentWay.nodes.length - 1;
64111                     for (var j = 0; j < parentWay.nodes.length; j++) {
64112                         if (j !== 0) {
64113                             if (parentWay.nodes[j-1] === node.id) {
64114                                 checkForCloseness(node, context.entity(parentWay.nodes[j]), parentWay);
64115                             }
64116                         }
64117                         if (j !== lastIndex) {
64118                             if (parentWay.nodes[j+1] === node.id) {
64119                                 checkForCloseness(context.entity(parentWay.nodes[j]), node, parentWay);
64120                             }
64121                         }
64122                     }
64123                 }
64124                 return issues;
64125             }
64126
64127             function getIssuesForDetachedPoint(node, context) {
64128
64129                 var issues = [];
64130
64131                 var lon = node.loc[0];
64132                 var lat = node.loc[1];
64133                 var lon_range = geoMetersToLon(pointThresholdMeters, lat) / 2;
64134                 var lat_range = geoMetersToLat(pointThresholdMeters) / 2;
64135                 var queryExtent = geoExtent([
64136                     [lon - lon_range, lat - lat_range],
64137                     [lon + lon_range, lat + lat_range]
64138                 ]);
64139
64140                 var intersected = context.history().tree().intersects(queryExtent, context.graph());
64141                 for (var j = 0; j < intersected.length; j++) {
64142                     var nearby = intersected[j];
64143
64144                     if (nearby.id === node.id) continue;
64145                     if (nearby.type !== 'node' || nearby.geometry(context.graph()) !== 'point') continue;
64146
64147                     if (nearby.loc === node.loc ||
64148                         geoSphericalDistance(node.loc, nearby.loc) < pointThresholdMeters) {
64149
64150                         issues.push(new validationIssue({
64151                             type: type,
64152                             severity: 'warning',
64153                             message: function() {
64154                                 var entity = context.hasEntity(this.entityIds[0]),
64155                                     entity2 = context.hasEntity(this.entityIds[1]);
64156                                 return (entity && entity2) ? t('issues.close_nodes.detached.message', {
64157                                     feature: utilDisplayLabel(entity, context),
64158                                     feature2: utilDisplayLabel(entity2, context)
64159                                 }) : '';
64160                             },
64161                             reference: showReference,
64162                             entityIds: [node.id, nearby.id],
64163                             fixes: [
64164                                 new validationIssueFix({
64165                                     icon: 'iD-operation-disconnect',
64166                                     title: t('issues.fix.move_points_apart.title')
64167                                 })
64168                             ]
64169                         }));
64170                     }
64171                 }
64172
64173                 return issues;
64174
64175                 function showReference(selection) {
64176                     var referenceText = t('issues.close_nodes.detached.reference');
64177                     selection.selectAll('.issue-reference')
64178                         .data([0])
64179                         .enter()
64180                         .append('div')
64181                         .attr('class', 'issue-reference')
64182                         .text(referenceText);
64183                 }
64184             }
64185
64186             function getIssuesForNode(node, context) {
64187                 var parentWays = context.graph().parentWays(node);
64188                 if (parentWays.length) {
64189                     return getIssuesForVertex(node, parentWays, context);
64190                 } else {
64191                     return getIssuesForDetachedPoint(node, context);
64192                 }
64193             }
64194
64195             function getWayIssueIfAny(node1, node2, way, context) {
64196                 if (node1.id === node2.id ||
64197                     (node1.hasInterestingTags() && node2.hasInterestingTags())) {
64198                     return null;
64199                 }
64200
64201                 if (node1.loc !== node2.loc) {
64202
64203                     var featureType = featureTypeForWay(way, context.graph());
64204                     var threshold = defaultWayThresholdMeters;
64205                     if (featureType === 'indoor') threshold = indoorThresholdMeters;
64206                     else if (featureType === 'building') threshold = buildingThresholdMeters;
64207                     else if (featureType === 'path') threshold = pathThresholdMeters;
64208
64209                     var distance = geoSphericalDistance(node1.loc, node2.loc);
64210                     if (distance > threshold) return null;
64211                 }
64212
64213                 return new validationIssue({
64214                     type: type,
64215                     severity: 'warning',
64216                     message: function() {
64217                         var entity = context.hasEntity(this.entityIds[0]);
64218                         return entity ? t('issues.close_nodes.message', { way: utilDisplayLabel(entity, context) }) : '';
64219                     },
64220                     reference: showReference,
64221                     entityIds: [way.id, node1.id, node2.id],
64222                     loc: node1.loc,
64223                     fixes: [
64224                         new validationIssueFix({
64225                             icon: 'iD-icon-plus',
64226                             title: t('issues.fix.merge_points.title'),
64227                             onClick: function() {
64228                                 var entityIds = this.issue.entityIds;
64229                                 var action = actionMergeNodes([entityIds[1], entityIds[2]]);
64230                                 context.perform(action, t('issues.fix.merge_close_vertices.annotation'));
64231                             }
64232                         }),
64233                         new validationIssueFix({
64234                             icon: 'iD-operation-disconnect',
64235                             title: t('issues.fix.move_points_apart.title')
64236                         })
64237                     ]
64238                 });
64239
64240                 function showReference(selection) {
64241                     var referenceText = t('issues.close_nodes.reference');
64242                     selection.selectAll('.issue-reference')
64243                         .data([0])
64244                         .enter()
64245                         .append('div')
64246                         .attr('class', 'issue-reference')
64247                         .text(referenceText);
64248                 }
64249             }
64250
64251
64252             var validation = function(entity, context) {
64253                 if (entity.type === 'node') {
64254                     return getIssuesForNode(entity, context);
64255                 } else if (entity.type === 'way') {
64256                     return getIssuesForWay(entity, context);
64257                 }
64258                 return [];
64259             };
64260
64261
64262             validation.type = type;
64263
64264             return validation;
64265         }
64266
64267         function validationCrossingWays() {
64268             var type = 'crossing_ways';
64269
64270             /*
64271             Avoid duplicate work by cacheing issues. The same issues live under two paths.
64272             {
64273                 w-123: {
64274                     w-456: [{issue1}, {issue2}…]
64275                 },
64276                 w-456: {
64277                     w-123: [{issue1}, {issue2}…]
64278                 }
64279             }
64280             */
64281             var _issueCache = {};
64282
64283             // returns the way or its parent relation, whichever has a useful feature type
64284             function getFeatureWithFeatureTypeTagsForWay(way, graph) {
64285                 if (getFeatureTypeForTags(way.tags) === null) {
64286                     // if the way doesn't match a feature type, check its parent relations
64287                     var parentRels = graph.parentRelations(way);
64288                     for (var i = 0; i < parentRels.length; i++) {
64289                         var rel = parentRels[i];
64290                         if (getFeatureTypeForTags(rel.tags) !== null) {
64291                             return rel;
64292                         }
64293                     }
64294                 }
64295                 return way;
64296             }
64297
64298
64299             function hasTag(tags, key) {
64300                 return tags[key] !== undefined && tags[key] !== 'no';
64301             }
64302
64303             function tagsImplyIndoors(tags) {
64304                 return hasTag(tags, 'level') || tags.highway === 'corridor';
64305             }
64306
64307             function allowsStructures(featureType) {
64308                 return allowsBridge(featureType) || allowsTunnel(featureType);
64309             }
64310             function allowsBridge(featureType) {
64311                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64312             }
64313             function allowsTunnel(featureType) {
64314                 return featureType === 'highway' || featureType === 'railway' || featureType === 'waterway';
64315             }
64316             function canCover(featureType) {
64317                 return featureType === 'building';
64318             }
64319
64320
64321             function getFeatureTypeForCrossingCheck(way, graph) {
64322                 var tags = getFeatureWithFeatureTypeTagsForWay(way, graph).tags;
64323                 return getFeatureTypeForTags(tags);
64324             }
64325
64326             // blacklist
64327             var ignoredBuildings = {
64328                 demolished: true, dismantled: true, proposed: true, razed: true
64329             };
64330
64331
64332             function getFeatureTypeForTags(tags) {
64333                 if (hasTag(tags, 'building') && !ignoredBuildings[tags.building]) return 'building';
64334
64335                 // don't check non-building areas
64336                 if (hasTag(tags, 'area')) return null;
64337
64338                 if (hasTag(tags, 'highway') && osmRoutableHighwayTagValues[tags.highway]) return 'highway';
64339                 if (hasTag(tags, 'railway') && osmRailwayTrackTagValues[tags.railway]) return 'railway';
64340                 if (hasTag(tags, 'waterway') && osmFlowingWaterwayTagValues[tags.waterway]) return 'waterway';
64341
64342                 return null;
64343             }
64344
64345
64346             function isLegitCrossing(way1, featureType1, way2, featureType2) {
64347                 var tags1 = way1.tags;
64348                 var tags2 = way2.tags;
64349
64350                 // assume 0 by default
64351                 var level1 = tags1.level || '0';
64352                 var level2 = tags2.level || '0';
64353
64354                 if (tagsImplyIndoors(tags1) && tagsImplyIndoors(tags2) && level1 !== level2) {
64355                     // assume features don't interact if they're indoor on different levels
64356                     return true;
64357                 }
64358
64359                 // assume 0 by default; don't use way.layer() since we account for structures here
64360                 var layer1 = tags1.layer || '0';
64361                 var layer2 = tags2.layer || '0';
64362
64363                 if (allowsBridge(featureType1) && allowsBridge(featureType2)) {
64364                     if (hasTag(tags1, 'bridge') && !hasTag(tags2, 'bridge')) return true;
64365                     if (!hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge')) return true;
64366                     // crossing bridges must use different layers
64367                     if (hasTag(tags1, 'bridge') && hasTag(tags2, 'bridge') && layer1 !== layer2) return true;
64368                 } else if (allowsBridge(featureType1) && hasTag(tags1, 'bridge')) return true;
64369                 else if (allowsBridge(featureType2) && hasTag(tags2, 'bridge')) return true;
64370
64371                 if (allowsTunnel(featureType1) && allowsTunnel(featureType2)) {
64372                     if (hasTag(tags1, 'tunnel') && !hasTag(tags2, 'tunnel')) return true;
64373                     if (!hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel')) return true;
64374                     // crossing tunnels must use different layers
64375                     if (hasTag(tags1, 'tunnel') && hasTag(tags2, 'tunnel') && layer1 !== layer2) return true;
64376                 } else if (allowsTunnel(featureType1) && hasTag(tags1, 'tunnel')) return true;
64377                 else if (allowsTunnel(featureType2) && hasTag(tags2, 'tunnel')) return true;
64378
64379                 if (canCover(featureType1) && canCover(featureType2)) {
64380                     if (hasTag(tags1, 'covered') && !hasTag(tags2, 'covered')) return true;
64381                     if (!hasTag(tags1, 'covered') && hasTag(tags2, 'covered')) return true;
64382                     // crossing covered features that can themselves cover must use different layers
64383                     if (hasTag(tags1, 'covered') && hasTag(tags2, 'covered') && layer1 !== layer2) return true;
64384                 } else if (canCover(featureType1) && hasTag(tags2, 'covered')) return true;
64385                 else if (canCover(featureType2) && hasTag(tags1, 'covered')) return true;
64386
64387                 // don't flag crossing waterways and pier/highways
64388                 if (featureType1 === 'waterway' && featureType2 === 'highway' && tags2.man_made === 'pier') return true;
64389                 if (featureType2 === 'waterway' && featureType1 === 'highway' && tags1.man_made === 'pier') return true;
64390
64391                 if (!allowsStructures(featureType1) && !allowsStructures(featureType2)) {
64392                     // if no structures are applicable, the layers must be different
64393                     if (layer1 !== layer2) return true;
64394                 }
64395                 return false;
64396             }
64397
64398
64399             // highway values for which we shouldn't recommend connecting to waterways
64400             var highwaysDisallowingFords = {
64401                 motorway: true, motorway_link: true, trunk: true, trunk_link: true,
64402                 primary: true, primary_link: true, secondary: true, secondary_link: true
64403             };
64404             var nonCrossingHighways = { track: true };
64405
64406             function tagsForConnectionNodeIfAllowed(entity1, entity2) {
64407                 var featureType1 = getFeatureTypeForTags(entity1.tags);
64408                 var featureType2 = getFeatureTypeForTags(entity2.tags);
64409                 if (featureType1 === featureType2) {
64410                     if (featureType1 === 'highway') {
64411                         var entity1IsPath = osmPathHighwayTagValues[entity1.tags.highway];
64412                         var entity2IsPath = osmPathHighwayTagValues[entity2.tags.highway];
64413                         if ((entity1IsPath || entity2IsPath) && entity1IsPath !== entity2IsPath) {
64414                             // one feature is a path but not both
64415
64416                             var roadFeature = entity1IsPath ? entity2 : entity1;
64417                             if (nonCrossingHighways[roadFeature.tags.highway]) {
64418                                 // don't mark path connections with certain roads as crossings
64419                                 return {};
64420                             }
64421                             var pathFeature = entity1IsPath ? entity1 : entity2;
64422                             if (['marked', 'unmarked'].indexOf(pathFeature.tags.crossing) !== -1) {
64423                                 // if the path is a crossing, match the crossing type
64424                                 return { highway: 'crossing', crossing: pathFeature.tags.crossing };
64425                             }
64426                             // don't add a `crossing` subtag to ambiguous crossings
64427                             return { highway: 'crossing' };
64428                         }
64429                         return {};
64430                     }
64431                     if (featureType1 === 'waterway') return {};
64432                     if (featureType1 === 'railway') return {};
64433
64434                 } else {
64435                     var featureTypes = [featureType1, featureType2];
64436                     if (featureTypes.indexOf('highway') !== -1) {
64437                         if (featureTypes.indexOf('railway') !== -1) {
64438                             if (osmPathHighwayTagValues[entity1.tags.highway] ||
64439                                 osmPathHighwayTagValues[entity2.tags.highway]) {
64440                                 // path-rail connections use this tag
64441                                 return { railway: 'crossing' };
64442                             } else {
64443                                 // road-rail connections use this tag
64444                                 return { railway: 'level_crossing' };
64445                             }
64446                         }
64447
64448                         if (featureTypes.indexOf('waterway') !== -1) {
64449                             // do not allow fords on structures
64450                             if (hasTag(entity1.tags, 'tunnel') && hasTag(entity2.tags, 'tunnel')) return null;
64451                             if (hasTag(entity1.tags, 'bridge') && hasTag(entity2.tags, 'bridge')) return null;
64452
64453                             if (highwaysDisallowingFords[entity1.tags.highway] ||
64454                                 highwaysDisallowingFords[entity2.tags.highway]) {
64455                                 // do not allow fords on major highways
64456                                 return null;
64457                             }
64458                             return { ford: 'yes' };
64459                         }
64460                     }
64461                 }
64462                 return null;
64463             }
64464
64465
64466             function findCrossingsByWay(way1, graph, tree) {
64467                 var edgeCrossInfos = [];
64468                 if (way1.type !== 'way') return edgeCrossInfos;
64469
64470                 var way1FeatureType = getFeatureTypeForCrossingCheck(way1, graph);
64471                 if (way1FeatureType === null) return edgeCrossInfos;
64472
64473                 var checkedSingleCrossingWays = {};
64474
64475                 // declare vars ahead of time to reduce garbage collection
64476                 var i, j, nodeIndex;
64477                 var extent;
64478                 var n1, n2, nA, nB;
64479                 var segment1, segment2;
64480                 var oneOnly;
64481                 var intersected, way2, way2FeatureType, way2Nodes;
64482                 var way1Nodes = graph.childNodes(way1);
64483                 var comparedWays = {};
64484                 for (i = 0; i < way1Nodes.length - 1; i++) {
64485                     n1 = way1Nodes[i];
64486                     n2 = way1Nodes[i + 1];
64487                     extent = geoExtent([
64488                         [
64489                             Math.min(n1.loc[0], n2.loc[0]),
64490                             Math.min(n1.loc[1], n2.loc[1])
64491                         ],
64492                         [
64493                             Math.max(n1.loc[0], n2.loc[0]),
64494                             Math.max(n1.loc[1], n2.loc[1])
64495                         ]
64496                     ]);
64497
64498                     intersected = tree.intersects(extent, graph);
64499                     for (j = 0; j < intersected.length; j++) {
64500                         way2 = intersected[j];
64501
64502                         if (way2.type !== 'way') continue;
64503
64504                         // don't check for self-intersection in this validation
64505                         if (way2.id === way1.id) continue;
64506
64507                         // skip if this way was already checked and only one issue is needed
64508                         if (checkedSingleCrossingWays[way2.id]) continue;
64509
64510                         // don't re-check previously checked features
64511                         if (_issueCache[way1.id] && _issueCache[way1.id][way2.id]) continue;
64512
64513                         // mark this way as checked even if there are no crossings
64514                         comparedWays[way2.id] = true;
64515
64516                         // only check crossing highway, waterway, building, and railway
64517                         way2FeatureType = getFeatureTypeForCrossingCheck(way2, graph);
64518                         if (way2FeatureType === null ||
64519                             isLegitCrossing(way1, way1FeatureType, way2, way2FeatureType)) {
64520                             continue;
64521                         }
64522
64523                         // create only one issue for building crossings
64524                         oneOnly = way1FeatureType === 'building' || way2FeatureType === 'building';
64525                         segment1 = [n1.loc, n2.loc];
64526
64527                         way2Nodes = graph.childNodes(way2);
64528                         for (nodeIndex = 0; nodeIndex < way2Nodes.length - 1; nodeIndex++) {
64529                             nA = way2Nodes[nodeIndex];
64530                             nB = way2Nodes[nodeIndex + 1];
64531                             if (nA.id === n1.id || nA.id === n2.id ||
64532                                 nB.id === n1.id || nB.id === n2.id) {
64533                                 // n1 or n2 is a connection node; skip
64534                                 continue;
64535                             }
64536                             segment2 = [nA.loc, nB.loc];
64537                             var point = geoLineIntersection(segment1, segment2);
64538                             if (point) {
64539                                 edgeCrossInfos.push({
64540                                     ways: [way1, way2],
64541                                     featureTypes: [way1FeatureType, way2FeatureType],
64542                                     edges: [[n1.id, n2.id], [nA.id, nB.id]],
64543                                     crossPoint: point
64544                                 });
64545                                 if (oneOnly) {
64546                                     checkedSingleCrossingWays[way2.id] = true;
64547                                     break;
64548                                 }
64549                             }
64550                         }
64551                     }
64552                 }
64553                 for (var way2ID in comparedWays) {
64554                     if (!_issueCache[way1.id]) _issueCache[way1.id] = {};
64555                     if (!_issueCache[way1.id][way2ID]) _issueCache[way1.id][way2ID] = [];
64556                     if (!_issueCache[way2ID]) _issueCache[way2ID] = {};
64557                     if (!_issueCache[way2ID][way1.id]) _issueCache[way2ID][way1.id] = [];
64558                 }
64559                 return edgeCrossInfos;
64560             }
64561
64562
64563             function waysToCheck(entity, context) {
64564                 if (!getFeatureTypeForTags(entity.tags)) {
64565                     return [];
64566                 }
64567                 if (entity.type === 'way') {
64568                     return [entity];
64569                 } else if (entity.type === 'relation' &&
64570                     entity.isMultipolygon() &&
64571                     // only check multipolygons if they are buildings
64572                     hasTag(entity.tags, 'building')) {
64573                     return entity.members.reduce(function(array, member) {
64574                         if (member.type === 'way' &&
64575                             //(member.role === 'outer' || member.role === 'inner') &&
64576                             context.hasEntity(member.id)) {
64577                             var entity = context.entity(member.id);
64578                             array.push(entity);
64579                         }
64580                         return array;
64581                     }, []);
64582                 }
64583                 return [];
64584             }
64585
64586
64587             var validation = function checkCrossingWays(entity, context) {
64588                 var graph = context.graph();
64589                 var tree = context.history().tree();
64590
64591                 var ways = waysToCheck(entity, context);
64592
64593                 var issues = [];
64594                 // declare these here to reduce garbage collection
64595                 var wayIndex, crossingIndex, key, crossings, crossing, issue;
64596                 for (wayIndex in ways) {
64597                     var way = ways[wayIndex];
64598                     crossings = findCrossingsByWay(way, graph, tree);
64599                     for (crossingIndex in crossings) {
64600                         crossing = crossings[crossingIndex];
64601                         var way2 = crossing.ways[1];
64602                         issue = createIssue(crossing, context);
64603                         // cache the issues for each way
64604                         _issueCache[way.id][way2.id].push(issue);
64605                         _issueCache[way2.id][way.id].push(issue);
64606                     }
64607                     for (key in _issueCache[way.id]) {
64608                         issues = issues.concat(_issueCache[way.id][key]);
64609                     }
64610                 }
64611                 return issues;
64612             };
64613
64614
64615             function createIssue(crossing, context) {
64616                 var graph = context.graph();
64617
64618                 // use the entities with the tags that define the feature type
64619                 var entities = crossing.ways.sort(function(entity1, entity2) {
64620                     var type1 = getFeatureTypeForCrossingCheck(entity1, graph);
64621                     var type2 = getFeatureTypeForCrossingCheck(entity2, graph);
64622                     if (type1 === type2) {
64623                         return utilDisplayLabel(entity1, context) > utilDisplayLabel(entity2, context);
64624                     } else if (type1 === 'waterway') {
64625                         return true;
64626                     } else if (type2 === 'waterway') {
64627                         return false;
64628                     }
64629                     return type1 < type2;
64630                 });
64631                 entities = entities.map(function(way) {
64632                     return getFeatureWithFeatureTypeTagsForWay(way, graph);
64633                 });
64634
64635                 var connectionTags = tagsForConnectionNodeIfAllowed(entities[0], entities[1]);
64636
64637                 var featureType1 = crossing.featureTypes[0];
64638                 var featureType2 = crossing.featureTypes[1];
64639
64640                 var isCrossingIndoors = tagsImplyIndoors(entities[0].tags) && tagsImplyIndoors(entities[1].tags);
64641                 var isCrossingTunnels = allowsTunnel(featureType1) && hasTag(entities[0].tags, 'tunnel') &&
64642                                         allowsTunnel(featureType2) && hasTag(entities[1].tags, 'tunnel');
64643                 var isCrossingBridges = allowsBridge(featureType1) && hasTag(entities[0].tags, 'bridge') &&
64644                                         allowsBridge(featureType2) && hasTag(entities[1].tags, 'bridge');
64645
64646                 var crossingTypeID;
64647
64648                 if (isCrossingIndoors) {
64649                     crossingTypeID = 'indoor-indoor';
64650                 } else if (isCrossingTunnels) {
64651                     crossingTypeID = 'tunnel-tunnel';
64652                 } else if (isCrossingBridges) {
64653                     crossingTypeID = 'bridge-bridge';
64654                 } else {
64655                     crossingTypeID = crossing.featureTypes.sort().join('-');
64656                 }
64657                 if (connectionTags && (isCrossingIndoors || isCrossingTunnels || isCrossingBridges)) {
64658                     crossingTypeID += '_connectable';
64659                 }
64660
64661                 var fixes = [];
64662                 if (connectionTags) {
64663                     fixes.push(makeConnectWaysFix(context));
64664                 }
64665
64666                 var useFixIcon = 'iD-icon-layers';
64667                 var useFixID;
64668                 if (isCrossingIndoors) {
64669                     useFixID = 'use_different_levels';
64670                 } else if (isCrossingTunnels || isCrossingBridges) {
64671                     useFixID = 'use_different_layers';
64672                 // don't recommend bridges for waterways even though they're okay
64673                 } else if ((allowsBridge(featureType1) && featureType1 !== 'waterway') ||
64674                         (allowsBridge(featureType2) && featureType2 !== 'waterway')) {
64675                     useFixID = 'use_bridge_or_tunnel';
64676                     useFixIcon = 'maki-bridge';
64677                 } else if (allowsTunnel(featureType1) || allowsTunnel(featureType2)) {
64678                     useFixID = 'use_tunnel';
64679                 } else {
64680                     useFixID = 'use_different_layers';
64681                 }
64682                 if (useFixID === 'use_different_layers') {
64683                     fixes.push(makeChangeLayerFix('higher', context));
64684                     fixes.push(makeChangeLayerFix('lower', context));
64685                 } else {
64686                     fixes.push(new validationIssueFix({
64687                         icon: useFixIcon,
64688                         title: t('issues.fix.' + useFixID + '.title')
64689                     }));
64690                 }
64691                 fixes.push(new validationIssueFix({
64692                     icon: 'iD-operation-move',
64693                     title: t('issues.fix.reposition_features.title')
64694                 }));
64695
64696                 return new validationIssue({
64697                     type: type,
64698                     severity: 'warning',
64699                     message: function() {
64700                         var entity1 = context.hasEntity(this.entityIds[0]),
64701                             entity2 = context.hasEntity(this.entityIds[1]);
64702                         return (entity1 && entity2) ? t('issues.crossing_ways.message', {
64703                             feature: utilDisplayLabel(entity1, context),
64704                             feature2: utilDisplayLabel(entity2, context)
64705                         }) : '';
64706                     },
64707                     reference: showReference,
64708                     entityIds: entities.map(function(entity) {
64709                         return entity.id;
64710                     }),
64711                     data: {
64712                         edges: crossing.edges,
64713                         connectionTags: connectionTags
64714                     },
64715                     // differentiate based on the loc since two ways can cross multiple times
64716                     hash: JSON.stringify(crossing.crossPoint) +
64717                         // if the edges change then so does the fix
64718                         JSON.stringify(crossing.edges) +
64719                         // ensure the correct connection tags are added in the fix
64720                         JSON.stringify(connectionTags),
64721                     loc: crossing.crossPoint,
64722                     fixes: fixes
64723                 });
64724
64725                 function showReference(selection) {
64726                     selection.selectAll('.issue-reference')
64727                         .data([0])
64728                         .enter()
64729                         .append('div')
64730                         .attr('class', 'issue-reference')
64731                         .text(t('issues.crossing_ways.' + crossingTypeID + '.reference'));
64732                 }
64733             }
64734
64735             function makeConnectWaysFix(context) {
64736                 return new validationIssueFix({
64737                     icon: 'iD-icon-crossing',
64738                     title: t('issues.fix.connect_features.title'),
64739                     onClick: function() {
64740                         var loc = this.issue.loc;
64741                         var connectionTags = this.issue.data.connectionTags;
64742                         var edges = this.issue.data.edges;
64743
64744                         context.perform(
64745                             function actionConnectCrossingWays(graph) {
64746                                 // create the new node for the points
64747                                 var node = osmNode({ loc: loc, tags: connectionTags });
64748                                 graph = graph.replace(node);
64749
64750                                 var nodesToMerge = [node.id];
64751                                 var mergeThresholdInMeters = 0.75;
64752
64753                                 edges.forEach(function(edge) {
64754                                     var edgeNodes = [graph.entity(edge[0]), graph.entity(edge[1])];
64755                                     var closestNodeInfo = geoSphericalClosestNode(edgeNodes, loc);
64756                                     // if there is already a point nearby, use that
64757                                     if (closestNodeInfo.distance < mergeThresholdInMeters) {
64758                                         nodesToMerge.push(closestNodeInfo.node.id);
64759                                     // else add the new node to the way
64760                                     } else {
64761                                         graph = actionAddMidpoint({loc: loc, edge: edge}, node)(graph);
64762                                     }
64763                                 });
64764
64765                                 if (nodesToMerge.length > 1) {
64766                                     // if we're using nearby nodes, merge them with the new node
64767                                     graph = actionMergeNodes(nodesToMerge, loc)(graph);
64768                                 }
64769
64770                                 return graph;
64771                             },
64772                             t('issues.fix.connect_crossing_features.annotation')
64773                         );
64774                     }
64775                 });
64776             }
64777
64778             function makeChangeLayerFix(higherOrLower, context) {
64779                 return new validationIssueFix({
64780                     icon: 'iD-icon-' + (higherOrLower === 'higher' ? 'up' : 'down'),
64781                     title: t('issues.fix.tag_this_as_' + higherOrLower + '.title'),
64782                     onClick: function() {
64783
64784                         var mode = context.mode();
64785                         if (!mode || mode.id !== 'select') return;
64786
64787                         var selectedIDs = mode.selectedIDs();
64788                         if (selectedIDs.length !== 1) return;
64789
64790                         var selectedID = selectedIDs[0];
64791                         if (!this.issue.entityIds.some(function(entityId) {
64792                             return entityId === selectedID;
64793                         })) return;
64794
64795                         var entity = context.hasEntity(selectedID);
64796                         if (!entity) return;
64797
64798                         var tags = Object.assign({}, entity.tags);   // shallow copy
64799                         var layer = tags.layer && Number(tags.layer);
64800                         if (layer && !isNaN(layer)) {
64801                             if (higherOrLower === 'higher') {
64802                                 layer += 1;
64803                             } else {
64804                                 layer -= 1;
64805                             }
64806                         } else {
64807                             if (higherOrLower === 'higher') {
64808                                 layer = 1;
64809                             } else {
64810                                 layer = -1;
64811                             }
64812                         }
64813                         tags.layer = layer;
64814                         context.perform(
64815                             actionChangeTags(entity.id, tags),
64816                             t('operations.change_tags.annotation')
64817                         );
64818                     }
64819                 });
64820             }
64821
64822             validation.reset = function() {
64823                 _issueCache = {};
64824             };
64825
64826             validation.type = type;
64827
64828             return validation;
64829         }
64830
64831         function validationDisconnectedWay() {
64832             var type = 'disconnected_way';
64833
64834             function isTaggedAsHighway(entity) {
64835                 return osmRoutableHighwayTagValues[entity.tags.highway];
64836             }
64837
64838             var validation = function checkDisconnectedWay(entity, context) {
64839                 var graph = context.graph();
64840
64841                 var routingIslandWays = routingIslandForEntity(entity);
64842                 if (!routingIslandWays) return [];
64843
64844                 var fixes = [];
64845
64846                 var isSingle = routingIslandWays.size === 1;
64847
64848                 if (isSingle) {
64849
64850                     if (entity.type === 'way' && !entity.isClosed()) {
64851                         var firstID = entity.first();
64852                         var lastID = entity.last();
64853
64854                         var first = context.entity(firstID);
64855                         if (first.tags.noexit !== 'yes') {
64856                             fixes.push(new validationIssueFix({
64857                                 icon: 'iD-operation-continue-left',
64858                                 title: t('issues.fix.continue_from_start.title'),
64859                                 entityIds: [firstID],
64860                                 onClick: function() {
64861                                     var wayId = this.issue.entityIds[0];
64862                                     var way = context.entity(wayId);
64863                                     var vertexId = this.entityIds[0];
64864                                     var vertex = context.entity(vertexId);
64865                                     continueDrawing(way, vertex, context);
64866                                 }
64867                             }));
64868                         }
64869                         var last = context.entity(lastID);
64870                         if (last.tags.noexit !== 'yes') {
64871                             fixes.push(new validationIssueFix({
64872                                 icon: 'iD-operation-continue',
64873                                 title: t('issues.fix.continue_from_end.title'),
64874                                 entityIds: [lastID],
64875                                 onClick: function() {
64876                                     var wayId = this.issue.entityIds[0];
64877                                     var way = context.entity(wayId);
64878                                     var vertexId = this.entityIds[0];
64879                                     var vertex = context.entity(vertexId);
64880                                     continueDrawing(way, vertex, context);
64881                                 }
64882                             }));
64883                         }
64884
64885                     } else {
64886                         fixes.push(new validationIssueFix({
64887                             title: t('issues.fix.connect_feature.title')
64888                         }));
64889                     }
64890
64891                     if (!operationDelete([entity.id], context).disabled()) {
64892                         fixes.push(new validationIssueFix({
64893                             icon: 'iD-operation-delete',
64894                             title: t('issues.fix.delete_feature.title'),
64895                             entityIds: [entity.id],
64896                             onClick: function() {
64897                                 var id = this.issue.entityIds[0];
64898                                 var operation = operationDelete([id], context);
64899                                 if (!operation.disabled()) {
64900                                     operation();
64901                                 }
64902                             }
64903                         }));
64904                     }
64905                 } else {
64906                     fixes.push(new validationIssueFix({
64907                         title: t('issues.fix.connect_features.title')
64908                     }));
64909                 }
64910
64911                 return [new validationIssue({
64912                     type: type,
64913                     severity: 'warning',
64914                     message: function() {
64915                         if (this.entityIds.length === 1) {
64916                             var entity = context.hasEntity(this.entityIds[0]);
64917                             return entity ? t('issues.disconnected_way.highway.message', { highway: utilDisplayLabel(entity, context) }) : '';
64918                         }
64919                         return t('issues.disconnected_way.routable.message.multiple', { count: this.entityIds.length.toString() });
64920                     },
64921                     reference: showReference,
64922                     entityIds: Array.from(routingIslandWays).map(function(way) { return way.id; }),
64923                     fixes: fixes
64924                 })];
64925
64926
64927                 function showReference(selection) {
64928                     selection.selectAll('.issue-reference')
64929                         .data([0])
64930                         .enter()
64931                         .append('div')
64932                         .attr('class', 'issue-reference')
64933                         .text(t('issues.disconnected_way.routable.reference'));
64934                 }
64935
64936                 function routingIslandForEntity(entity) {
64937
64938                     if (entity.type !== 'way') return null;
64939
64940                     if (!isRoutableWay(entity, true)) return null;
64941
64942                     var waysToCheck = [entity];
64943                     var routingIsland = new Set([entity]);
64944
64945                     while (waysToCheck.length) {
64946                         var wayToCheck = waysToCheck.pop();
64947                         var childNodes = graph.childNodes(wayToCheck);
64948                         for (var i in childNodes) {
64949                             var vertex = childNodes[i];
64950                             var result = isConnectedVertex(vertex, routingIsland);
64951                             if (result === true) {
64952                                 return null;
64953                             } else if (result === false) {
64954                                 continue;
64955                             }
64956                             result.forEach(function(connectedWay) {
64957                                 if (!routingIsland.has(connectedWay)) {
64958                                     routingIsland.add(connectedWay);
64959                                     waysToCheck.push(connectedWay);
64960                                 }
64961                             });
64962                         }
64963                     }
64964
64965                     return routingIsland;
64966                 }
64967
64968                 function isConnectedVertex(vertex, routingIslandWays) {
64969                     // assume ways overlapping unloaded tiles are connected to the wider road network  - #5938
64970                     var osm = context.connection();
64971                     if (osm && !osm.isDataLoaded(vertex.loc)) return true;
64972
64973                     // entrances are considered connected
64974                     if (vertex.tags.entrance &&
64975                         vertex.tags.entrance !== 'no') return true;
64976                     if (vertex.tags.amenity === 'parking_entrance') return true;
64977
64978                     var parentsWays = graph.parentWays(vertex);
64979
64980                     // standalone vertex
64981                     if (parentsWays.length === 1) return false;
64982
64983                     var connectedWays = new Set();
64984
64985                     for (var i in parentsWays) {
64986                         var parentWay = parentsWays[i];
64987
64988                         // ignore any way we've already accounted for
64989                         if (routingIslandWays.has(parentWay)) continue;
64990
64991                         if (isRoutableWay(parentWay, false)) connectedWays.add(parentWay);
64992                     }
64993
64994                     if (connectedWays.size) return connectedWays;
64995
64996                     return false;
64997                 }
64998
64999                 function isRoutableWay(way, ignoreInnerWays) {
65000                     if (isTaggedAsHighway(way) || way.tags.route === 'ferry') return true;
65001
65002                     return graph.parentRelations(way).some(function(parentRelation) {
65003                         if (parentRelation.tags.type === 'route' &&
65004                             parentRelation.tags.route === 'ferry') return true;
65005
65006                         if (parentRelation.isMultipolygon() &&
65007                             isTaggedAsHighway(parentRelation) &&
65008                             (!ignoreInnerWays || parentRelation.memberById(way.id).role !== 'inner')) return true;
65009                     });
65010                 }
65011
65012                 function continueDrawing(way, vertex) {
65013                     // make sure the vertex is actually visible and editable
65014                     var map = context.map();
65015                     if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65016                         map.zoomToEase(vertex);
65017                     }
65018
65019                     context.enter(
65020                         modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65021                     );
65022                 }
65023             };
65024
65025
65026             validation.type = type;
65027
65028             return validation;
65029         }
65030
65031         function validationFixmeTag() {
65032             var type = 'fixme_tag';
65033
65034
65035             var validation = function checkFixmeTag(entity, context) {
65036
65037                 if (!entity.tags.fixme) return [];
65038
65039                 // don't flag fixmes on features added by the user
65040                 if (entity.version === undefined) return [];
65041
65042                 if (entity.v !== undefined) {
65043                     var baseEntity = context.history().base().hasEntity(entity.id);
65044                     // don't flag fixmes added by the user on existing features
65045                     if (!baseEntity || !baseEntity.tags.fixme) return [];
65046                 }
65047
65048                 return [new validationIssue({
65049                     type: type,
65050                     severity: 'warning',
65051                     message: function() {
65052                         var entity = context.hasEntity(this.entityIds[0]);
65053                         return entity ? t('issues.fixme_tag.message', { feature: utilDisplayLabel(entity, context) }) : '';
65054                     },
65055                     reference: showReference,
65056                     entityIds: [entity.id]
65057                 })];
65058
65059                 function showReference(selection) {
65060                     selection.selectAll('.issue-reference')
65061                         .data([0])
65062                         .enter()
65063                         .append('div')
65064                         .attr('class', 'issue-reference')
65065                         .text(t('issues.fixme_tag.reference'));
65066                 }
65067             };
65068
65069             validation.type = type;
65070
65071             return validation;
65072         }
65073
65074         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":{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|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|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|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":{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":{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:["bank of the philippine islands","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 Agrario de Colombia":{countryCodes:["co"],tags:{amenity:"bank",brand:"Banco Agrario de Colombia","brand:wikidata":"Q20013358","brand:wikipedia":"en:Banco Agrario de Colombia",name:"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:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"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:wikidata":"Q62054564",name:"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":{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"}},"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":"Nation Bank","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:["pr","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"}},"amenity/bank|Banco Sol~(Angola)":{countryCodes:["ao"],tags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118744",name:"Banco Sol","name:pt":"Banco Sol"}},"amenity/bank|Banco Sol~(Bolivia)":{countryCodes:["bo"],tags:{amenity:"bank",brand:"Banco Sol","brand:pt":"Banco Sol","brand:wikidata":"Q62118746",name:"Banco Sol","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",name:"Banco Unión"}},"amenity/bank|Banco de Bogotá":{tags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"}},"amenity/bank|Banco de Chile":{countryCodes:["cl"],tags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"}},"amenity/bank|Banco de Desarrollo Banrural":{tags:{amenity:"bank",brand:"Banco de Desarrollo Banrural","brand:wikidata":"Q5719130","brand:wikipedia":"es:Banrural",name:"Banco de Desarrollo Banrural"}},"amenity/bank|Banco de Fomento Angola (BFA)":{tags:{amenity:"bank",brand:"Banco de Fomento Angola (BFA)","brand:wikidata":"Q806197","brand:wikipedia":"de:Banco de Fomento Angola",name:"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":{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":{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":{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":{tags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"}},"amenity/bank|Bank Austria":{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":{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":{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":{tags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"}},"amenity/bank|Bank of China":{tags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"}},"amenity/bank|Bank of Commerce":{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":{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":{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 Montreal":{tags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"}},"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":{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":{tags:{amenity:"bank",brand:"Bcc",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":{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":{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":{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|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":{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":{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":{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"}},"amenity/bank|Citizens Bank":{tags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"}},"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 (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|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":{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":{tags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"}},"amenity/bank|Credit Suisse":{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":{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":{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|Cбербанк":{tags:{amenity:"bank",brand:"Cбербанк","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Cбербанк"}},"amenity/bank|Danske Bank":{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|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":{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":{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","5/3 bank"],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":{tags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"}},"amenity/bank|First Bank~(Western USA)":{countryCodes:["us"],matchNames:["1stbank"],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":{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 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":{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":{tags:{amenity:"bank",brand:"First State Bank",name:"First State Bank"}},"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":{tags:{amenity:"bank",brand:"Fulton Bank",name:"Fulton Bank"}},"amenity/bank|GCB Bank":{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|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":{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":{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":{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":{tags:{amenity:"bank",brand:"Huntington Bank","brand:wikidata":"Q798819","brand:wikipedia":"en:Huntington Bancshares",name:"Huntington Bank"}},"amenity/bank|HypoVereinsbank":{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":{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":{tags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"}},"amenity/bank|Indian Overseas Bank":{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|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:"Janata Bank Limited জনতা ব্যাংক লিমিটেড","brand:wikidata":"Q3347028","brand:wikipedia":"en:Janata Bank",name:"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":{tags:{amenity:"bank",brand:"KBC","brand:wikidata":"Q941020","brand:wikipedia":"en:KBC Bank",name:"KBC"}},"amenity/bank|KBZ Bank":{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",name:"Kuveyt Türk"}},"amenity/bank|LCL":{tags:{amenity:"bank",brand:"LCL","brand:wikidata":"Q779722","brand:wikipedia":"en:Crédit Lyonnais",name:"LCL"}},"amenity/bank|La Banque Postale":{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|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":{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":{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":{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|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":{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":{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":{tags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"}},"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":{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":{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":{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":{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":{tags:{amenity:"bank",brand:"Oberbank","brand:wikidata":"Q2009139","brand:wikipedia":"de:Oberbank",name:"Oberbank"}},"amenity/bank|Occidental de Descuento":{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"],matchNames:["philippine national bank"],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":{matchNames:["pnc"],tags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"}},"amenity/bank|PSBank":{tags:{amenity:"bank",brand:"PSBank","brand:wikidata":"Q7185203","brand:wikipedia":"en:Philippine Savings Bank",name:"PSBank"}},"amenity/bank|Panin Bank":{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|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":{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","royal bank of canada"],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":{matchNames:["royal bank of scotland"],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":{tags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"}},"amenity/bank|Raiffeisen Polbank":{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",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","brand:wikidata":"Q7314386","brand:wikipedia":"en:Republic Bank",name:"Republic Bank"}},"amenity/bank|República":{tags:{amenity:"bank",brand:"República",name:"República"}},"amenity/bank|SC제일은행":{countryCodes:["kr"],tags:{amenity:"bank",brand:"SC제일은행","brand:ko":"SC제일은행",name:"SC제일은행","name:ko":"SC제일은행"}},"amenity/bank|SEB":{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":{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":{tags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"}},"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":{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":{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|Sonali Bank":{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":{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|Summit Bank":{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":{tags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"}},"amenity/bank|Syndicate Bank":{tags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"}},"amenity/bank|TCF Bank":{tags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"}},"amenity/bank|TD Bank":{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":{tags:{amenity:"bank",brand:"TEB","brand:wikidata":"Q7862447","brand:wikipedia":"en:Türk Ekonomi Bankası",name:"TEB"}},"amenity/bank|TSB":{tags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"}},"amenity/bank|Takarékszövetkezet":{tags:{amenity:"bank",brand:"Takarékszövetkezet","brand:wikidata":"Q30324674","brand:wikipedia":"en:TakarékBank",name:"Takarékszövetkezet"}},"amenity/bank|Targobank":{tags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"}},"amenity/bank|Tatra banka":{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":{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|UOB":{tags:{amenity:"bank",brand:"UOB","brand:wikidata":"Q2064074","brand:wikipedia":"en:United Overseas Bank",name:"UOB"}},"amenity/bank|Ulster Bank":{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"}},"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|Veneto Banca":{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":{tags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"}},"amenity/bank|Volksbank Köln Bonn eG":{tags:{amenity:"bank",brand:"Volksbank Köln Bonn eG","brand:wikidata":"Q41680844","brand:wikipedia":"de:Volksbank Köln Bonn",name:"Volksbank",official_name:"Volksbank Köln Bonn eG"}},"amenity/bank|VÚB":{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":{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":{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|ČSOB":{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|Πειραιώς":{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|А-Банк":{tags:{amenity:"bank",brand:"А-Банк",name:"А-Банк"}},"amenity/bank|Авангард":{countryCodes:["ru"],tags:{amenity:"bank",brand:"Авангард","brand:wikidata":"Q62122617",name:"Авангард"}},"amenity/bank|Альфа-Банк":{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|БПС-Сбербанк":{tags:{amenity:"bank",brand:"БПС-Сбербанк",name:"БПС-Сбербанк"}},"amenity/bank|Банк Дабрабыт":{tags:{amenity:"bank",brand:"Банк Дабрабыт",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|Беларусбанк":{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|ВТБ":{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|ОТП Банк":{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|Почта Банк":{tags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"}},"amenity/bank|Пощенска банка":{tags:{amenity:"bank",brand:"Пощенска банка",name:"Пощенска банка"}},"amenity/bank|ПриватБанк":{tags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"}},"amenity/bank|Приорбанк":{countryCodes:["by"],tags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"}},"amenity/bank|Промсвязьбанк":{tags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"}},"amenity/bank|РНКБ":{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|Росбанк":{tags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"}},"amenity/bank|Россельхозбанк":{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|Сбербанк":{matchNames:["приднестровский сбербанк","сбербанк россии"],tags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"}},"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|Укргазбанк":{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|Хоум Кредит":{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|بانک صادرات":{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:["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:en":"China CITIC Bank","brand:wikidata":"Q38960","brand:wikipedia":"en:China CITIC Bank",name:"中信银行"}},"amenity/bank|中国农业银行":{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|中国工商银行":{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|中国邮政储蓄银行":{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|中国银行":{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":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"}},"amenity/bank|京都銀行":{countryCodes:["jp"],tags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"}},"amenity/bank|元大商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"}},"amenity/bank|兆豐國際商業銀行":{countryCodes:["tw"],tags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"}},"amenity/bank|农业银行":{tags:{amenity:"bank",brand:"农业银行","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|常陽銀行":{tags:{amenity:"bank",brand:"常陽銀行",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:["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/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|NextBike":{tags:{amenity:"bicycle_rental",brand:"NextBike",name:"NextBike"}},"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":"en:Nextbike"}},"amenity/bureau_de_change|Abitab":{countryCodes:["uy"],tags:{amenity:"bureau_de_change",brand:"Abitab","brand:wikidata":"Q16488129","brand:wikipedia":"es:Abitab",name:"Abitab"}},"amenity/bureau_de_change|CADECA":{countryCodes:["cu"],tags:{amenity:"bureau_de_change",brand:"CADECA","brand:wikidata":"Q62122716",name:"CADECA"}},"amenity/bureau_de_change|Money Exchange":{tags:{amenity:"bureau_de_change",brand:"Money Exchange",name:"Money Exchange"}},"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 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",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|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":{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":{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:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",cuisine:"coffee_shop",name:"Chatime",takeaway:"yes"}},"amenity/cafe|Coffee Bean":{tags:{amenity:"cafe",brand:"Coffee Bean",cuisine:"coffee_shop",name:"Coffee Bean",takeaway:"yes"}},"amenity/cafe|Coffee Culture":{tags:{amenity:"cafe",brand:"Coffee Culture",cuisine:"coffee_shop",name:"Coffee Culture",takeaway:"yes"}},"amenity/cafe|Coffee Fellows":{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 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":{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|Havanna":{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":{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":{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|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":{matchNames:["starbucks coffee"],tags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks",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|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":{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":{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|Лакомка":{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|Смак":{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:["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|스타벅스":{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":{tags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Car Rental",name:"Avis"}},"amenity/car_rental|Budget":{tags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"}},"amenity/car_rental|Dollar":{tags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"}},"amenity/car_rental|Enterprise":{matchNames:["enterprise rent-a-car"],tags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"}},"amenity/car_rental|Europcar":{tags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"}},"amenity/car_rental|Hertz":{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":{nomatch:["amenity/bank|National Bank"],tags:{amenity:"car_rental",brand:"National",name:"National"}},"amenity/car_rental|Sixt":{tags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"}},"amenity/car_rental|Thrifty":{tags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"}},"amenity/car_rental|U-Haul":{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|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/charging_station|Blink":{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":{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":{tags:{amenity:"charging_station",brand:"bike-energy Ladestation",name:"bike-energy Ladestation"}},"amenity/charging_station|eVgo":{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":{tags:{amenity:"cinema",brand:"AMC","brand:wikidata":"Q294721","brand:wikipedia":"en:AMC Theatres",name:"AMC"}},"amenity/cinema|CineStar":{countryCodes:["de"],tags:{amenity:"cinema",brand:"CineStar","brand:wikidata":"Q321889","brand:wikipedia":"de:Cinestar",name:"CineStar"}},"amenity/cinema|Cinema City":{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~(GermanyAndDenmark)":{countryCodes:["de","dk"],nomatch:["amenity/cinema|Cinemaxx~(Indonesia)"],tags:{amenity:"cinema",brand:"Cinemaxx","brand:wikidata":"Q881860","brand:wikipedia":"de:Cinemaxx;da:CinemaxX",name:"Cinemaxx"}},"amenity/cinema|Cinemaxx~(Indonesia)":{countryCodes:["id"],nomatch:["amenity/cinema|Cinemaxx~(GermanyAndDenmark)"],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":{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":{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":{tags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"}},"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|Multikino":{countryCodes:["lt","lv","pl"],tags:{amenity:"cinema",brand:"Multikino","brand:wikidata":"Q1144802","brand:wikipedia":"pl:Multikino",name:"Multikino"}},"amenity/cinema|Odeon":{tags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"}},"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."}},"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"],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:["dci","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":{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/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|Dentix":{tags:{amenity:"dentist",brand:"Dentix",name:"Dentix"}},"amenity/dentist|Gentle Dental":{tags:{amenity:"dentist",brand:"Gentle Dental",name:"Gentle Dental"}},"amenity/dentist|Vitaldent":{tags:{amenity:"dentist",brand:"Vitaldent",name:"Vitaldent"}},"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":{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"],matchTags:["shop/bakery"],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":{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|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|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":{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":{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|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":{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":{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":{matchNames:["chipotle mexican grill"],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":{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/bakery","shop/confectionery","shop/pastry"],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",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|Culver's":{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":{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":{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"],matchTags:["shop/bakery"],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","einstein brothers bagels"],tags:{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":{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":{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":{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":{matchNames:["five guys burgers and fries"],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":{matchNames:["freddy's frozen custard & 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":{tags:{amenity:"fast_food",brand:"Gino's Pizza",cuisine:"pizza",name:"Gino's Pizza",takeaway:"yes"}},"amenity/fast_food|Gold Star Chili":{countryCodes:["us"],matchNames:["gold star"],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|Greenwich":{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":{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":{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":{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":{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":{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","pl","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":{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":{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|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|Marmaris":{tags:{amenity:"fast_food",brand:"Marmaris",name:"Marmaris",takeaway:"yes"}},"amenity/fast_food|Max":{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":{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 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|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":{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":{tags:{amenity:"fast_food",brand:"Oporto","brand:wikidata":"Q4412342","brand:wikipedia":"en:Oporto (restaurant)",name:"Oporto",takeaway:"yes"}},"amenity/fast_food|Pal's":{countryCodes:["us"],matchNames:["pals sudden service"],tags:{amenity:"fast_food",brand:"Pal's","brand:wikidata":"Q7126094","brand:wikipedia":"en:Pal's",cuisine:"burger",name:"Pal's",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":{tags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread",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"],matchTags:["shop/bakery"],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|Popeyes":{matchNames:["popeyes louisiana kitchen"],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":{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":{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|Qdoba":{matchNames:["qdoba mexican grill"],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":{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"],matchNames:["raising canes chicken fingers"],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":{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|Sbarro":{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":{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":{tags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger",takeaway:"yes"}},"amenity/fast_food|Smoothie King":{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|Steak Escape":{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":{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":{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":{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":{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:["habit burger","the habit burger"],tags:{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",takeaway:"yes"}},"amenity/fast_food|The Pizza Company":{tags:{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|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":{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:["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":{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|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:wikidata":"Q62273834",cuisine:"sandwich",name:"Γρηγόρης",takeaway:"yes"}},"amenity/fast_food|Бургер Кинг":{tags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King",takeaway:"yes"}},"amenity/fast_food|Домино’c Пицца":{tags:{amenity:"fast_food",brand:"Домино’c Пицца",name:"Домино’c Пицца",takeaway:"yes"}},"amenity/fast_food|Крошка Картошка":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",cuisine:"potato",name:"Крошка Картошка",takeaway:"yes"}},"amenity/fast_food|Макдоналдс":{tags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|Папа Джонс":{tags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's",takeaway:"yes"}},"amenity/fast_food|Робин Сдобин":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Робин Сдобин","brand:wikidata":"Q62273880",cuisine:"burger",name:"Робин Сдобин",takeaway:"yes"}},"amenity/fast_food|Русский Аппетит":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Русский Аппетит","brand:wikidata":"Q62086063",cuisine:"sandwich;salad;regional",name:"Русский Аппетит",takeaway:"yes"}},"amenity/fast_food|Стардог!s":{countryCodes:["ru"],tags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",cuisine:"sausage",name:"Стардог!s","name:en":"Stardog!s",takeaway:"yes"}},"amenity/fast_food|Суши Wok":{countryCodes:["ru","ua"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Суши Wok","brand:en":"Sushi Wok","brand:wikidata":"Q25444754","brand:wikipedia":"uk:Суши Wok (мережа магазинів)",cuisine:"asian",name:"Суши Wok","name:en":"Sushi Wok",takeaway:"yes"}},"amenity/fast_food|Теремок":{countryCodes:["ru"],matchTags:["shop/convenience"],tags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",cuisine:"crepe;russian",name:"Теремок","name:en":"Teremok",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|日高屋":{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:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's",takeaway:"yes"}},"amenity/fast_food|麦当劳":{countryCodes:["cn","sg"],tags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's",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":"맘스터치",cuisine:"burger",name:"맘스터치","name:ko":"맘스터치",takeaway:"yes"}},"amenity/fast_food|맥도날드":{countryCodes:["kr"],tags:{amenity:"fast_food",brand:"맥도날드","brand:ko":"맥도날드",name:"맥도날드","name:ko":"맥도날드",takeaway:"yes"}},"amenity/fuel|1-2-3":{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":{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":{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":{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":{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":{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":{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":{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":{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":{tags:{amenity:"fuel",brand:"Carrefour",name:"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"}},"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":{tags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"}},"amenity/fuel|Classic":{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":{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","pr"],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":{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":{tags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"}},"amenity/fuel|Erg":{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":{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":{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 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":{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":{tags:{amenity:"fuel",brand:"Gull","brand:wikidata":"Q5617739","brand:wikipedia":"en:Gull Petroleum",name:"Gull"}},"amenity/fuel|H-E-B Fuel":{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":{matchNames:["hindustan petroleum","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":{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:["shop/convenience|Husky"],tags:{amenity:"fuel",brand:"Husky",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":{tags:{amenity:"fuel",brand:"Indian Oil Petrol Pump",name:"Indian Oil Petrol Pump"}},"amenity/fuel|Ingo":{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":{nomatch:["shop/convenience|Kangaroo"],tags:{amenity:"fuel",brand:"Kangaroo",name:"Kangaroo"}},"amenity/fuel|Kobil":{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":{tags:{amenity:"fuel",brand:"Kwik Fill",name:"Kwik Fill"}},"amenity/fuel|Kwik Trip":{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":{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":{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":"Q16974822","brand:wikipedia":"en:FJ Management",name:"Maverik"}},"amenity/fuel|Maxol":{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":{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":{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":{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":{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":{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":{tags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"}},"amenity/fuel|Pertamina":{tags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"}},"amenity/fuel|Petro":{tags:{amenity:"fuel",brand:"Petro",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":{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":{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":{tags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"}},"amenity/fuel|Phillips 66":{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:["flying j","pilot flying j"],tags:{amenity:"fuel",brand:"Pilot","brand:wikidata":"Q1434601","brand:wikipedia":"en:Pilot Flying J",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":{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":{tags:{amenity:"fuel",brand:"Q8","brand:wikidata":"Q1634762","brand:wikipedia":"en:Kuwait Petroleum Corporation",name:"Q8"}},"amenity/fuel|Q8 Easy":{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":{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":{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":{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":{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":{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":{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":{tags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"}},"amenity/fuel|Tango":{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":{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|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":{tags:{amenity:"fuel",brand:"Total Access","brand:wikidata":"Q154037","brand:wikipedia":"fr:Total (entreprise)",name:"Total Access"}},"amenity/fuel|TotalErg":{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":{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","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":{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":{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|Газпромнефть":{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:wikidata":"Q4063700","brand:wikipedia":"ru:Альянс (компания)",name:"НК Альянс"}},"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|ПТК":{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|Сургутнефтегаз":{tags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"}},"amenity/fuel|ТНК":{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|Татнефть":{tags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"}},"amenity/fuel|Укрнафта":{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|ادنوك":{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:["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:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"}},"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|Cold Stone Creamery":{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"],tags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"}},"amenity/ice_cream|La Michoacana":{tags:{amenity:"ice_cream",brand:"La Michoacana",name:"La Michoacana"}},"amenity/ice_cream|Ralph's Italian Ices":{countryCodes:["us"],matchNames:["ralphs famous italian ices","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:["rita's 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|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"],matchNames:["kindercare learning center"],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|Orange Money":{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"],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":{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":{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":{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":{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":{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":{tags:{amenity:"pharmacy",brand:"Farmacia Benavides","brand:wikidata":"Q5435613","brand:wikipedia":"en:Farmacias Benavides",healthcare:"pharmacy",name:"Farmacia Benavides"}},"amenity/pharmacy|Farmacia Familiei":{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 SalcoBrand":{countryCodes:["cl"],tags:{amenity:"pharmacy",brand:"Farmacias SalcoBrand","brand:wikidata":"Q2877054","brand:wikipedia":"es:Farmacias Salcobrand",healthcare:"pharmacy",name:"Farmacias SalcoBrand"}},"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|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|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":{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":{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":{tags:{amenity:"pharmacy",brand:"Kroger Pharmacy",healthcare:"pharmacy",name:"Kroger Pharmacy"}},"amenity/pharmacy|Kronans Apotek":{tags:{amenity:"pharmacy",brand:"Kronans Apotek",healthcare:"pharmacy",name:"Kronans Apotek"}},"amenity/pharmacy|Lloyds Pharmacy":{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":{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":{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"],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|TGP":{countryCodes:["ph"],matchNames:["the generics pharmacy"],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":{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":{matchNames:["ziko"],tags:{amenity:"pharmacy",brand:"Ziko Apteka","brand:wikidata":"Q63432892",healthcare:"pharmacy",name:"Ziko Apteka",short_name:"Ziko"}},"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|Бережная аптека":{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|Вита":{tags:{amenity:"pharmacy",brand:"Вита",healthcare:"pharmacy",name:"Вита"}},"amenity/pharmacy|Горздрав":{tags:{amenity:"pharmacy",brand:"Горздрав",healthcare:"pharmacy",name:"Горздрав"}},"amenity/pharmacy|Добрая аптека":{tags:{amenity:"pharmacy",brand:"Добрая аптека",healthcare:"pharmacy",name:"Добрая аптека"}},"amenity/pharmacy|Живика":{tags:{amenity:"pharmacy",brand:"Живика",healthcare:"pharmacy",name:"Живика"}},"amenity/pharmacy|Здоровье":{tags:{amenity:"pharmacy",brand:"Здоровье",healthcare:"pharmacy",name:"Здоровье"}},"amenity/pharmacy|Зеленая аптека":{tags:{amenity:"pharmacy",brand:"Зеленая аптека",healthcare:"pharmacy",name:"Зеленая аптека"}},"amenity/pharmacy|Имплозия":{tags:{amenity:"pharmacy",brand:"Имплозия",healthcare:"pharmacy",name:"Имплозия"}},"amenity/pharmacy|Классика":{tags:{amenity:"pharmacy",brand:"Классика",healthcare:"pharmacy",name:"Классика"}},"amenity/pharmacy|Ладушка":{tags:{amenity:"pharmacy",brand:"Ладушка",healthcare:"pharmacy",name:"Ладушка"}},"amenity/pharmacy|Максавит":{tags:{amenity:"pharmacy",brand:"Максавит",healthcare:"pharmacy",name:"Максавит"}},"amenity/pharmacy|Марешки":{tags:{amenity:"pharmacy",brand:"Марешки",healthcare:"pharmacy",name:"Марешки"}},"amenity/pharmacy|Мед-сервіс":{tags:{amenity:"pharmacy",brand:"Мед-сервіс",healthcare:"pharmacy",name:"Мед-сервіс"}},"amenity/pharmacy|Мелодия здоровья":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Мелодия здоровья",healthcare:"pharmacy",name:"Мелодия здоровья"}},"amenity/pharmacy|Невис":{tags:{amenity:"pharmacy",brand:"Невис",healthcare:"pharmacy",name:"Невис"}},"amenity/pharmacy|Норма":{tags:{amenity:"pharmacy",brand:"Норма",healthcare:"pharmacy",name:"Норма"}},"amenity/pharmacy|Озерки":{tags:{amenity:"pharmacy",brand:"Озерки",healthcare:"pharmacy",name:"Озерки"}},"amenity/pharmacy|Панацея":{tags:{amenity:"pharmacy",brand:"Панацея",healthcare:"pharmacy",name:"Панацея"}},"amenity/pharmacy|Первая помощь":{tags:{amenity:"pharmacy",brand:"Первая помощь",healthcare:"pharmacy",name:"Первая помощь"}},"amenity/pharmacy|Планета здоровья":{tags:{amenity:"pharmacy",brand:"Планета здоровья",healthcare:"pharmacy",name:"Планета здоровья"}},"amenity/pharmacy|Подорожник":{tags:{amenity:"pharmacy",brand:"Подорожник",healthcare:"pharmacy",name:"Подорожник"}},"amenity/pharmacy|Радуга":{tags:{amenity:"pharmacy",brand:"Радуга",healthcare:"pharmacy",name:"Радуга"}},"amenity/pharmacy|Ригла":{tags:{amenity:"pharmacy",brand:"Ригла","brand:wikidata":"Q4394431","brand:wikipedia":"ru:Ригла",healthcare:"pharmacy",name:"Ригла"}},"amenity/pharmacy|Семейная":{tags:{amenity:"pharmacy",brand:"Семейная",healthcare:"pharmacy",name:"Семейная"}},"amenity/pharmacy|Семейная аптека":{tags:{amenity:"pharmacy",brand:"Семейная аптека",healthcare:"pharmacy",name:"Семейная аптека"}},"amenity/pharmacy|Социальная аптека":{tags:{amenity:"pharmacy",brand:"Социальная аптека",healthcare:"pharmacy",name:"Социальная аптека"}},"amenity/pharmacy|Столички":{tags:{amenity:"pharmacy",brand:"Столички",healthcare:"pharmacy",name:"Столички"}},"amenity/pharmacy|Фармакопейка":{tags:{amenity:"pharmacy",brand:"Фармакопейка",healthcare:"pharmacy",name:"Фармакопейка"}},"amenity/pharmacy|Фармакор":{countryCodes:["ru"],tags:{amenity:"pharmacy",brand:"Фармакор",healthcare:"pharmacy",name:"Фармакор"}},"amenity/pharmacy|Фармація":{tags:{amenity:"pharmacy",brand:"Фармація",healthcare:"pharmacy",name:"Фармація"}},"amenity/pharmacy|Фармленд":{tags:{amenity:"pharmacy",brand:"Фармленд",healthcare:"pharmacy",name:"Фармленд"}},"amenity/pharmacy|Центральная аптека":{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: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"}},"amenity/post_box|差出箱13号":{tags:{amenity:"post_box",brand:"差出箱13号",name:"差出箱13号"}},"amenity/post_box|郵便ポスト":{countryCodes:["jp"],tags:{amenity:"post_box",brand:"郵便ポスト","brand:ja":"郵便ポスト",name:"郵便ポスト","name:ja":"郵便ポスト"}},"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":{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":{tags:{amenity:"post_office",brand:"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":{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":{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":{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":{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":{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|US Post Office":{countryCodes:["us"],matchNames:["united states post office","united states postal service","usps"],tags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"}},"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|СДЭК":{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|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","sylvan learning center"],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":{tags:{amenity:"public_bookcase",brand:"Offener Bücherschrank",name:"Offener Bücherschrank"}},"amenity/restaurant|100 Montaditos":{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 & bar","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":{tags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"}},"amenity/restaurant|BJ's":{countryCodes:["us"],tags:{amenity:"restaurant",brand:"BJ's","brand:wikidata":"Q4835755","brand:wikipedia":"en:BJ's Restaurants",cuisine:"american",name:"BJ's",official_name:"BJ's Restaurant & Brewhouse"}},"amenity/restaurant|Bella Italia":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",cuisine:"italian",name:"Bella Italia"}},"amenity/restaurant|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|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":{tags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"}},"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":{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":{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|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 & bar","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"],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",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|Cosmo":{countryCodes:["gb","ie"],tags:{amenity:"restaurant",brand:"Cosmo","brand:wikidata":"Q5174239","brand:wikipedia":"en:Cosmo (restaurant)",name:"Cosmo"}},"amenity/restaurant|Courtepaille":{tags:{amenity:"restaurant",brand:"Courtepaille","brand:wikidata":"Q3116688","brand:wikipedia":"fr:Grill Courtepaille",cuisine:"french",name:"Courtepaille"}},"amenity/restaurant|Cracker Barrel":{countryCodes:["us"],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",shop:"gift"}},"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"],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|Famous Dave's":{countryCodes:["us"],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":{tags:{amenity:"restaurant",brand:"First Watch","brand:wikidata":"Q5454064","brand:wikipedia":"en:First Watch (restaurant chain)",cuisine:"american",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":{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|Garba":{tags:{amenity:"restaurant",brand:"Garba",name:"Garba"}},"amenity/restaurant|Garbadrome":{countryCodes:["ci"],tags:{amenity:"restaurant",brand:"Garbadrome",name:"Garbadrome"}},"amenity/restaurant|Godfather's Pizza":{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"],tags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",cuisine:"american",name:"Golden Corral"}},"amenity/restaurant|Gourmet Burger Kitchen":{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|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"],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|IHOP":{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":{tags:{amenity:"restaurant",brand:"Il Giardino",name:"Il Giardino"}},"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":{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|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":{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|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":{tags:{amenity:"restaurant",brand:"MK Restaurants","brand:wikidata":"Q62075359",cuisine:"thai",name:"MK Restaurants"}},"amenity/restaurant|MOD Pizza":{tags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"}},"amenity/restaurant|Marco's Pizza":{tags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"}},"amenity/restaurant|Max's Restaurant":{countryCodes:["ph"],matchNames:["maxs of manila"],tags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",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|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|Mountain Mike's":{countryCodes:["us"],matchNames:["mountain mike's pizza"],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"],tags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",cuisine:"pasta",name:"Noodles & Company"}},"amenity/restaurant|Norky's":{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",cuisine:"pizza",name:"Old Chicago"}},"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",name:"Outback Steakhouse"}},"amenity/restaurant|P.F. Chang's":{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"}},"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)":{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|Prezzo":{countryCodes:["gb"],tags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",cuisine:"italian",name:"Prezzo"}},"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":{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"],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|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":{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":{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":{matchNames:["cheesecake factory"],tags:{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":{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":{matchNames:["melting pot"],tags:{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"],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|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|White Spot":{tags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",cuisine:"burger",name:"White Spot"}},"amenity/restaurant|Wingstop":{tags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",cuisine:"wings",name:"Wingstop"}},"amenity/restaurant|YO! Sushi":{tags:{amenity:"restaurant",brand:"YO! Sushi","brand:wikidata":"Q3105441","brand:wikipedia":"en:YO! Sushi",cuisine:"sushi",name:"YO! Sushi"}},"amenity/restaurant|Zizzi":{tags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",cuisine:"italian",name:"Zizzi"}},"amenity/restaurant|Евразия":{tags:{amenity:"restaurant",brand:"Евразия",name:"Евразия"}},"amenity/restaurant|Планета Суши":{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|Якитория":{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:デニーズ (日本)",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:バーミヤン (レストランチェーン)",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|八方雲集":{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|木曽路":{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:永和豆漿",name:"永和豆漿","name:en":"Yonghe Soy Milk"}},"amenity/restaurant|牛角":{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:{alt_name:"American Legion Hall",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 lodge","foe","fraternal order of eagles"],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:["benevolent and protective order of elks","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:["loyal order of moose"],tags:{alt_name:"Moose Lodge",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:["independent order of odd fellows","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/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 na jizdenky MHD":{tags:{amenity:"vending_machine",brand:"Automat na jizdenky MHD",name:"Automat na jizdenky MHD"}},"amenity/vending_machine|Automat ŚKUP":{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":{tags:{amenity:"vending_machine",brand:"BKK-automata",name:"BKK-automata"}},"amenity/vending_machine|DHL Packstation":{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)":{tags:{amenity:"vending_machine",brand:"ParkPlus","brand:wikidata":"Q63719595",name:"ParkPlus",vending:"parking_tickets"}},"amenity/vending_machine|Redbox":{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|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"}},"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|Curves":{tags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"}},"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|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|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:["ae","au","ca","cl","cn","co","cr","de","do","es","gb","gt","il","jp","kw","mx","nz","pa","pe","pl","pr","sa","sg","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/fitness_centre|clever fit":{countryCodes:["at","ch","de"],tags:{brand:"clever fit",leisure:"fitness_centre",name:"clever fit"}},"leisure/sports_centre|YMCA":{tags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"sports_centre",name:"YMCA"}},"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|RE/MAX":{tags:{brand:"RE/MAX","brand:wikidata":"Q965845","brand:wikipedia":"en:RE/MAX",name:"RE/MAX",office:"estate_agent"}},"office/financial_advisor|Edward Jones":{countryCodes:["ca","us"],matchTags:["office/financial"],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|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|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|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|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|Progressive":{countryCodes:["us"],matchNames:["progressive insurance"],tags:{brand:"Progressive","brand:wikidata":"Q7248721","brand:wikipedia":"en:Progressive Corporation",name:"Progressive",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/tax_advisor|H&R Block":{countryCodes:["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"],matchNames:["jackson hewitt tax service"],tags:{alt_name:"Jackson Hewitt Tax Service",brand:"Jackson Hewitt","brand:wikidata":"Q6117132","brand:wikipedia":"en:Jackson Hewitt",name:"Jackson Hewitt",office:"tax_advisor"}},"office/tax_advisor|Liberty Tax":{countryCodes:["us"],matchNames:["liberty tax service"],tags:{alt_name:"Liberty Tax Service",brand:"Liberty Tax","brand:wikidata":"Q6541978","brand:wikipedia":"en:Liberty Tax Service",name:"Liberty Tax",office:"tax_advisor"}},"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|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","de","fr","gb","pl"],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",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/baby_goods|Aubert":{countryCodes:["fr"],tags:{brand:"Aubert","brand:wikidata":"Q62964657",name:"Aubert",shop:"baby_goods"}},"shop/baby_goods|Babies R 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":{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|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"],matchTags:["amenity/fast_food"],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"],matchTags:["amenity/fast_food"],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":{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|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|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|Кулиничи":{countryCodes:["ua"],tags:{brand:"Кулиничи",name:"Кулиничи",shop:"bakery"}},"shop/bakery|Кулиничі":{countryCodes:["ua"],tags:{brand:"Кулиничі",name:"Кулиничі",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|파리바게뜨":{countryCodes:["kr"],tags:{brand:"파리바게뜨","brand:ko":"파리바게뜨",name:"파리바게뜨","name:ko":"파리바게뜨",shop:"bakery"}},"shop/bakery|파리바게트":{countryCodes:["kr"],tags:{brand:"파리바게트","brand:ko":"파리바게트",name:"파리바게트","name:ko":"파리바게트",shop:"bakery"}},"shop/beauty|Bath & Body Works":{tags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"}},"shop/beauty|Coiffure Dame":{tags:{brand:"Coiffure Dame",name:"Coiffure Dame",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":{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|Ulta Beauty":{countryCodes:["us"],matchNames:["ulta"],tags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"}},"shop/beauty|Yves Rocher":{matchTags:["shop/chemist","shop/cosmetics"],tags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"en:Yves Rocher (company)",name:"Yves Rocher",shop:"beauty"}},"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"],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|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|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|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:["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","pr","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":{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|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|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|Dekra":{countryCodes:["de","fr"],tags:{brand:"Dekra","brand:wikidata":"Q383711","brand:wikipedia":"en:Dekra",name:"Dekra",shop:"car_repair"}},"shop/car_repair|Euromaster":{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"],matchNames:["firestone complete auto care"],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|Meineke":{countryCodes:["us"],tags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",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:["pr","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 Tire & Auto Service":{countryCodes:["us"],matchNames:["tuffy tire and auto service"],tags:{brand:"Tuffy Tire & Auto Service","brand:wikidata":"Q17125314","brand:wikipedia":"en:Tuffy Auto Service Centers",name:"Tuffy Tire & Auto Service",shop:"car_repair"}},"shop/car_repair|Valvoline":{countryCodes:["us"],matchNames:["valvoline instant oil change"],tags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",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":{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":{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|Drogeria Natura":{countryCodes:["pl"],tags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"}},"shop/chemist|Etos":{tags:{brand:"Etos","brand:wikidata":"Q2609459","brand:wikipedia":"en:Etos",name:"Etos",shop:"chemist"}},"shop/chemist|Hebe":{tags:{brand:"Hebe",name:"Hebe",shop:"chemist"}},"shop/chemist|Holland & Barrett":{tags:{brand:"Holland & Barrett",name:"Holland & Barrett",shop:"chemist"}},"shop/chemist|Kruidvat":{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":{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":{tags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"}},"shop/chemist|Superdrug":{nomatch:["amenity/pharmacy|Superdrug"],tags:{brand:"Superdrug",name:"Superdrug",shop:"chemist"}},"shop/chemist|Teta":{tags:{brand:"Teta","brand:wikidata":"Q20860823","brand:wikipedia":"cs:Teta drogerie",name:"Teta",shop:"chemist"}},"shop/chemist|Tigotà":{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|Бытовая химия":{tags:{brand:"Бытовая химия",name:"Бытовая химия",shop:"chemist"}},"shop/chemist|Мила":{tags:{brand:"Мила",name:"Мила",shop:"chemist"}},"shop/chemist|Новэкс":{tags:{brand:"Новэкс",name:"Новэкс",shop:"chemist"}},"shop/chemist|Остров чистоты":{tags:{brand:"Остров чистоты",name:"Остров чистоты",shop:"chemist"}},"shop/chemist|Рубль Бум":{countryCodes:["ru"],tags:{brand:"Рубль Бум",name:"Рубль Бум",shop:"chemist"}},"shop/chemist|Улыбка радуги":{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|屈臣氏":{nomatch:["amenity/pharmacy|屈臣氏"],tags:{brand:"屈臣氏",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|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/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":{tags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",clothes:"men;women",name:"Abercrombie & Fitch",shop:"clothes"}},"shop/clothes|Accessorize":{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|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"}},"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|Ardene":{countryCodes:["ca","sn"],tags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",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|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":{tags:{brand:"Big Star","brand:wikidata":"Q9171569","brand:wikipedia":"pl:Big Star Limited",name:"Big Star",shop:"clothes"}},"shop/clothes|Bonita":{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|Buckle":{countryCodes:["np","us"],tags:{brand:"Buckle",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",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|Carhartt":{countryCodes:["gb","us"],tags:{brand:"Carhartt","brand:wikidata":"Q527877","brand:wikipedia":"en:Carhartt",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":{tags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"}},"shop/clothes|Cato":{countryCodes:["us"],tags:{brand:"Cato","brand:wikidata":"Q16956136","brand:wikipedia":"en:Cato Corporation",name:"Cato",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|Charles Vögele":{countryCodes:["at","be","ch","de","hu","nl"],matchNames:["vögele"],tags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"}},"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|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",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|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"}},"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",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|Diverse":{countryCodes:["pl"],tags:{brand:"Diverse","brand:wikidata":"Q11694298","brand:wikipedia":"pl:Diverse",name:"Diverse",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|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|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|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|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|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"],tags:{brand:"Hanna Andersson","brand:wikidata":"Q17460802","brand:wikipedia":"en:Hanna Andersson",clothes:"baby;children;women",name:"Hanna Andersson",shop:"clothes"}},"shop/clothes|Hollister":{tags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",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":{matchNames:["boss"],tags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"}},"shop/clothes|Humana":{tags:{brand:"Humana",name:"Humana",shop:"clothes"}},"shop/clothes|Hunkemöller":{tags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",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",name:"J. Crew",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|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"],tags:{brand:"Jos. A. Bank","brand:wikidata":"Q6204078","brand:wikipedia":"en:JoS. A. Bank Clothiers",name:"Jos. A. Bank",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",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","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"}},"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":{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":{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|Louis Vuitton":{tags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"}},"shop/clothes|Lululemon":{countryCodes:["au","ca","us"],tags:{brand:"Lululemon",name:"Lululemon",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|Mango":{tags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"}},"shop/clothes|Marc O'Polo":{tags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",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|Marks & Spencer":{tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",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":{matchNames:["mens warehouse"],tags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",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":{tags:{brand:"Naf Naf","brand:wikidata":"Q3334188","brand:wikipedia":"fr:Naf Naf",name:"Naf Naf",shop:"clothes"}},"shop/clothes|New Look":{tags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",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":{matchTags:["shop/shoes","shop/sports"],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":{tags:{brand:"Oasis",name:"Oasis",shop:"clothes"}},"shop/clothes|Okaïdi":{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|Pierre Cardin":{tags:{brand:"Pierre Cardin",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|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",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":{matchTags:["shop/sports"],nomatch:["amenity/fuel|Puma"],tags:{brand:"Puma","brand:wikidata":"Q7203029","brand:wikipedia":"en:Puma (brand)",name:"Puma",shop:"clothes"}},"shop/clothes|Quicksilver":{tags:{brand:"Quicksilver",name:"Quicksilver",shop:"clothes"}},"shop/clothes|Rainbow":{tags:{brand:"Rainbow","brand:wikidata":"Q7284708","brand:wikipedia":"en:Rainbow Shops",name:"Rainbow",shop:"clothes"}},"shop/clothes|Reebok":{matchTags:["shop/shoes","shop/sports"],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|Ross":{countryCodes:["us"],matchNames:["ross dress for less"],tags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",official_name:"Ross Dress for Less",shop:"clothes"}},"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":{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":{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|Springfield":{tags:{brand:"Springfield","brand:wikidata":"Q958209","brand:wikipedia":"es:Springfield (cadena de tiendas)",name:"Springfield",shop:"clothes"}},"shop/clothes|Stefanel":{tags:{brand:"Stefanel","brand:wikidata":"Q2338087","brand:wikipedia":"ro:Stefanel (companie)",name:"Stefanel",shop:"clothes"}},"shop/clothes|Steps":{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:{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:{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|Timberland":{matchTags:["shop/shoes"],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|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|Ulla Popken":{tags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",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":{matchNames:["benetton"],tags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"}},"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|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|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|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",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|Yamamay":{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":{matchTags:["shop/convenience"],tags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"}},"shop/computer|DNS":{tags:{brand:"DNS",name:"DNS",shop:"computer"}},"shop/computer|PC World":{tags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"}},"shop/computer|ДНС":{tags:{brand:"ДНС",name:"ДНС",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:wikidata":"Q10521791","brand:wikipedia":"sv:Hemmakväll",name:"Hemmakväll",shop:"confectionery"}},"shop/confectionery|Hussel":{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|See's Candies":{tags:{brand:"See's Candies","brand:wikidata":"Q2103510","brand:wikipedia":"en:See's Candies",name:"See's Candies",shop:"confectionery"}},"shop/confectionery|T. SN":{tags:{brand:"T. SN",name:"T. SN",shop:"confectionery"}},"shop/confectionery|Thorntons":{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|不二家":{tags:{brand:"不二家",name:"不二家",shop:"confectionery"}},"shop/convenience|24 часа":{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","lv"],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|Alfamart":{tags:{brand:"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":{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":{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":{nomatch:["amenity/fuel|Carrefour","shop/supermarket|Carrefour"],tags:{brand:"Carrefour Express",name:"Carrefour Express",shop:"convenience"}},"shop/convenience|Casey's General Store":{nomatch:["amenity/fuel|Casey's General Store"],tags:{brand:"Casey's General Store",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":{tags:{brand:"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":{tags:{brand:"Cheers",name:"Cheers",shop:"convenience"}},"shop/convenience|Chevron":{nomatch:["amenity/fuel|Chevron"],tags:{brand:"Chevron",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",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",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",name:"Couche-Tard",shop:"convenience"}},"shop/convenience|Cumberland Farms":{nomatch:["amenity/fuel|Cumberland Farms"],tags:{brand:"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",name:"ExtraMile",operator:"Chevron","operator:wikidata":"Q319642","operator:wikipedia":"en:Chevron Corporation",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":{tags:{brand:"Four Square","brand:wikidata":"Q5475558","brand:wikipedia":"en:Four Square (supermarket)",name:"Four Square",shop:"convenience"}},"shop/convenience|Franprix":{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":{tags:{brand:"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":{nomatch:["amenity/fuel|Husky"],tags:{brand:"Husky",name:"Husky",shop:"convenience"}},"shop/convenience|Indomaret":{tags:{brand:"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":"Q6117880","brand:wikipedia":"en:Jacksons Stores",name:"Jacksons",shop:"convenience"}},"shop/convenience|Jiffy":{tags:{brand:"Jiffy",name:"Jiffy",shop:"convenience"}},"shop/convenience|Joker":{tags:{brand:"Joker",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":{nomatch:["amenity/fuel|Kangaroo"],tags:{brand:"Kangaroo",name:"Kangaroo",shop:"convenience"}},"shop/convenience|Kangaroo Express":{countryCodes:["us"],tags:{brand:"Kangaroo Express",name:"Kangaroo Express",shop:"convenience"}},"shop/convenience|Konzum":{tags:{brand:"Konzum",name:"Konzum",shop:"convenience"}},"shop/convenience|Kum & Go":{nomatch:["amenity/fuel|Kum & Go"],tags:{brand:"Kum & Go",name:"Kum & Go",shop:"convenience"}},"shop/convenience|Kwik Trip":{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|Londis":{tags:{brand:"Londis",name:"Londis",shop:"convenience"}},"shop/convenience|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":{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|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|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":{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":{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":{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|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 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":{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"],matchNames:["udf"],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|Ивушка":{countryCodes:["by","ru"],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|Кулинария":{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":{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/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"],matchNames:["mac"],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":{tags:{brand:"Rituals",name:"Rituals",shop:"cosmetics"}},"shop/cosmetics|Sephora":{tags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"}},"shop/cosmetics|The Body Shop":{matchTags:["shop/beauty","shop/chemist"],tags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",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|Л'Этуаль":{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|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|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|Debenhams":{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":{tags:{brand:"Gordmans","brand:wikidata":"Q5584725","brand:wikipedia":"en:Gordmans",name:"Gordmans",shop:"department_store"}},"shop/department_store|HEMA":{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"],matchTags:["shop/clothes"],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":{tags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"}},"shop/department_store|Marks & Spencer":{tags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"}},"shop/department_store|Marshalls":{matchTags:["shop/clothes"],tags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",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"],matchTags:["shop/clothes"],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|Ripley":{tags:{brand:"Ripley","brand:wikidata":"Q3433040","brand:wikipedia":"en:Ripley S.A.",name:"Ripley",shop:"department_store"}},"shop/department_store|Saks Fifth Avenue":{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":{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":{tags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"}},"shop/department_store|Shopko":{tags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"}},"shop/department_store|Stein Mart":{matchTags:["shop/clothes"],tags:{brand:"Stein Mart","brand:wikidata":"Q7606770","brand:wikipedia":"en:Stein Mart",name:"Stein Mart",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"],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":{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:["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":{tags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"}},"shop/doityourself|Brico Dépôt":{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":{tags:{brand:"Bricoman","brand:wikidata":"Q2925142","brand:wikipedia":"it:Bricoman",name:"Bricoman",shop:"doityourself"}},"shop/doityourself|Bricomarché":{tags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"}},"shop/doityourself|Bricorama":{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":{tags:{brand:"Chausson Matériaux",name:"Chausson Matériaux",shop:"doityourself"}},"shop/doityourself|Clas Ohlson":{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":{tags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"}},"shop/doityourself|Gedimat":{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":{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 Depot":{countryCodes:["ca","mx","us"],matchNames:["the home depot"],tags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"}},"shop/doityourself|Home Hardware Building Centre":{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|Homebase":{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":{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":{tags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"}},"shop/doityourself|Menards":{tags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"}},"shop/doityourself|Mr.Bricolage":{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":{tags:{brand:"Point P",name:"Point P",shop:"doityourself"}},"shop/doityourself|Praktiker":{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":{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|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":{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|Леруа Мерлен":{tags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"}},"shop/doityourself|Мастер":{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|Юркас":{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|Диана":{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":{nomatch:["amenity/bank|Bcc"],tags:{brand:"BCC",name:"BCC",shop:"electronics"}},"shop/electronics|Batteries Plus Bulbs":{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|DNS":{tags:{brand:"DNS",name:"DNS",shop:"electronics"}},"shop/electronics|Darty":{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":{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|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":{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":{tags:{brand:"Medimax",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":{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 Source":{countryCodes:["ca"],tags:{brand:"The Source","brand:wikidata":"Q3212934","brand:wikipedia":"en:The Source (retailer)",name:"The Source",shop:"electronics"}},"shop/electronics|Trony":{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|М.Видео":{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|Эксперт":{tags:{brand:"Эксперт",name:"Эксперт",shop:"electronics"}},"shop/electronics|Эльдорадо":{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/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|Мосцветторг":{countryCodes:["ru"],tags:{brand:"Мосцветторг",name:"Мосцветторг",shop:"florist"}},"shop/frozen_food|Picard":{tags:{brand:"Picard","brand:wikidata":"Q3382454","brand:wikipedia":"en:Picard Surgelés",name:"Picard",shop:"frozen_food"}},"shop/funeral_directors|PFG":{countryCodes:["fr"],matchNames:["pompes funèbres générales"],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":{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",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|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":{matchTags:["shop/interior_decoration"],tags:{brand:"Casa",name:"Casa",shop:"furniture"}},"shop/furniture|Conforama":{tags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"}},"shop/furniture|Crate & Barrel":{matchNames:["crate and barrel"],tags:{brand:"Crate & Barrel","brand:wikidata":"Q5182604","brand:wikipedia":"en:Crate & Barrel",name:"Crate & Barrel",shop:"furniture"}},"shop/furniture|DFS":{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":{tags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"}},"shop/furniture|Fly":{tags:{brand:"Fly","brand:wikidata":"Q1389184","brand:wikipedia":"fr:Fly (entreprise)",name:"Fly",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|JYSK":{tags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"}},"shop/furniture|Kwantum":{countryCodes:["nl"],tags:{brand:"Kwantum",name:"Kwantum",shop:"furniture"}},"shop/furniture|La-Z-Boy":{tags:{brand:"La-Z-Boy","brand:wikidata":"Q6391583","brand:wikipedia":"en:La-Z-Boy",name:"La-Z-Boy",shop:"furniture"}},"shop/furniture|Leen Bakker":{tags:{brand:"Leen Bakker",name:"Leen Bakker",shop:"furniture"}},"shop/furniture|Maisons du Monde":{tags:{brand:"Maisons du Monde",name:"Maisons du Monde",shop:"furniture"}},"shop/furniture|Möbelix":{tags:{brand:"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":{tags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"}},"shop/furniture|Restoration Hardware":{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":{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|Williams-Sonoma":{countryCodes:["ca","us"],matchNames:["william sonoma"],tags:{brand:"Williams-Sonoma","brand:wikidata":"Q2581220","brand:wikipedia":"en:Williams-Sonoma",name:"Williams-Sonoma",shop:"furniture"}},"shop/furniture|İstikbal":{countryCodes:["tr"],tags:{brand:"İstikbal",name:"İstikbal",shop:"furniture"}},"shop/furniture|Много мебели":{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":{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|Disney Store":{countryCodes:["ca","fr","us"],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|Hallmark":{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|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":{tags:{brand:"Camille Albane","brand:wikidata":"Q62965183",name:"Camille Albane",shop:"hairdresser"}},"shop/hairdresser|Coiff&Co":{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":{tags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"}},"shop/hairdresser|Franck Provost":{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":{tags:{brand:"Jean Louis David",name:"Jean Louis David",shop:"hairdresser"}},"shop/hairdresser|Kirpykla":{countryCodes:["lt"],tags:{brand:"Kirpykla",name:"Kirpykla",shop:"hairdresser"}},"shop/hairdresser|Klier":{tags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"}},"shop/hairdresser|Klipp":{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|Sport Clips":{tags:{brand:"Sport Clips","brand:wikidata":"Q7579310",name:"Sport Clips",shop:"hairdresser"}},"shop/hairdresser|Super Cut":{tags:{brand:"Super Cut",name:"Super Cut",shop:"hairdresser"}},"shop/hairdresser|Supercuts":{tags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"}},"shop/hairdresser|Tchip":{tags:{brand:"Tchip","brand:wikidata":"Q62871250",name:"Tchip",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|Каприз":{tags:{brand:"Каприз",name:"Каприз",shop:"hairdresser"}},"shop/hairdresser|Фея":{tags:{brand:"Фея",name:"Фея",shop:"hairdresser"}},"shop/hairdresser|Шарм":{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|True Value":{tags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"}},"shop/hardware|Würth":{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":{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":{tags:{brand:"Audika","brand:wikidata":"Q2870745","brand:wikipedia":"fr:Audika",name:"Audika",shop:"hearing_aids"}},"shop/hearing_aids|Beter Horen":{tags:{brand:"Beter Horen",name:"Beter Horen",shop:"hearing_aids"}},"shop/hearing_aids|Geers":{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|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/hobby|アニメイト":{countryCodes:["jp"],tags:{brand:"アニメイト","brand:ja":"アニメイト",name:"アニメイト","name:ja":"アニメイト",shop:"hobby"}},"shop/houseware|Bed Bath & Beyond":{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":{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":{tags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"}},"shop/houseware|Lagerhaus":{matchTags:["shop/doityourself"],tags:{brand:"Lagerhaus","brand:wikidata":"Q10553211","brand:wikipedia":"sv:Lagerhaus",name:"Lagerhaus",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|World Market":{countryCodes:["us"],matchNames:["cost plus"],matchTags:["shop/department_store","shop/furniture","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|Еврочехол":{tags:{brand:"Еврочехол",name:"Еврочехол",shop:"houseware"}},"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|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/jewelry|585":{tags:{brand:"585",name:"585",shop:"jewelry"}},"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|Bijouterie":{tags:{brand:"Bijouterie",name:"Bijouterie",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|Ernest Jones":{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":{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|James Avery Jewelry":{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":{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|Swarovski":{tags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"}},"shop/jewelry|Tiffany & Company":{matchNames:["tiffany","tiffany & co","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|Адамас":{countryCodes:["ru"],tags:{brand:"Адамас","brand:wikidata":"Q62393709",name:"Адамас",shop:"jewelry"}},"shop/jewelry|Золотая мечта":{tags:{brand:"Золотая мечта",name:"Золотая мечта",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":{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":{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":{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":{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"],tags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",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":{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"],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"],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":{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",name:"Fido",shop:"mobile_phone"}},"shop/mobile_phone|Freedom Mobile":{countryCodes:["ca"],matchNames:["wind mobile"],tags:{brand:"Freedom Mobile","brand:wikidata":"Q8023931","brand:wikipedia":"en:Freedom Mobile",name:"Freedom Mobile",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":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",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":{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","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|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":{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|HMV":{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":{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|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":{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|Первая полоса":{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":{tags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"}},"shop/nutrition_supplements|The Vitamin Shoppe":{countryCodes:["us"],tags:{brand:"The Vitamin Shoppe","brand:wikidata":"Q7772938","brand:wikipedia":"en:The Vitamin Shoppe",name:"The Vitamin Shoppe",shop:"nutrition_supplements"}},"shop/optician|Alain Afflelou":{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"}},"shop/optician|Apollo-Optik":{countryCodes:["de"],matchNames:["apollo"],nomatch:["amenity/pharmacy|Apollo Pharmacy"],tags:{brand:"Apollo-Optik","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo-Optik",shop:"optician"}},"shop/optician|Atol":{countryCodes:["fr"],tags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"}},"shop/optician|Boots Opticians":{tags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"}},"shop/optician|Die Brille":{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":{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":{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":{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|Oakley":{matchTags:["shop/sports"],tags:{brand:"Oakley","brand:wikidata":"Q161906","brand:wikipedia":"en:Oakley, Inc.",name:"Oakley",shop:"optician"}},"shop/optician|Optic 2000":{tags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"}},"shop/optician|Opticalia":{tags:{brand:"Opticalia","brand:wikidata":"Q62082114",name:"Opticalia",shop:"optician"}},"shop/optician|Pearle":{matchNames:["pearle vision"],tags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"}},"shop/optician|Specsavers":{tags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"}},"shop/optician|Sunglass Hut":{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":{tags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",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|Cabela's":{countryCodes:["ca","us"],tags:{brand:"Cabela's","brand:wikidata":"Q2793714","brand:wikipedia":"en:Cabela's",name:"Cabela's",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|Mountain Warehouse":{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":{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":{tags:{brand:"National Paints","brand:wikidata":"Q62073521",name:"National Paints",shop:"paint"}},"shop/paint|Sherwin Williams":{matchNames:["sherwin williams paints"],tags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"}},"shop/party|Party City":{tags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"}},"shop/pastry|Smallcakes":{countryCodes:["us"],matchTags:["shop/bakery"],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":{tags:{brand:"Loombard",name:"Loombard",shop:"pawnbroker"}},"shop/pawnbroker|M Lhuillier":{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":{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|Скарбниця":{tags:{brand:"Скарбниця",name:"Скарбниця",shop:"pawnbroker"}},"shop/perfumery|Douglas":{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|Fressnapf":{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":{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|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":{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|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|Clarks":{tags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",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"],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|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":{tags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"}},"shop/shoes|Hush Puppies":{tags:{brand:"Hush Puppies","brand:wikidata":"Q1828588","brand:wikipedia":"en:Hush Puppies",name:"Hush Puppies",shop:"shoes"}},"shop/shoes|Johnston & Murphy":{countryCodes:["ca","us"],tags:{brand:"Johnston & Murphy","brand:wikidata":"Q6268615","brand:wikipedia":"en:Johnston & Murphy",name:"Johnston & Murphy",shop:"shoes"}},"shop/shoes|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|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|Mephisto":{tags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"}},"shop/shoes|Merrell":{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|Red Wing":{countryCodes:["de","gb","nl","us"],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":{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":{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|Stride Rite":{countryCodes:["us"],tags:{brand:"Stride Rite","brand:wikidata":"Q2356171","brand:wikipedia":"en:Stride Rite Corporation",name:"Stride Rite",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":{matchTags:["shop/clothes"],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":{matchTags:["shop/clothes","shop/shoes"],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"],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"],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|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"],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"],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|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":{tags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",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":{tags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",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":{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":{tags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"}},"shop/stationery|OfficeMax":{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":{tags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"}},"shop/stationery|Ryman":{countryCodes:["gb"],tags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"}},"shop/stationery|Staples":{matchTags:["shop/office_supplies"],tags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"}},"shop/stationery|Комус":{countryCodes:["ru"],tags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"}},"shop/storage_rental|Extra Space Storage":{countryCodes:["pr","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":{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":"Q3600279","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"],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|BM":{tags:{brand:"BM","brand:wikidata":"Q62073462",name:"BM",shop:"supermarket"}},"shop/supermarket|Bi-Lo":{countryCodes:["au","us"],tags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",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|Cargills Food City":{countryCodes:["lk"],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","shop/supermarket|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":{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 Express":{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:"supermarket"}},"shop/supermarket|Carrefour Market":{nomatch:["shop/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":{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","us"],tags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en: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":{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":{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":{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":{tags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",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~(US)":{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~(US)"],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~(US)"],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~(US)"],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|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 Market":{tags:{brand:"Fresh Market",name:"Fresh Market",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:website":"http://www.gbarbosa.com.br","brand:wikidata":"Q10287817","brand:wikipedia":"pt:GBarbosa",name:"GBarbosa",shop:"supermarket"}},"shop/supermarket|GS25":{tags:{brand:"GS25",name:"GS25",shop:"supermarket"}},"shop/supermarket|Gadis":{countryCodes:["es"],tags:{brand:"Gadis","brand:wikidata":"Q12389151","brand:wikipedia":"gl:Gadisa",name:"Gadis",shop:"supermarket"}},"shop/supermarket|Giant":{nomatch:["shop/bicycle|Giant"],tags:{brand:"Giant",name:"Giant",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|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",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|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":{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|Indomaret":{tags:{brand:"Indomaret",name:"Indomaret",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|Joker":{countryCodes:["no"],tags:{brand:"Joker","brand:wikidata":"Q716328","brand:wikipedia":"en:Joker (store)",name:"Joker",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|Kaufland":{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|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":{tags:{brand:"Konzum",name:"Konzum",shop:"supermarket"}},"shop/supermarket|Kroger":{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 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"],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"],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":{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","pl"],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|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":{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":{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",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:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"}},"shop/supermarket|Γαλαξίας":{countryCodes:["gr"],tags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"}},"shop/supermarket|Μασούτης":{countryCodes:["gr"],tags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"}},"shop/supermarket|Σκλαβενίτης":{countryCodes:["gr"],tags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","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|Ашан":{tags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"}},"shop/supermarket|Байрам":{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|Евроопт":{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":{tags:{brand:"Евроопт Super",name:"Евроопт Super",shop:"supermarket"}},"shop/supermarket|Караван":{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|Кировский":{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|Магнит у дома":{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|Мираторг":{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|Рублёвский":{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|頂好超市":{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|T2":{countryCodes:["au"],tags:{brand:"T2","brand:wikidata":"Q48802134","brand:wikipedia":"en:T2 (Australian company)",name:"T2",shop:"tea"}},"shop/tea|TeeGschwendner":{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"],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":{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|Fastenal":{countryCodes:["ca","pa","pr","us"],matchTags:["shop/doityourself","shop/hardware"],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"],matchTags:["shop/doityourself","shop/hardware"],tags:{brand:"Grainger","brand:wikidata":"Q1627894","brand:wikipedia":"en:W. W. Grainger",name:"Grainger",shop:"trade"}},"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|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":{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":{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|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 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":{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":{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":{tags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"}},"shop/variety_store|Centrakor":{countryCodes:["fr"],tags:{brand:"Centrakor",name:"Centrakor",shop:"variety_store"}},"shop/variety_store|Dollar General":{countryCodes:["us"],matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"}},"shop/variety_store|Dollar Tree":{matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"}},"shop/variety_store|Dollarama":{countryCodes:["ca"],tags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"}},"shop/variety_store|Family Dollar":{matchTags:["shop/convenience","shop/department_store","shop/supermarket"],tags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"}},"shop/variety_store|Five Below":{tags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"}},"shop/variety_store|Fix Price":{tags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"}},"shop/variety_store|GiFi":{tags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"}},"shop/variety_store|Home Bargains":{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":{tags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"}},"shop/variety_store|Roses":{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":{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":{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":{tags:{brand:"Fossil","brand:wikidata":"Q356212","brand:wikipedia":"en:Fossil Group",name:"Fossil",shop:"watches"}},"shop/watches|Swatch":{tags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"}},"shop/wholesale|BJ's Wholesale Club":{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":{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":{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":{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":{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":{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":{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":{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":{tags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"}},"tourism/hotel|Extended Stay America":{tags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"}},"tourism/hotel|Fairfield Inn":{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":{matchNames:["hampton inn","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":{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":{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":{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":{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|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":{tags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"}},"tourism/hotel|Première Classe":{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":{tags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"}},"tourism/hotel|Quality Inn & Suites":{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":{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":{tags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"}},"tourism/hotel|Staybridge Suites":{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":{tags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"}},"tourism/motel|Super 8":{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"}}};
65075         var brands$1 = {
65076         brands: brands
65077         };
65078
65079         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$","^shop/(?!(yes|no|gas|convenience;gas|laundry|lottery|mall))","^tourism/(h|m)otel$"];
65080         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( |-)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/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\\|(bäckerei\\s)?müller","^shop/bakery\\|backshop$","^shop/bakery\\|schneider$","^shop/butcher\\|butcher$","^shop/clothes\\|трикотаж$","^shop/convenience\\|(августина|весна|визит|ветеран|домашний)$","^shop/convenience\\|(калинка|колобок|колос(ок)?|ласточка|лидер|любимый|людмила|люкс)$","^shop/convenience\\|(мечта|мираж|белорусские продукты|продукты 24|натали|надежда)$","^shop/convenience\\|(олимп|престиж|подсолнух|росинка|ромашка|родник|родны кут|рассвет)$","^shop/convenience\\|(семейный|спутник|солнечный|светлана)$","^shop/convenience\\|(южный|эконом|шанс|чайка|центральный|хороший|фаворит|татьяна)$","^shop/convenience\\|milk bar$","^shop/convenience\\|юлия$","^shop/florist\\|мир цветов$","^shop/frame\\|rumah\\spenduduk$","^shop/hairdresser\\|haarwerk$","^shop/hairdresser\\|стиль|локон$","^shop/hardware\\|(всё для дома|1000 мелочей)$","^shop/money_transfer|mobil(e)?\\smoney$","^shop/optician\\|vision\\splus$","^shop/supermarket\\|famiglia cooperativa$","^shop/supermarket\\|семейный$","^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)$"];
65081         var discardNames = ["\\(historical\\)","^((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$","^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)( homme)?$","^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$","^euroshop$","^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)?$","^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)","^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\\))?","^カフェ$","^ポスト$","^体育館$","^加油站$","^珈琲館$","^自動販売機$","^自販機$","^郵局$","^食堂$"];
65082         var filters = {
65083         keepTags: keepTags,
65084         discardKeys: discardKeys,
65085         discardNames: discardNames
65086         };
65087
65088         // ES5 for iD, for now
65089
65090
65091         // remove spaces, punctuation, diacritics
65092         var simplify = function simplify(str) {
65093             return diacritics.remove(
65094                 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,'')
65095                     .toLowerCase()
65096             );
65097         };
65098
65099         // ES5 for iD, for now
65100
65101
65102         // toParts - split a name-suggestion-index key into parts
65103         // {
65104         //   kvnd:        "amenity/fast_food|Thaï Express~(North America)",
65105         //   kvn:         "amenity/fast_food|Thaï Express",
65106         //   kv:          "amenity/fast_food",
65107         //   k:           "amenity",
65108         //   v:           "fast_food",
65109         //   n:           "Thaï Express",
65110         //   d:           "(North America)",
65111         //   nsimple:     "thaiexpress",
65112         //   kvnnsimple:  "amenity/fast_food|thaiexpress"
65113         // }
65114         var to_parts = function toParts(kvnd) {
65115             var parts = {};
65116             parts.kvnd = kvnd;
65117
65118             var kvndparts = kvnd.split('~', 2);
65119             if (kvndparts.length > 1) parts.d = kvndparts[1];
65120
65121             parts.kvn = kvndparts[0];
65122             var kvnparts = parts.kvn.split('|', 2);
65123             if (kvnparts.length > 1) parts.n = kvnparts[1];
65124
65125             parts.kv = kvnparts[0];
65126             var kvparts = parts.kv.split('/', 2);
65127             parts.k = kvparts[0];
65128             parts.v = kvparts[1];
65129
65130             parts.nsimple = simplify(parts.n);
65131             parts.kvnsimple = parts.kv + '|' + parts.nsimple;
65132             return parts;
65133         };
65134
65135         var matchGroups = {beauty:["shop/beauty","shop/hairdresser_supply"],beverages:["shop/alcohol","shop/beverages"],confectionery:["shop/candy","shop/chocolate","shop/confectionery"],convenience:["shop/beauty","shop/chemist","shop/convenience","shop/cosmetics"],electronics:["shop/computer","shop/electronics","shop/hifi","shop/mobile","shop/mobile_phone"],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/tea","shop/coffee"],fuel:["amenity/fuel","shop/gas","shop/convenience;gas","shop/gas;convenience"],hardware:["shop/doityourself","shop/hardware"],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"]};
65136         var match_groups = {
65137         matchGroups: matchGroups
65138         };
65139
65140         var match_groups$1 = /*#__PURE__*/Object.freeze({
65141                 matchGroups: matchGroups,
65142                 'default': match_groups
65143         });
65144
65145         var require$$0 = getCjsExportFromNamespace(match_groups$1);
65146
65147         // ES5 for iD, for now
65148
65149
65150
65151         var matchGroups$1 = require$$0.matchGroups;
65152
65153
65154         var matcher$1 = function() {
65155             var _warnings = [];    // array of match conflict pairs
65156             var _ambiguous = {};
65157             var _matchIndex = {};
65158             var matcher = {};
65159
65160             // Create an index of all the keys/simplenames for fast matching
65161             matcher.buildMatchIndex = function(brands) {
65162                 Object.keys(brands).forEach(function(kvnd) {
65163                     var obj = brands[kvnd];
65164                     var parts = to_parts(kvnd);
65165
65166                     var matchTags = (obj.matchTags || [])
65167                         .map(function(s) { return s.toLowerCase(); });
65168                     var matchNames = (obj.matchNames || [])
65169                         .map(simplify);
65170                     var nomatches = (obj.nomatch || [])
65171                         .map(function(kvnd) { return to_parts(kvnd).kvnsimple; });
65172
65173                     var match_kv = [parts.kv].concat(matchTags);
65174                     var match_nsimple = [parts.nsimple].concat(matchNames);
65175
65176                     match_kv.forEach(function(kv) {
65177                         match_nsimple.forEach(function(nsimple) {
65178                             var test = kv + nsimple;
65179                             if (nomatches.some(function(s) { return s === test; })) {
65180                                 console.log('WARNING match/nomatch conflict for ' + test);
65181                                 return;
65182                             }
65183
65184                             if (parts.d) {
65185                                 // fixme: duplicates will overwrite the single entry (ok for now)
65186                                 if (!_ambiguous[kv]) _ambiguous[kv] = {};
65187                                 _ambiguous[kv][nsimple] = parts;
65188                             } else {
65189                                 // duplicates are a problem in matchIndex, warn if we detect it
65190                                 if (!_matchIndex[kv]) _matchIndex[kv] = {};
65191                                 var m = _matchIndex[kv][nsimple];
65192                                 if (m) {  // there already is a match for this
65193                                     _warnings.push([m.kvnd, kvnd + ' ("' + nsimple + '")']);
65194                                 } else {
65195                                     _matchIndex[kv][nsimple] = parts;
65196                                 }
65197                             }
65198                         });
65199                     });
65200                 });
65201             };
65202
65203
65204             // pass a `key`, `value`, `name` and return the best match
65205             matcher.matchKVN = function(key, value, name) {
65206                 return matcher.matchParts(to_parts(key + '/' + value + '|' + name));
65207             };
65208
65209             // pass a parts object and return the best match
65210             matcher.matchParts = function(parts) {
65211                 var match = null;
65212                 var inGroup = false;
65213
65214                 // fixme: we currently return a single match for ambiguous
65215                 match = _ambiguous[parts.kv] && _ambiguous[parts.kv][parts.nsimple];
65216                 if (match) return match;
65217
65218                 // try to return an exact match
65219                 match = _matchIndex[parts.kv] && _matchIndex[parts.kv][parts.nsimple];
65220                 if (match) return match;
65221
65222                 // look in match groups
65223                 for (var mg in matchGroups$1) {
65224                     var matchGroup = matchGroups$1[mg];
65225                     match = null;
65226                     inGroup = false;
65227
65228                     for (var i = 0; i < matchGroup.length; i++) {
65229                         var otherkv = matchGroup[i].toLowerCase();
65230                         if (!inGroup) {
65231                             inGroup = (otherkv === parts.kv);
65232                         }
65233                         if (!match) {
65234                             // fixme: we currently return a single match for ambiguous
65235                             match = _ambiguous[otherkv] && _ambiguous[otherkv][parts.nsimple];
65236                         }
65237                         if (!match) {
65238                             match = _matchIndex[otherkv] && _matchIndex[otherkv][parts.nsimple];
65239                         }
65240
65241                         if (inGroup && match) {
65242                             return match;
65243                         }
65244                     }
65245                 }
65246
65247                 return null;
65248             };
65249
65250
65251             matcher.getWarnings = function() {
65252                 return _warnings;
65253             };
65254
65255
65256             return matcher;
65257         };
65258
65259         /* DATA */
65260
65261         function validationGenericName() {
65262             var type = 'generic_name';
65263
65264             // known list of generic names (e.g. "bar")
65265             var discardNamesRegexes = filters.discardNames.map(function(discardName) {
65266                 return new RegExp(discardName, 'i');
65267             });
65268
65269             var keysToTestForGenericValues = ['amenity', 'building', 'leisure', 'man_made', 'shop', 'tourism'];
65270
65271             function isGenericName(entity) {
65272                 var name = entity.tags.name;
65273                 if (!name) return false;
65274                 name = name.toLowerCase();
65275
65276                 var i, key, val;
65277
65278                 // test if the name is just the key or tag value (e.g. "park")
65279                 for (i = 0; i < keysToTestForGenericValues.length; i++) {
65280                     key = keysToTestForGenericValues[i];
65281                     val = entity.tags[key];
65282                     if (val) {
65283                         val = val.toLowerCase();
65284                         if (key === name ||
65285                             val === name ||
65286                             key.replace(/\_/g, ' ') === name ||
65287                             val.replace(/\_/g, ' ') === name) {
65288                             return entity.tags.name;
65289                         }
65290                     }
65291                 }
65292
65293                 // test if the name is otherwise generic
65294                 for (i = 0; i < discardNamesRegexes.length; i++) {
65295                     if (discardNamesRegexes[i].test(name)) {
65296                         return entity.tags.name;
65297                     }
65298                 }
65299
65300                 return false;
65301             }
65302
65303
65304             var validation = function checkGenericName(entity, context) {
65305                 var generic = isGenericName(entity);
65306                 if (!generic) return [];
65307
65308                 return [new validationIssue({
65309                     type: type,
65310                     severity: 'warning',
65311                     message: function() {
65312                         var entity = context.hasEntity(this.entityIds[0]);
65313                         if (!entity) return '';
65314                         var preset = utilPreset(entity, context);
65315                         return t('issues.generic_name.message', { feature: preset.name(), name: generic });
65316                     },
65317                     reference: showReference,
65318                     entityIds: [entity.id],
65319                     hash: generic,
65320                     fixes: [
65321                         new validationIssueFix({
65322                             icon: 'iD-operation-delete',
65323                             title: t('issues.fix.remove_generic_name.title'),
65324                             onClick: function() {
65325                                 var entityId = this.issue.entityIds[0];
65326                                 var entity = context.entity(entityId);
65327                                 var tags = Object.assign({}, entity.tags);   // shallow copy
65328                                 delete tags.name;
65329                                 context.perform(
65330                                     actionChangeTags(entityId, tags),
65331                                     t('issues.fix.remove_generic_name.annotation')
65332                                 );
65333                             }
65334                         })
65335                     ]
65336                 })];
65337
65338
65339                 function showReference(selection) {
65340                     selection.selectAll('.issue-reference')
65341                         .data([0])
65342                         .enter()
65343                         .append('div')
65344                         .attr('class', 'issue-reference')
65345                         .text(t('issues.generic_name.reference'));
65346                 }
65347             };
65348
65349             validation.type = type;
65350
65351             return validation;
65352         }
65353
65354         function validationImpossibleOneway() {
65355             var type = 'impossible_oneway';
65356
65357             function typeForWay(way, context) {
65358                 if (way.geometry(context.graph()) !== 'line') return null;
65359
65360                 if (osmRoutableHighwayTagValues[way.tags.highway]) return 'highway';
65361                 if (osmFlowingWaterwayTagValues[way.tags.waterway]) return 'waterway';
65362                 return null;
65363             }
65364
65365             function isOneway(way) {
65366                 if (way.tags.oneway === 'yes') return true;
65367                 if (way.tags.oneway) return false;
65368
65369                 for (var key in way.tags) {
65370                     if (osmOneWayTags[key] && osmOneWayTags[key][way.tags[key]]) {
65371                         return true;
65372                     }
65373                 }
65374                 return false;
65375             }
65376
65377             function continueDrawing(way, vertex, context) {
65378                 // make sure the vertex is actually visible and editable
65379                 var map = context.map();
65380                 if (!map.editable() || !map.trimmedExtent().contains(vertex.loc)) {
65381                     map.zoomToEase(vertex);
65382                 }
65383
65384                 context.enter(
65385                     modeDrawLine(context, way.id, context.graph(), context.graph(), 'line', way.affix(vertex.id), true)
65386                 );
65387             }
65388
65389             function nodeOccursMoreThanOnce(way, nodeID) {
65390                 var occurences = 0;
65391                 for (var index in way.nodes) {
65392                     if (way.nodes[index] === nodeID) {
65393                         occurences += 1;
65394                         if (occurences > 1) return true;
65395                     }
65396                 }
65397                 return false;
65398             }
65399
65400             function isConnectedViaOtherTypes(context, way, node) {
65401
65402                 var wayType = typeForWay(way, context);
65403
65404                 if (wayType === 'highway') {
65405                     // entrances are considered connected
65406                     if (node.tags.entrance && node.tags.entrance !== 'no') return true;
65407                     if (node.tags.amenity === 'parking_entrance') return true;
65408                 } else if (wayType === 'waterway') {
65409                     if (node.id === way.first()) {
65410                         // multiple waterways may start at the same spring
65411                         if (node.tags.natural === 'spring') return true;
65412                     } else {
65413                         // multiple waterways may end at the same drain
65414                         if (node.tags.manhole === 'drain') return true;
65415                     }
65416                 }
65417
65418                 return context.graph().parentWays(node).some(function(parentWay) {
65419                     if (parentWay.id === way.id) return false;
65420
65421                     if (wayType === 'highway') {
65422
65423                         // allow connections to highway areas
65424                         if (parentWay.geometry(context.graph()) === 'area' &&
65425                             osmRoutableHighwayTagValues[parentWay.tags.highway]) return true;
65426
65427                         // count connections to ferry routes as connected
65428                         if (parentWay.tags.route === 'ferry') return true;
65429
65430                         return context.graph().parentRelations(parentWay).some(function(parentRelation) {
65431                             if (parentRelation.tags.type === 'route' &&
65432                                 parentRelation.tags.route === 'ferry') return true;
65433
65434                             // allow connections to highway multipolygons
65435                             return parentRelation.isMultipolygon() && osmRoutableHighwayTagValues[parentRelation.tags.highway];
65436                         });
65437                     } else if (wayType === 'waterway') {
65438                         // multiple waterways may start or end at a water body at the same node
65439                         if (parentWay.tags.natural === 'water' ||
65440                             parentWay.tags.natural === 'coastline') return true;
65441                     }
65442                     return false;
65443                 });
65444             }
65445
65446             function issuesForNode(context, way, nodeID) {
65447
65448                 var isFirst = nodeID === way.first();
65449
65450                 var wayType = typeForWay(way, context);
65451
65452                 // ignore if this way is self-connected at this node
65453                 if (nodeOccursMoreThanOnce(way, nodeID)) return [];
65454
65455                 var osm = context.connection();
65456                 if (!osm) return [];
65457
65458                 var node = context.hasEntity(nodeID);
65459
65460                 // ignore if this node or its tile are unloaded
65461                 if (!node || !osm.isDataLoaded(node.loc)) return [];
65462
65463                 if (isConnectedViaOtherTypes(context, way, node)) return [];
65464
65465                 var attachedWaysOfSameType = context.graph().parentWays(node).filter(function(parentWay) {
65466                     if (parentWay.id === way.id) return false;
65467                     return typeForWay(parentWay, context) === wayType;
65468                 });
65469
65470                 // assume it's okay for waterways to start or end disconnected for now
65471                 if (wayType === 'waterway' && attachedWaysOfSameType.length === 0) return [];
65472
65473                 var attachedOneways = attachedWaysOfSameType.filter(function(attachedWay) {
65474                     return isOneway(attachedWay);
65475                 });
65476
65477                 // ignore if the way is connected to some non-oneway features
65478                 if (attachedOneways.length < attachedWaysOfSameType.length) return [];
65479
65480                 if (attachedOneways.length) {
65481                     var connectedEndpointsOkay = attachedOneways.some(function(attachedOneway) {
65482                         if ((isFirst ? attachedOneway.first() : attachedOneway.last()) !== nodeID) return true;
65483                         if (nodeOccursMoreThanOnce(attachedOneway, nodeID)) return true;
65484                         return false;
65485                     });
65486                     if (connectedEndpointsOkay) return [];
65487                 }
65488
65489                 var fixes = [];
65490
65491                 if (attachedOneways.length) {
65492                     fixes.push(new validationIssueFix({
65493                         icon: 'iD-operation-reverse',
65494                         title: t('issues.fix.reverse_feature.title'),
65495                         entityIds: [way.id],
65496                         onClick: function() {
65497                             var id = this.issue.entityIds[0];
65498                             context.perform(actionReverse(id), t('operations.reverse.annotation'));
65499                         }
65500                     }));
65501                 }
65502                 if (node.tags.noexit !== 'yes') {
65503                     fixes.push(new validationIssueFix({
65504                         icon: 'iD-operation-continue' + (isFirst ? '-left' : ''),
65505                         title: t('issues.fix.continue_from_' + (isFirst ? 'start' : 'end') + '.title'),
65506                         onClick: function() {
65507                             var entityID = this.issue.entityIds[0];
65508                             var vertexID = this.issue.entityIds[1];
65509                             var way = context.entity(entityID);
65510                             var vertex = context.entity(vertexID);
65511                             continueDrawing(way, vertex, context);
65512                         }
65513                     }));
65514                 }
65515
65516                 var placement = isFirst ? 'start' : 'end',
65517                     messageID = wayType + '.',
65518                     referenceID = wayType + '.';
65519
65520                 if (wayType === 'waterway') {
65521                     messageID += 'connected.' + placement;
65522                     referenceID += 'connected';
65523                 } else {
65524                     messageID += placement;
65525                     referenceID += placement;
65526                 }
65527
65528                 return [new validationIssue({
65529                     type: type,
65530                     subtype: wayType,
65531                     severity: 'warning',
65532                     message: function() {
65533                         var entity = context.hasEntity(this.entityIds[0]);
65534                         return entity ? t('issues.impossible_oneway.' + messageID + '.message', {
65535                             feature: utilDisplayLabel(entity, context)
65536                         }) : '';
65537                     },
65538                     reference: getReference(referenceID),
65539                     entityIds: [way.id, node.id],
65540                     fixes: fixes
65541                 })];
65542
65543                 function getReference(referenceID) {
65544                     return function showReference(selection) {
65545                         selection.selectAll('.issue-reference')
65546                             .data([0])
65547                             .enter()
65548                             .append('div')
65549                             .attr('class', 'issue-reference')
65550                             .text(t('issues.impossible_oneway.' + referenceID + '.reference'));
65551                     };
65552                 }
65553             }
65554
65555             var validation = function checkImpossibleOneway(entity, context) {
65556
65557                 if (entity.type !== 'way' || entity.geometry(context.graph()) !== 'line') return [];
65558
65559                 if (entity.isClosed()) return [];
65560
65561                 if (!typeForWay(entity, context)) return [];
65562
65563                 if (!isOneway(entity)) return [];
65564
65565                 var firstIssues = issuesForNode(context, entity, entity.first());
65566                 var lastIssues = issuesForNode(context, entity, entity.last());
65567
65568                 return firstIssues.concat(lastIssues);
65569             };
65570
65571
65572             validation.type = type;
65573
65574             return validation;
65575         }
65576
65577         function validationIncompatibleSource() {
65578             var type = 'incompatible_source';
65579             var invalidSources = [{id:'google', regex:'google'}];
65580
65581             var validation = function checkIncompatibleSource(entity, context) {
65582                 var issues = [];
65583
65584                 if (entity.tags && entity.tags.source) {
65585                     invalidSources.forEach(function(invalidSource) {
65586                         var pattern = new RegExp(invalidSource.regex, 'i');
65587
65588                         if (entity.tags.source.match(pattern)) {
65589                             issues.push(new validationIssue({
65590                                 type: type,
65591                                 severity: 'warning',
65592                                 message: function() {
65593                                     var entity = context.hasEntity(this.entityIds[0]);
65594                                     return entity ? t('issues.incompatible_source.' + invalidSource.id + '.feature.message', {
65595                                         feature: utilDisplayLabel(entity, context)
65596                                     }) : '';
65597                                 },
65598                                 reference: getReference(invalidSource.id),
65599                                 entityIds: [entity.id],
65600                                 fixes: [
65601                                     new validationIssueFix({
65602                                         title: t('issues.fix.remove_proprietary_data.title')
65603                                     })
65604                                 ]
65605                             }));
65606                         }
65607                     });
65608                 }
65609
65610                 return issues;
65611
65612
65613                 function getReference(id) {
65614                     return function showReference(selection) {
65615                         selection.selectAll('.issue-reference')
65616                             .data([0])
65617                             .enter()
65618                             .append('div')
65619                             .attr('class', 'issue-reference')
65620                             .text(t('issues.incompatible_source.' + id + '.reference'));
65621                     };
65622                 }
65623             };
65624
65625             validation.type = type;
65626
65627             return validation;
65628         }
65629
65630         function validationMaprules() {
65631             var type = 'maprules';
65632
65633             var validation = function checkMaprules(entity, context) {
65634                 if (!services$1.maprules) return [];
65635
65636                 var graph = context.graph();
65637                 var rules = services$1.maprules.validationRules();
65638                 var issues = [];
65639
65640                 for (var i = 0; i < rules.length; i++) {
65641                     var rule = rules[i];
65642                     rule.findIssues(entity, graph, issues);
65643                 }
65644
65645                 return issues;
65646             };
65647
65648
65649             validation.type = type;
65650
65651             return validation;
65652         }
65653
65654         function validationMissingRole() {
65655             var type = 'missing_role';
65656
65657             var validation = function checkMissingRole(entity, context) {
65658                 var issues = [];
65659                 if (entity.type === 'way') {
65660                     context.graph().parentRelations(entity).forEach(function(relation) {
65661                         if (!relation.isMultipolygon()) return;
65662
65663                         var member = relation.memberById(entity.id);
65664                         if (member && isMissingRole(member)) {
65665                             issues.push(makeIssue(entity, relation, member, context));
65666                         }
65667                     });
65668                 } else if (entity.type === 'relation' && entity.isMultipolygon()) {
65669                     entity.indexedMembers().forEach(function(member) {
65670                         var way = context.hasEntity(member.id);
65671                         if (way && isMissingRole(member)) {
65672                             issues.push(makeIssue(way, entity, member, context));
65673                         }
65674                     });
65675                 }
65676
65677                 return issues;
65678             };
65679
65680
65681             function isMissingRole(member) {
65682                 return !member.role || !member.role.trim().length;
65683             }
65684
65685
65686             function makeIssue(way, relation, member, context) {
65687                 return new validationIssue({
65688                     type: type,
65689                     severity: 'warning',
65690                     message: function() {
65691                         var member = context.hasEntity(this.entityIds[1]),
65692                             relation = context.hasEntity(this.entityIds[0]);
65693                         return (member && relation) ? t('issues.missing_role.message', {
65694                             member: utilDisplayLabel(member, context),
65695                             relation: utilDisplayLabel(relation, context)
65696                         }) : '';
65697                     },
65698                     reference: showReference,
65699                     entityIds: [relation.id, way.id],
65700                     data: {
65701                         member: member
65702                     },
65703                     hash: member.index.toString(),
65704                     fixes: [
65705                         makeAddRoleFix('inner', context),
65706                         makeAddRoleFix('outer', context),
65707                         new validationIssueFix({
65708                             icon: 'iD-operation-delete',
65709                             title: t('issues.fix.remove_from_relation.title'),
65710                             onClick: function() {
65711                                 context.perform(
65712                                     actionDeleteMember(this.issue.entityIds[0], this.issue.data.member.index),
65713                                     t('operations.delete_member.annotation')
65714                                 );
65715                             }
65716                         })
65717                     ]
65718                 });
65719
65720
65721                 function showReference(selection) {
65722                     selection.selectAll('.issue-reference')
65723                         .data([0])
65724                         .enter()
65725                         .append('div')
65726                         .attr('class', 'issue-reference')
65727                         .text(t('issues.missing_role.multipolygon.reference'));
65728                 }
65729             }
65730
65731
65732             function makeAddRoleFix(role, context) {
65733                 return new validationIssueFix({
65734                     title: t('issues.fix.set_as_' + role + '.title'),
65735                     onClick: function() {
65736                         var oldMember = this.issue.data.member;
65737                         var member = { id: this.issue.entityIds[1], type: oldMember.type, role: role };
65738                         context.perform(
65739                             actionChangeMember(this.issue.entityIds[0], member, oldMember.index),
65740                             t('operations.change_role.annotation')
65741                         );
65742                     }
65743                 });
65744             }
65745
65746             validation.type = type;
65747
65748             return validation;
65749         }
65750
65751         function validationMissingTag() {
65752             var type = 'missing_tag';
65753
65754
65755             function hasDescriptiveTags(entity) {
65756                 var keys = Object.keys(entity.tags)
65757                     .filter(function(k) {
65758                         if (k === 'area' || k === 'name') {
65759                             return false;
65760                         } else {
65761                             return osmIsInterestingTag(k);
65762                         }
65763                     });
65764
65765                 if (entity.type === 'relation' && keys.length === 1) {
65766                     return entity.tags.type !== 'multipolygon';
65767                 }
65768                 return keys.length > 0;
65769             }
65770
65771
65772             function isUnknownRoad(entity) {
65773                 return entity.type === 'way' && entity.tags.highway === 'road';
65774             }
65775
65776             function isUntypedRelation(entity) {
65777                 return entity.type === 'relation' && !entity.tags.type;
65778             }
65779
65780
65781             var validation = function checkMissingTag(entity, context) {
65782                 var graph = context.graph();
65783
65784                 // ignore vertex features and relation members
65785                 if (entity.geometry(graph) === 'vertex' || entity.hasParentRelations(graph)) {
65786                     return [];
65787                 }
65788
65789                 var subtype;
65790
65791                 if (Object.keys(entity.tags).length === 0) {
65792                     subtype = 'any';
65793                 } else if (!hasDescriptiveTags(entity)) {
65794                     subtype = 'descriptive';
65795                 } else if (isUntypedRelation(entity)) {
65796                     subtype = 'relation_type';
65797                 } else if (isUnknownRoad(entity)) {
65798                     subtype = 'highway_classification';
65799                 }
65800
65801                 if (!subtype) return [];
65802
65803                 var selectFixType = subtype === 'highway_classification' ? 'select_road_type' : 'select_preset';
65804
65805                 var fixes = [
65806                     new validationIssueFix({
65807                         icon: 'iD-icon-search',
65808                         title: t('issues.fix.' + selectFixType + '.title'),
65809                         onClick: function() {
65810                             context.ui().sidebar.showPresetList();
65811                         }
65812                     })
65813                 ];
65814
65815                 // can always delete if the user created it in the first place..
65816                 var canDelete = (entity.version === undefined || entity.v !== undefined);
65817
65818                 // otherwise check with operationDelete whether we can delete this entity
65819                 if (!canDelete) {
65820                     canDelete = !operationDelete([entity.id], context).disabled();
65821                 }
65822
65823                 if (canDelete) {
65824                     fixes.push(
65825                         new validationIssueFix({
65826                             icon: 'iD-operation-delete',
65827                             title: t('issues.fix.delete_feature.title'),
65828                             onClick: function() {
65829                                 var id = this.issue.entityIds[0];
65830                                 var operation = operationDelete([id], context);
65831                                 if (!operation.disabled()) {
65832                                     operation();
65833                                 }
65834                             }
65835                         })
65836                     );
65837                 }
65838
65839                 var messageID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag.' + subtype;
65840                 var referenceID = subtype === 'highway_classification' ? 'unknown_road' : 'missing_tag';
65841
65842                 var severity = (canDelete && subtype !== 'highway_classification') ? 'error' : 'warning';
65843
65844                 return [new validationIssue({
65845                     type: type,
65846                     subtype: subtype,
65847                     severity: severity,
65848                     message: function() {
65849                         var entity = context.hasEntity(this.entityIds[0]);
65850                         return entity ? t('issues.' + messageID + '.message', {
65851                             feature: utilDisplayLabel(entity, context)
65852                         }) : '';
65853                     },
65854                     reference: showReference,
65855                     entityIds: [entity.id],
65856                     fixes: fixes
65857                 })];
65858
65859
65860                 function showReference(selection) {
65861                     selection.selectAll('.issue-reference')
65862                         .data([0])
65863                         .enter()
65864                         .append('div')
65865                         .attr('class', 'issue-reference')
65866                         .text(t('issues.' + referenceID + '.reference'));
65867                 }
65868             };
65869
65870
65871             validation.type = type;
65872
65873             return validation;
65874         }
65875
65876         function validationOutdatedTags() {
65877             var type = 'outdated_tags';
65878
65879             // initialize name-suggestion-index matcher
65880             var nsiMatcher = matcher$1();
65881             nsiMatcher.buildMatchIndex(brands$1.brands);
65882             var nsiKeys = ['amenity', 'shop', 'tourism', 'leisure', 'office'];
65883
65884             var allWD = {};
65885             var allWP = {};
65886             Object.keys(brands$1.brands).forEach(function(kvnd) {
65887                 var brand = brands$1.brands[kvnd];
65888                 var wd = brand.tags['brand:wikidata'];
65889                 var wp = brand.tags['brand:wikipedia'];
65890                 if (wd) { allWD[wd] = kvnd; }
65891                 if (wp) { allWP[wp] = kvnd; }
65892             });
65893
65894
65895             function oldTagIssues(entity, context) {
65896                 var graph = context.graph();
65897                 var oldTags = Object.assign({}, entity.tags);  // shallow copy
65898                 var preset = context.presets().match(entity, graph);
65899                 var explicitPresetUpgrade = preset.replacement;
65900                 var subtype = 'deprecated_tags';
65901
65902                 // upgrade preset..
65903                 if (preset.replacement) {
65904                     var newPreset = context.presets().item(preset.replacement);
65905                     graph = actionChangePreset(entity.id, preset, newPreset, true)(graph);  // true = skip field defaults
65906                     entity = graph.entity(entity.id);
65907                     preset = newPreset;
65908                 }
65909
65910                 // upgrade tags..
65911                 var deprecatedTags = entity.deprecatedTags();
65912                 if (deprecatedTags.length) {
65913                     deprecatedTags.forEach(function(tag) {
65914                         graph = actionUpgradeTags(entity.id, tag.old, tag.replace)(graph);
65915                     });
65916                     entity = graph.entity(entity.id);
65917                 }
65918
65919                 // add missing addTags..
65920                 var newTags = Object.assign({}, entity.tags);  // shallow copy
65921                 if (preset.tags !== preset.addTags) {
65922                     Object.keys(preset.addTags).forEach(function(k) {
65923                         if (!newTags[k]) {
65924                             newTags[k] = preset.addTags[k];
65925                             if (!explicitPresetUpgrade) {
65926                                 subtype = 'incomplete_tags';
65927                             }
65928                         }
65929                     });
65930                 }
65931
65932                 // Do `wikidata` or `wikipedia` identify this entity as a brand?  #6416
65933                 // If so, these tags can be swapped to `brand:wikidata`/`brand:wikipedia`
65934                 var isBrand;
65935                 if (newTags.wikidata) {                 // try matching `wikidata`
65936                     isBrand = allWD[newTags.wikidata];
65937                 }
65938                 if (!isBrand && newTags.wikipedia) {    // fallback to `wikipedia`
65939                     isBrand = allWP[newTags.wikipedia];
65940                 }
65941                 if (isBrand && !newTags.office) {       // but avoid doing this for corporate offices
65942                     if (newTags.wikidata) {
65943                         newTags['brand:wikidata'] = newTags.wikidata;
65944                         delete newTags.wikidata;
65945                     }
65946                     if (newTags.wikipedia) {
65947                         newTags['brand:wikipedia'] = newTags.wikipedia;
65948                         delete newTags.wikipedia;
65949                     }
65950                     // I considered setting `name` and other tags here, but they aren't unique per wikidata
65951                     // (Q2759586 -> in USA "Papa John's", in Russia "Папа Джонс")
65952                     // So users will really need to use a preset or assign `name` themselves.
65953                 }
65954
65955                 // try key/value|name match against name-suggestion-index
65956                 if (newTags.name) {
65957                     for (var i = 0; i < nsiKeys.length; i++) {
65958                         var k = nsiKeys[i];
65959                         if (!newTags[k]) continue;
65960
65961                         var match = nsiMatcher.matchKVN(k, newTags[k], newTags.name);
65962                         if (!match) continue;
65963
65964                         // for now skip ambiguous matches (like Target~(USA) vs Target~(Australia))
65965                         if (match.d) continue;
65966
65967                         var brand = brands$1.brands[match.kvnd];
65968                         if (brand && brand.tags['brand:wikidata']) {
65969                             Object.assign(newTags, brand.tags);
65970                             break;
65971                         }
65972                     }
65973                 }
65974
65975
65976                 // determine diff
65977                 var tagDiff = utilTagDiff(oldTags, newTags);
65978                 if (!tagDiff.length) return [];
65979
65980                 var prefix = subtype === 'incomplete_tags' ? 'incomplete.' : '';
65981
65982                 return [new validationIssue({
65983                     type: type,
65984                     subtype: subtype,
65985                     severity: 'warning',
65986                     message: showMessage,
65987                     reference: showReference,
65988                     entityIds: [entity.id],
65989                     hash: JSON.stringify(tagDiff),
65990                     fixes: [
65991                         new validationIssueFix({
65992                             autoArgs: [doUpgrade, t('issues.fix.upgrade_tags.annotation')],
65993                             title: t('issues.fix.upgrade_tags.title'),
65994                             onClick: function() {
65995                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
65996                             }
65997                         })
65998                     ]
65999                 })];
66000
66001
66002                 function doUpgrade(graph) {
66003                     var currEntity = context.hasEntity(entity.id);
66004                     if (!currEntity) return graph;
66005
66006                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66007                     tagDiff.forEach(function(diff) {
66008                         if (diff.type === '-') {
66009                             delete newTags[diff.key];
66010                         } else if (diff.type === '+') {
66011                             newTags[diff.key] = diff.newVal;
66012                         }
66013                     });
66014
66015                     return actionChangeTags(currEntity.id, newTags)(graph);
66016                 }
66017
66018
66019                 function showMessage() {
66020                     var currEntity = context.hasEntity(entity.id);
66021                     if (!currEntity) return '';
66022
66023                     return t('issues.outdated_tags.' + prefix + 'message',
66024                         { feature: utilDisplayLabel(currEntity, context) }
66025                     );
66026                 }
66027
66028
66029                 function showReference(selection) {
66030                     var enter = selection.selectAll('.issue-reference')
66031                         .data([0])
66032                         .enter();
66033
66034                     enter
66035                         .append('div')
66036                         .attr('class', 'issue-reference')
66037                         .text(t('issues.outdated_tags.' + prefix + 'reference'));
66038
66039                     enter
66040                         .append('strong')
66041                         .text(t('issues.suggested'));
66042
66043                     enter
66044                         .append('table')
66045                         .attr('class', 'tagDiff-table')
66046                         .selectAll('.tagDiff-row')
66047                         .data(tagDiff)
66048                         .enter()
66049                         .append('tr')
66050                         .attr('class', 'tagDiff-row')
66051                         .append('td')
66052                         .attr('class', function(d) {
66053                             var klass = d.type === '+' ? 'add' : 'remove';
66054                             return 'tagDiff-cell tagDiff-cell-' + klass;
66055                         })
66056                         .text(function(d) { return d.display; });
66057                 }
66058             }
66059
66060
66061             function oldMultipolygonIssues(entity, context) {
66062                 var graph = context.graph();
66063
66064                 var multipolygon, outerWay;
66065                 if (entity.type === 'relation') {
66066                     outerWay = osmOldMultipolygonOuterMemberOfRelation(entity, graph);
66067                     multipolygon = entity;
66068                 } else if (entity.type === 'way') {
66069                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
66070                     outerWay = entity;
66071                 } else {
66072                     return [];
66073                 }
66074
66075                 if (!multipolygon || !outerWay) return [];
66076
66077                 return [new validationIssue({
66078                     type: type,
66079                     subtype: 'old_multipolygon',
66080                     severity: 'warning',
66081                     message: showMessage,
66082                     reference: showReference,
66083                     entityIds: [outerWay.id, multipolygon.id],
66084                     fixes: [
66085                         new validationIssueFix({
66086                             autoArgs: [doUpgrade, t('issues.fix.move_tags.annotation')],
66087                             title: t('issues.fix.move_tags.title'),
66088                             onClick: function() {
66089                                 context.perform(doUpgrade, t('issues.fix.move_tags.annotation'));
66090                             }
66091                         })
66092                     ]
66093                 })];
66094
66095
66096                 function doUpgrade(graph) {
66097                     var currMultipolygon = context.hasEntity(multipolygon.id);
66098                     var currOuterWay = context.hasEntity(outerWay.id);
66099                     if (!currMultipolygon || !currOuterWay) return graph;
66100
66101                     currMultipolygon = currMultipolygon.mergeTags(currOuterWay.tags);
66102                     graph = graph.replace(currMultipolygon);
66103                     return actionChangeTags(currOuterWay.id, {})(graph);
66104                 }
66105
66106
66107                 function showMessage() {
66108                     var currMultipolygon = context.hasEntity(multipolygon.id);
66109                     if (!currMultipolygon) return '';
66110
66111                     return t('issues.old_multipolygon.message',
66112                         { multipolygon: utilDisplayLabel(currMultipolygon, context) }
66113                     );
66114                 }
66115
66116
66117                 function showReference(selection) {
66118                     selection.selectAll('.issue-reference')
66119                         .data([0])
66120                         .enter()
66121                         .append('div')
66122                         .attr('class', 'issue-reference')
66123                         .text(t('issues.old_multipolygon.reference'));
66124                 }
66125             }
66126
66127
66128             var validation = function checkOutdatedTags(entity, context) {
66129                 var issues = oldMultipolygonIssues(entity, context);
66130                 if (!issues.length) issues = oldTagIssues(entity, context);
66131                 return issues;
66132             };
66133
66134
66135             validation.type = type;
66136
66137             return validation;
66138         }
66139
66140         function validationPrivateData() {
66141             var type = 'private_data';
66142
66143             // assume that some buildings are private
66144             var privateBuildingValues = {
66145                 detached: true,
66146                 farm: true,
66147                 house: true,
66148                 houseboat: true,
66149                 residential: true,
66150                 semidetached_house: true,
66151                 static_caravan: true
66152             };
66153
66154             // but they might be public if they have one of these other tags
66155             var publicKeys = {
66156                 amenity: true,
66157                 craft: true,
66158                 historic: true,
66159                 leisure: true,
66160                 office: true,
66161                 shop: true,
66162                 tourism: true
66163             };
66164
66165             // these tags may contain personally identifying info
66166             var personalTags = {
66167                 'contact:email': true,
66168                 'contact:fax': true,
66169                 'contact:phone': true,
66170                 email: true,
66171                 fax: true,
66172                 phone: true
66173             };
66174
66175
66176             var validation = function checkPrivateData(entity, context) {
66177                 var tags = entity.tags;
66178                 if (!tags.building || !privateBuildingValues[tags.building]) return [];
66179
66180                 var keepTags = {};
66181                 for (var k in tags) {
66182                     if (publicKeys[k]) return [];  // probably a public feature
66183                     if (!personalTags[k]) {
66184                         keepTags[k] = tags[k];
66185                     }
66186                 }
66187
66188                 var tagDiff = utilTagDiff(tags, keepTags);
66189                 if (!tagDiff.length) return [];
66190
66191                 var fixID = tagDiff.length === 1 ? 'remove_tag' : 'remove_tags';
66192
66193                 return [new validationIssue({
66194                     type: type,
66195                     severity: 'warning',
66196                     message: showMessage,
66197                     reference: showReference,
66198                     entityIds: [entity.id],
66199                     fixes: [
66200                         new validationIssueFix({
66201                             icon: 'iD-operation-delete',
66202                             title: t('issues.fix.' + fixID + '.title'),
66203                             onClick: function() {
66204                                 context.perform(doUpgrade, t('issues.fix.upgrade_tags.annotation'));
66205                             }
66206                         })
66207                     ]
66208                 })];
66209
66210
66211                 function doUpgrade(graph) {
66212                     var currEntity = context.hasEntity(entity.id);
66213                     if (!currEntity) return graph;
66214
66215                     var newTags = Object.assign({}, currEntity.tags);  // shallow copy
66216                     tagDiff.forEach(function(diff) {
66217                         if (diff.type === '-') {
66218                             delete newTags[diff.key];
66219                         } else if (diff.type === '+') {
66220                             newTags[diff.key] = diff.newVal;
66221                         }
66222                     });
66223
66224                     return actionChangeTags(currEntity.id, newTags)(graph);
66225                 }
66226
66227
66228                 function showMessage() {
66229                     var currEntity = context.hasEntity(this.entityIds[0]);
66230                     if (!currEntity) return '';
66231
66232                     return t('issues.private_data.contact.message',
66233                         { feature: utilDisplayLabel(currEntity, context) }
66234                     );
66235                 }
66236
66237
66238                 function showReference(selection) {
66239                     var enter = selection.selectAll('.issue-reference')
66240                         .data([0])
66241                         .enter();
66242
66243                     enter
66244                         .append('div')
66245                         .attr('class', 'issue-reference')
66246                         .text(t('issues.private_data.reference'));
66247
66248                     enter
66249                         .append('strong')
66250                         .text(t('issues.suggested'));
66251
66252                     enter
66253                         .append('table')
66254                         .attr('class', 'tagDiff-table')
66255                         .selectAll('.tagDiff-row')
66256                         .data(tagDiff)
66257                         .enter()
66258                         .append('tr')
66259                         .attr('class', 'tagDiff-row')
66260                         .append('td')
66261                         .attr('class', function(d) {
66262                             var klass = d.type === '+' ? 'add' : 'remove';
66263                             return 'tagDiff-cell tagDiff-cell-' + klass;
66264                         })
66265                         .text(function(d) { return d.display; });
66266                 }
66267             };
66268
66269
66270             validation.type = type;
66271
66272             return validation;
66273         }
66274
66275         function validationTagSuggestsArea() {
66276             var type = 'tag_suggests_area';
66277
66278
66279             var validation = function checkTagSuggestsArea(entity, context) {
66280                 if (entity.type !== 'way' || entity.isClosed()) return [];
66281
66282                 var tagSuggestingArea = entity.tagSuggestingArea();
66283                 if (!tagSuggestingArea) {
66284                     return [];
66285                 }
66286
66287                 if (context.presets().matchTags(tagSuggestingArea, 'line') ===
66288                     context.presets().matchTags(tagSuggestingArea, 'area')) {
66289                     // these tags also allow lines and making this an area wouldn't matter
66290                     return [];
66291                 }
66292
66293                 var tagText = utilTagText({ tags: tagSuggestingArea });
66294                 var fixes = [];
66295
66296                 var connectEndpointsOnClick;
66297
66298                 // must have at least three nodes to close this automatically
66299                 if (entity.nodes.length >= 3) {
66300                     var nodes = context.graph().childNodes(entity), testNodes;
66301                     var firstToLastDistanceMeters = geoSphericalDistance(nodes[0].loc, nodes[nodes.length-1].loc);
66302
66303                     // if the distance is very small, attempt to merge the endpoints
66304                     if (firstToLastDistanceMeters < 0.75) {
66305                         testNodes = nodes.slice();   // shallow copy
66306                         testNodes.pop();
66307                         testNodes.push(testNodes[0]);
66308                         // make sure this will not create a self-intersection
66309                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66310                             connectEndpointsOnClick = function() {
66311                                 var way = context.entity(this.issue.entityIds[0]);
66312                                 context.perform(
66313                                     actionMergeNodes([way.nodes[0], way.nodes[way.nodes.length-1]], nodes[0].loc),
66314                                     t('issues.fix.connect_endpoints.annotation')
66315                                 );
66316                             };
66317                         }
66318                     }
66319
66320                     if (!connectEndpointsOnClick) {
66321                         // if the points were not merged, attempt to close the way
66322                         testNodes = nodes.slice();   // shallow copy
66323                         testNodes.push(testNodes[0]);
66324                         // make sure this will not create a self-intersection
66325                         if (!geoHasSelfIntersections(testNodes, testNodes[0].id)) {
66326                             connectEndpointsOnClick = function() {
66327                                 var wayId = this.issue.entityIds[0];
66328                                 var way = context.entity(wayId);
66329                                 var nodeId = way.nodes[0];
66330                                 var index = way.nodes.length;
66331                                 context.perform(
66332                                     actionAddVertex(wayId, nodeId, index),
66333                                     t('issues.fix.connect_endpoints.annotation')
66334                                 );
66335                             };
66336                         }
66337                     }
66338                 }
66339
66340                 fixes.push(new validationIssueFix({
66341                     title: t('issues.fix.connect_endpoints.title'),
66342                     onClick: connectEndpointsOnClick
66343                 }));
66344
66345                 fixes.push(new validationIssueFix({
66346                     icon: 'iD-operation-delete',
66347                     title: t('issues.fix.remove_tag.title'),
66348                     onClick: function() {
66349                         var entityId = this.issue.entityIds[0];
66350                         var entity = context.entity(entityId);
66351                         var tags = Object.assign({}, entity.tags);  // shallow copy
66352                         for (var key in tagSuggestingArea) {
66353                             delete tags[key];
66354                         }
66355                         context.perform(
66356                             actionChangeTags(entityId, tags),
66357                             t('issues.fix.remove_tag.annotation')
66358                         );
66359                     }
66360                 }));
66361
66362                 return [new validationIssue({
66363                     type: type,
66364                     severity: 'warning',
66365                     message: function() {
66366                         var entity = context.hasEntity(this.entityIds[0]);
66367                         return entity ? t('issues.tag_suggests_area.message', {
66368                             feature: utilDisplayLabel(entity, context),
66369                             tag: tagText
66370                         }) : '';
66371                     },
66372                     reference: showReference,
66373                     entityIds: [entity.id],
66374                     hash: JSON.stringify(tagSuggestingArea),
66375                     fixes: fixes
66376                 })];
66377
66378
66379                 function showReference(selection) {
66380                     selection.selectAll('.issue-reference')
66381                         .data([0])
66382                         .enter()
66383                         .append('div')
66384                         .attr('class', 'issue-reference')
66385                         .text(t('issues.tag_suggests_area.reference'));
66386                 }
66387             };
66388
66389             validation.type = type;
66390
66391             return validation;
66392         }
66393
66394         function validationUnsquareWay() {
66395             var type = 'unsquare_way';
66396             var DEFAULT_DEG_THRESHOLD = 5;   // see also issues.js
66397
66398             // use looser epsilon for detection to reduce warnings of buildings that are essentially square already
66399             var epsilon = 0.05;
66400             var nodeThreshold = 10;
66401
66402             function isBuilding(entity, graph) {
66403                 if (entity.type !== 'way' || entity.geometry(graph) !== 'area') return false;
66404                 return entity.tags.building && entity.tags.building !== 'no';
66405             }
66406
66407
66408             var validation = function checkUnsquareWay(entity, context) {
66409                 var graph = context.graph();
66410                 if (!isBuilding(entity, graph)) return [];
66411
66412                 // don't flag ways marked as physically unsquare
66413                 if (entity.tags.nonsquare === 'yes') return [];
66414
66415                 var isClosed = entity.isClosed();
66416                 if (!isClosed) return [];        // this building has bigger problems
66417
66418                 // don't flag ways with lots of nodes since they are likely detail-mapped
66419                 var nodes = context.childNodes(entity).slice();    // shallow copy
66420                 if (nodes.length > nodeThreshold + 1) return [];   // +1 because closing node appears twice
66421
66422                 // ignore if not all nodes are fully downloaded
66423                 var osm = context.connection();
66424                 if (!osm || nodes.some(function(node) { return !osm.isDataLoaded(node.loc); })) return [];
66425
66426                 // don't flag connected ways to avoid unresolvable unsquare loops
66427                 var hasConnectedSquarableWays = nodes.some(function(node) {
66428                     return graph.parentWays(node).some(function(way) {
66429                         if (way.id === entity.id) return false;
66430                         if (isBuilding(way, graph)) return true;
66431                         return graph.parentRelations(way).some(function(parentRelation) {
66432                             return parentRelation.isMultipolygon() &&
66433                                 parentRelation.tags.building &&
66434                                 parentRelation.tags.building !== 'no';
66435                         });
66436                     });
66437                 });
66438                 if (hasConnectedSquarableWays) return [];
66439
66440
66441                 // user-configurable square threshold
66442                 var storedDegreeThreshold = context.storage('validate-square-degrees');
66443                 var degreeThreshold = isNaN(storedDegreeThreshold) ? DEFAULT_DEG_THRESHOLD : parseFloat(storedDegreeThreshold);
66444
66445                 var points = nodes.map(function(node) { return context.projection(node.loc); });
66446                 if (!geoOrthoCanOrthogonalize(points, isClosed, epsilon, degreeThreshold, true)) return [];
66447
66448                 var autoArgs;
66449                 // don't allow autosquaring features linked to wikidata
66450                 if (!entity.tags.wikidata) {
66451                     // use same degree threshold as for detection
66452                     var autoAction = actionOrthogonalize(entity.id, context.projection, undefined, degreeThreshold);
66453                     autoAction.transitionable = false;  // when autofixing, do it instantly
66454                     autoArgs = [autoAction, t('operations.orthogonalize.annotation.area')];
66455                 }
66456
66457                 return [new validationIssue({
66458                     type: type,
66459                     severity: 'warning',
66460                     message: function() {
66461                         var entity = context.hasEntity(this.entityIds[0]);
66462                         return entity ? t('issues.unsquare_way.message', { feature: utilDisplayLabel(entity, context) }) : '';
66463                     },
66464                     reference: showReference,
66465                     entityIds: [entity.id],
66466                     hash: JSON.stringify(autoArgs !== undefined) + degreeThreshold,
66467                     fixes: [
66468                         new validationIssueFix({
66469                             icon: 'iD-operation-orthogonalize',
66470                             title: t('issues.fix.square_feature.title'),
66471                             autoArgs: autoArgs,
66472                             onClick: function(completionHandler) {
66473                                 var entityId = this.issue.entityIds[0];
66474                                 // use same degree threshold as for detection
66475                                 context.perform(
66476                                     actionOrthogonalize(entityId, context.projection, undefined, degreeThreshold),
66477                                     t('operations.orthogonalize.annotation.area')
66478                                 );
66479                                 // run after the squaring transition (currently 150ms)
66480                                 window.setTimeout(function() { completionHandler(); }, 175);
66481                             }
66482                         }),
66483                         new validationIssueFix({
66484                             title: t('issues.fix.tag_as_unsquare.title'),
66485                             onClick: function() {
66486                                 var entityId = this.issue.entityIds[0];
66487                                 var entity = context.entity(entityId);
66488                                 var tags = Object.assign({}, entity.tags);  // shallow copy
66489                                 tags.nonsquare = 'yes';
66490                                 context.perform(
66491                                     actionChangeTags(entityId, tags),
66492                                     t('issues.fix.tag_as_unsquare.annotation')
66493                                 );
66494                             }
66495                         })
66496                     ]
66497                 })];
66498
66499                 function showReference(selection) {
66500                     selection.selectAll('.issue-reference')
66501                         .data([0])
66502                         .enter()
66503                         .append('div')
66504                         .attr('class', 'issue-reference')
66505                         .text(t('issues.unsquare_way.buildings.reference'));
66506                 }
66507             };
66508
66509             validation.type = type;
66510
66511             return validation;
66512         }
66513
66514
66515
66516         var Validations = /*#__PURE__*/Object.freeze({
66517                 validationAlmostJunction: validationAlmostJunction,
66518                 validationCloseNodes: validationCloseNodes,
66519                 validationCrossingWays: validationCrossingWays,
66520                 validationDisconnectedWay: validationDisconnectedWay,
66521                 validationFixmeTag: validationFixmeTag,
66522                 validationGenericName: validationGenericName,
66523                 validationImpossibleOneway: validationImpossibleOneway,
66524                 validationIncompatibleSource: validationIncompatibleSource,
66525                 validationMaprules: validationMaprules,
66526                 validationMissingRole: validationMissingRole,
66527                 validationMissingTag: validationMissingTag,
66528                 validationOutdatedTags: validationOutdatedTags,
66529                 validationPrivateData: validationPrivateData,
66530                 validationTagSuggestsArea: validationTagSuggestsArea,
66531                 validationUnsquareWay: validationUnsquareWay
66532         });
66533
66534         function coreValidator(context) {
66535             var dispatch$1 = dispatch('validated', 'focusedIssue');
66536             var validator = utilRebind({}, dispatch$1, 'on');
66537
66538             var _rules = {};
66539             var _disabledRules = {};
66540
66541             var _ignoredIssueIDs = {};       // issue.id -> true
66542             var _issuesByIssueID = {};       // issue.id -> issue
66543             var _issuesByEntityID = {};      // entity.id -> set(issue.id)
66544             var _validatedGraph = null;
66545             var _deferred = new Set();
66546
66547             //
66548             // initialize the validator rulesets
66549             //
66550             validator.init = function() {
66551                 Object.values(Validations).forEach(function(validation) {
66552                     if (typeof validation !== 'function') return;
66553
66554                     var fn = validation();
66555                     var key = fn.type;
66556                     _rules[key] = fn;
66557                 });
66558
66559                 var disabledRules = context.storage('validate-disabledRules');
66560                 if (disabledRules) {
66561                     disabledRules.split(',')
66562                         .forEach(function(key) { _disabledRules[key] = true; });
66563                 }
66564             };
66565
66566
66567             //
66568             // clear caches, called whenever iD resets after a save
66569             //
66570             validator.reset = function() {
66571                 Array.from(_deferred).forEach(function(handle) {
66572                     window.cancelIdleCallback(handle);
66573                     _deferred.delete(handle);
66574                 });
66575
66576                 // clear caches
66577                 _ignoredIssueIDs = {};
66578                 _issuesByIssueID = {};
66579                 _issuesByEntityID = {};
66580                 _validatedGraph = null;
66581
66582                 for (var key in _rules) {
66583                     if (typeof _rules[key].reset === 'function') {
66584                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66585                     }
66586                 }
66587             };
66588
66589             validator.resetIgnoredIssues = function() {
66590                 _ignoredIssueIDs = {};
66591                 // reload UI
66592                 dispatch$1.call('validated');
66593             };
66594
66595
66596             // when the user changes the squaring thereshold, rerun this on all buildings
66597             validator.changeSquareThreshold = function() {
66598                 var checkUnsquareWay = _rules.unsquare_way;
66599                 if (typeof checkUnsquareWay !== 'function') return;
66600
66601                 // uncache existing
66602                 Object.values(_issuesByIssueID)
66603                     .filter(function(issue) { return issue.type === 'unsquare_way'; })
66604                     .forEach(function(issue) {
66605                         var entityId = issue.entityIds[0];   // always 1 entity for unsquare way
66606                         if (_issuesByEntityID[entityId]) {
66607                             _issuesByEntityID[entityId].delete(issue.id);
66608                         }
66609                         delete _issuesByIssueID[issue.id];
66610                     });
66611
66612                 var buildings = context.intersects(geoExtent([-180,-90],[180, 90]))  // everywhere
66613                     .filter(function(entity) {
66614                         return entity.type === 'way' && entity.tags.building && entity.tags.building !== 'no';
66615                     });
66616
66617                 // rerun for all buildings
66618                 buildings.forEach(function(entity) {
66619                     var detected = checkUnsquareWay(entity, context);
66620                     if (detected.length !== 1) return;
66621
66622                     var issue = detected[0];
66623                     var ignoreFix = new validationIssueFix({
66624                         title: t('issues.fix.ignore_issue.title'),
66625                         icon: 'iD-icon-close',
66626                         onClick: function() {
66627                             ignoreIssue(this.issue.id);
66628                         }
66629                     });
66630                     ignoreFix.type = 'ignore';
66631                     ignoreFix.issue = issue;
66632                     issue.fixes.push(ignoreFix);
66633
66634                     if (!_issuesByEntityID[entity.id]) {
66635                         _issuesByEntityID[entity.id] = new Set();
66636                     }
66637                     _issuesByEntityID[entity.id].add(issue.id);
66638                     _issuesByIssueID[issue.id] = issue;
66639                 });
66640
66641                 dispatch$1.call('validated');
66642             };
66643
66644
66645             // options = {
66646             //     what: 'all',     // 'all' or 'edited'
66647             //     where: 'all',   // 'all' or 'visible'
66648             //     includeIgnored: false   // true, false, or 'only'
66649             //     includeDisabledRules: false   // true, false, or 'only'
66650             // };
66651             validator.getIssues = function(options) {
66652                 var opts = Object.assign({ what: 'all', where: 'all', includeIgnored: false, includeDisabledRules: false }, options);
66653                 var issues = Object.values(_issuesByIssueID);
66654                 var changes = context.history().difference().changes();
66655                 var view = context.map().extent();
66656
66657                 return issues.filter(function(issue) {
66658                     if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66659                     if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66660
66661                     if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66662                     if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66663
66664                     // Sanity check:  This issue may be for an entity that not longer exists.
66665                     // If we detect this, uncache and return false so it is not included..
66666                     var entityIds = issue.entityIds || [];
66667                     for (var i = 0; i < entityIds.length; i++) {
66668                         var entityId = entityIds[i];
66669                         if (!context.hasEntity(entityId)) {
66670                             delete _issuesByEntityID[entityId];
66671                             delete _issuesByIssueID[issue.id];
66672                             return false;
66673                         }
66674                     }
66675
66676                     if (opts.what === 'edited') {
66677                         var isEdited = entityIds.some(function(entityId) { return changes[entityId]; });
66678                         if (entityIds.length && !isEdited) return false;
66679                     }
66680
66681                     if (opts.where === 'visible') {
66682                         var extent = issue.extent(context.graph());
66683                         if (!view.intersects(extent)) return false;
66684                     }
66685
66686                     return true;
66687                 });
66688             };
66689
66690             validator.focusIssue = function(issue) {
66691                 var extent = issue.extent(context.graph());
66692
66693                 if (extent) {
66694                     var setZoom = Math.max(context.map().zoom(), 19);
66695                     context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
66696
66697                     // select the first entity
66698                     if (issue.entityIds && issue.entityIds.length) {
66699                         window.setTimeout(function() {
66700                             var ids = issue.entityIds;
66701                             context.enter(modeSelect(context, [ids[0]]));
66702                             dispatch$1.call('focusedIssue', this, issue);
66703                         }, 250);  // after ease
66704                     }
66705                 }
66706             };
66707
66708
66709             validator.getIssuesBySeverity = function(options) {
66710                 var groups = utilArrayGroupBy(validator.getIssues(options), 'severity');
66711                 groups.error = groups.error || [];
66712                 groups.warning = groups.warning || [];
66713                 return groups;
66714             };
66715
66716
66717             validator.getEntityIssues = function(entityID, options) {
66718                 var issueIDs = _issuesByEntityID[entityID];
66719                 if (!issueIDs) return [];
66720
66721                 var opts = options || {};
66722
66723                 return Array.from(issueIDs)
66724                     .map(function(id) { return _issuesByIssueID[id]; })
66725                     .filter(function(issue) {
66726                         if (opts.includeDisabledRules === 'only' && !_disabledRules[issue.type]) return false;
66727                         if (!opts.includeDisabledRules && _disabledRules[issue.type]) return false;
66728
66729                         if (opts.includeIgnored === 'only' && !_ignoredIssueIDs[issue.id]) return false;
66730                         if (!opts.includeIgnored && _ignoredIssueIDs[issue.id]) return false;
66731
66732                         return true;
66733                     });
66734             };
66735
66736
66737             validator.getRuleKeys = function() {
66738                 return Object.keys(_rules)
66739                     .filter(function(key) { return key !== 'maprules'; })
66740                     .sort(function(key1, key2) {
66741                         // alphabetize by localized title
66742                         return t('issues.' + key1 + '.title') < t('issues.' + key2 + '.title') ? -1 : 1;
66743                     });
66744             };
66745
66746
66747             validator.isRuleEnabled = function(key) {
66748                 return !_disabledRules[key];
66749             };
66750
66751
66752             validator.toggleRule = function(key) {
66753                 if (_disabledRules[key]) {
66754                     delete _disabledRules[key];
66755                 } else {
66756                     _disabledRules[key] = true;
66757                 }
66758
66759                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66760                 validator.validate();
66761             };
66762
66763
66764             validator.disableRules = function(keys) {
66765                 _disabledRules = {};
66766                 keys.forEach(function(k) {
66767                     _disabledRules[k] = true;
66768                 });
66769
66770                 context.storage('validate-disabledRules', Object.keys(_disabledRules).join(','));
66771                 validator.validate();
66772             };
66773
66774
66775             //
66776             // Remove a single entity and all its related issues from the caches
66777             //
66778             function uncacheEntityID(entityID) {
66779                 var issueIDs = _issuesByEntityID[entityID];
66780                 if (!issueIDs) return;
66781
66782                 issueIDs.forEach(function(issueID) {
66783                     var issue = _issuesByIssueID[issueID];
66784                     if (issue) {
66785                         // When multiple entities are involved (e.g. crossing_ways),
66786                         // remove this issue from the other entity caches too..
66787                         var entityIds = issue.entityIds || [];
66788                         entityIds.forEach(function(other) {
66789                             if (other !== entityID) {
66790                                 if (_issuesByEntityID[other]) {
66791                                     _issuesByEntityID[other].delete(issueID);
66792                                 }
66793                             }
66794                         });
66795                     }
66796
66797                     delete _issuesByIssueID[issueID];
66798                 });
66799
66800                 delete _issuesByEntityID[entityID];
66801             }
66802
66803
66804             function ignoreIssue(id) {
66805                 _ignoredIssueIDs[id] = true;
66806             }
66807
66808
66809             //
66810             // Run validation on a single entity
66811             //
66812             function validateEntity(entity) {
66813                 var entityIssues = [];
66814                 var ran = {};
66815
66816                 // runs validation and appends resulting issues,
66817                 // returning true if validation passed without issue
66818                 function runValidation(key) {
66819                     if (ran[key]) return true;
66820
66821                     var fn = _rules[key];
66822                     if (typeof fn !== 'function') {
66823                         console.error('no such validation rule = ' + key);  // eslint-disable-line no-console
66824                         ran[key] = true;
66825                         return true;
66826                     }
66827
66828                     var detected = fn(entity, context);
66829                     detected.forEach(function(issue) {
66830                         var hasIgnoreFix = issue.fixes && issue.fixes.length && issue.fixes[issue.fixes.length - 1].type === 'ignore';
66831                         if (issue.severity === 'warning' && !hasIgnoreFix) {
66832                             var ignoreFix = new validationIssueFix({
66833                                 title: t('issues.fix.ignore_issue.title'),
66834                                 icon: 'iD-icon-close',
66835                                 onClick: function() {
66836                                     ignoreIssue(this.issue.id);
66837                                 }
66838                             });
66839                             ignoreFix.type = 'ignore';
66840                             ignoreFix.issue = issue;
66841                             issue.fixes.push(ignoreFix);
66842                         }
66843                     });
66844                     entityIssues = entityIssues.concat(detected);
66845                     ran[key] = true;
66846                     return !detected.length;
66847                 }
66848
66849                 // run some validations manually to control the order and to skip some
66850
66851                 runValidation('missing_role');
66852
66853                 if (entity.type === 'relation') {
66854                     if (!runValidation('outdated_tags')) {
66855                         // don't flag missing tags if they are on the outer way
66856                         ran.missing_tag = true;
66857                     }
66858                 }
66859
66860                 runValidation('missing_tag');
66861
66862                 runValidation('outdated_tags');
66863
66864                 runValidation('crossing_ways');
66865                 runValidation('almost_junction');
66866
66867                 // only check impossible_oneway if no disconnected_way issues
66868                 if (runValidation('disconnected_way')) {
66869                     runValidation('impossible_oneway');
66870                 } else {
66871                     ran.impossible_oneway = true;
66872                 }
66873
66874                 runValidation('tag_suggests_area');
66875
66876                 // run all rules not yet run
66877                 Object.keys(_rules).forEach(runValidation);
66878
66879                 return entityIssues;
66880             }
66881
66882             function entityIDsToValidate(entityIDs, graph) {
66883                 var processedIDs = new Set();
66884                 return entityIDs.reduce(function(acc, entityID) {
66885                     // keep redundancy check separate from `acc` because an `entityID`
66886                     // could have been added to `acc` as a related entity through an earlier pass
66887                     if (processedIDs.has(entityID)) return acc;
66888                     processedIDs.add(entityID);
66889
66890                     var entity = graph.hasEntity(entityID);
66891                     if (!entity) return acc;
66892
66893                     acc.add(entityID);
66894
66895                     var checkParentRels = [entity];
66896
66897                     if (entity.type === 'node') {   // include parent ways
66898                         graph.parentWays(entity).forEach(function(parentWay) {
66899                             acc.add(parentWay.id);
66900                             checkParentRels.push(parentWay);
66901                         });
66902                     } else if (entity.type === 'relation') {   // include members
66903                         entity.members.forEach(function(member) {
66904                             acc.add(member.id);
66905                         });
66906                     } else if (entity.type === 'way') {   // include connected ways
66907                         entity.nodes.forEach(function(nodeID) {
66908                             graph._parentWays[nodeID].forEach(function(wayID) {
66909                                 acc.add(wayID);
66910                             });
66911                         });
66912                     }
66913
66914                     checkParentRels.forEach(function(entity) {   // include parent relations
66915                         if (entity.type !== 'relation') {        // but not super-relations
66916                             graph.parentRelations(entity).forEach(function(parentRelation) {
66917                                 acc.add(parentRelation.id);
66918                             });
66919                         }
66920                     });
66921
66922                     return acc;
66923
66924                 }, new Set());
66925             }
66926
66927             //
66928             // Run validation for several entities, supplied `entityIDs`
66929             //
66930             function validateEntities(entityIDs) {
66931
66932                 // clear caches for existing issues related to these entities
66933                 entityIDs.forEach(uncacheEntityID);
66934
66935                 // detect new issues and update caches
66936                 entityIDs.forEach(function(entityID) {
66937                     var entity = context.graph().hasEntity(entityID);
66938                     // don't validate deleted entities
66939                     if (!entity) return;
66940
66941                     var issues = validateEntity(entity);
66942                     issues.forEach(function(issue) {
66943                         var entityIds = issue.entityIds || [];
66944                         entityIds.forEach(function(entityId) {
66945                             if (!_issuesByEntityID[entityId]) {
66946                                 _issuesByEntityID[entityId] = new Set();
66947                             }
66948                             _issuesByEntityID[entityId].add(issue.id);
66949                         });
66950                         _issuesByIssueID[issue.id] = issue;
66951                     });
66952                 });
66953
66954                 dispatch$1.call('validated');
66955             }
66956
66957
66958             //
66959             // Validates anything that has changed since the last time it was run.
66960             // Also updates the "validatedGraph" to be the current graph
66961             // and dispatches a `validated` event when finished.
66962             //
66963             validator.validate = function() {
66964                 var currGraph = context.graph();
66965                 _validatedGraph = _validatedGraph || context.history().base();
66966                 if (currGraph === _validatedGraph) {
66967                     dispatch$1.call('validated');
66968                     return;
66969                 }
66970                 var oldGraph = _validatedGraph;
66971                 var difference = coreDifference(oldGraph, currGraph);
66972                 _validatedGraph = currGraph;
66973
66974                 for (var key in _rules) {
66975                     if (typeof _rules[key].reset === 'function') {
66976                         _rules[key].reset();   // 'crossing_ways' is the only one like this
66977                     }
66978                 }
66979
66980                 var createdAndModifiedEntityIDs = difference.extantIDs(true);   // created/modified (true = w/relation members)
66981                 var entityIDsToCheck = entityIDsToValidate(createdAndModifiedEntityIDs, currGraph);
66982
66983                 // "validate" deleted entities in order to update their related entities
66984                 // (e.g. deleting the only highway connected to a road should create a disconnected highway issue)
66985                 var deletedEntityIDs = difference.deleted().map(function(entity) { return entity.id; });
66986                 var entityIDsToCheckForDeleted = entityIDsToValidate(deletedEntityIDs, oldGraph);
66987
66988                 // concat the sets
66989                 entityIDsToCheckForDeleted.forEach(entityIDsToCheck.add, entityIDsToCheck);
66990
66991                 validateEntities(entityIDsToCheck);   // dispatches 'validated'
66992             };
66993
66994
66995             // WHEN TO RUN VALIDATION:
66996             // When graph changes:
66997             context.history()
66998                 .on('restore.validator', validator.validate)   // restore saved history
66999                 .on('undone.validator', validator.validate)    // undo
67000                 .on('redone.validator', validator.validate);   // redo
67001                 // but not on 'change' (e.g. while drawing)
67002
67003             // When user chages editing modes:
67004             context
67005                 .on('exit.validator', validator.validate);
67006
67007             // When merging fetched data:
67008             context.history()
67009                 .on('merge.validator', function(entities) {
67010                     if (!entities) return;
67011                     var handle = window.requestIdleCallback(function() {
67012                         var ids = entities.map(function(entity) { return entity.id; });
67013                         validateEntities(entityIDsToValidate(ids, context.graph()));
67014                     });
67015                     _deferred.add(handle);
67016                 });
67017
67018
67019             return validator;
67020         }
67021
67022         function presetCollection(collection) {
67023             var maxSearchResults = 50;
67024
67025             var presets = {
67026
67027                 collection: collection,
67028
67029
67030                 item: function(id) {
67031                     return this.collection.find(function(d) {
67032                         return d.id === id;
67033                     });
67034                 },
67035
67036                 index: function(id) {
67037                     return this.collection.findIndex(function(d) {
67038                         return d.id === id;
67039                     });
67040                 },
67041
67042                 matchGeometry: function(geometry) {
67043                     return presetCollection(this.collection.filter(function(d) {
67044                         return d.matchGeometry(geometry);
67045                     }));
67046                 },
67047
67048                 matchAnyGeometry: function(geometries) {
67049                     return presetCollection(this.collection.filter(function(d) {
67050                         return geometries.some(function(geometry) {
67051                             return d.matchGeometry(geometry);
67052                         });
67053                     }));
67054                 },
67055
67056                 fallback: function(geometry) {
67057                     var id = geometry;
67058                     if (id === 'vertex') id = 'point';
67059                     return this.item(id);
67060                 },
67061
67062                 search: function(value, geometry, countryCode) {
67063                     if (!value) return this;
67064
67065                     value = value.toLowerCase().trim();
67066
67067                     // match at name beginning or just after a space (e.g. "office" -> match "Law Office")
67068                     function leading(a) {
67069                         var index = a.indexOf(value);
67070                         return index === 0 || a[index - 1] === ' ';
67071                     }
67072
67073                     // match at name beginning only
67074                     function leadingStrict(a) {
67075                         var index = a.indexOf(value);
67076                         return index === 0;
67077                     }
67078
67079                     function sortNames(a, b) {
67080                         var aCompare = (a.suggestion ? a.originalName : a.name()).toLowerCase();
67081                         var bCompare = (b.suggestion ? b.originalName : b.name()).toLowerCase();
67082
67083                         // priority if search string matches preset name exactly - #4325
67084                         if (value === aCompare) return -1;
67085                         if (value === bCompare) return 1;
67086
67087                         // priority for higher matchScore
67088                         var i = b.originalScore - a.originalScore;
67089                         if (i !== 0) return i;
67090
67091                         // priority if search string appears earlier in preset name
67092                         i = aCompare.indexOf(value) - bCompare.indexOf(value);
67093                         if (i !== 0) return i;
67094
67095                         // priority for shorter preset names
67096                         return aCompare.length - bCompare.length;
67097                     }
67098
67099                     var pool = this.collection;
67100                     if (countryCode) {
67101                         pool = pool.filter(function(a) {
67102                             if (!a.countryCodes) return true;
67103                             return a.countryCodes.indexOf(countryCode) !== -1;
67104                         });
67105                     }
67106                     var searchable = pool.filter(function(a) {
67107                         return a.searchable !== false && a.suggestion !== true;
67108                     });
67109                     var suggestions = pool.filter(function(a) {
67110                         return a.suggestion === true;
67111                     });
67112
67113                     // matches value to preset.name
67114                     var leading_name = searchable
67115                         .filter(function(a) {
67116                             return leading(a.name().toLowerCase());
67117                         }).sort(sortNames);
67118
67119                     // matches value to preset.terms values
67120                     var leading_terms = searchable
67121                         .filter(function(a) {
67122                             return (a.terms() || []).some(leading);
67123                         });
67124
67125                     // matches value to preset.tags values
67126                     var leading_tag_values = searchable
67127                         .filter(function(a) {
67128                             return Object.values(a.tags || {})
67129                                 .filter(function(val) { return val !== '*'; })
67130                                 .some(leading);
67131                         });
67132
67133                     var leading_suggestions = suggestions
67134                         .filter(function(a) {
67135                             return leadingStrict(a.originalName.toLowerCase());
67136                         }).sort(sortNames);
67137
67138                     // finds close matches to value in preset.name
67139                     var similar_name = searchable
67140                         .map(function(a) {
67141                             return { preset: a, dist: utilEditDistance(value, a.name()) };
67142                         }).filter(function(a) {
67143                             return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
67144                         }).sort(function(a, b) {
67145                             return a.dist - b.dist;
67146                         }).map(function(a) {
67147                             return a.preset;
67148                         });
67149
67150                     // finds close matches to value in preset.terms
67151                     var similar_terms = searchable
67152                         .filter(function(a) {
67153                             return (a.terms() || []).some(function(b) {
67154                                 return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
67155                             });
67156                         });
67157
67158                     var similar_suggestions = suggestions
67159                         .map(function(a) {
67160                             return { preset: a, dist: utilEditDistance(value, a.originalName.toLowerCase()) };
67161                         }).filter(function(a) {
67162                             return a.dist + Math.min(value.length - a.preset.originalName.length, 0) < 1;
67163                         }).sort(function(a, b) {
67164                             return a.dist - b.dist;
67165                         }).map(function(a) {
67166                             return a.preset;
67167                         });
67168
67169                     var results = leading_name.concat(
67170                         leading_suggestions,
67171                         leading_terms,
67172                         leading_tag_values,
67173                         similar_name,
67174                         similar_suggestions,
67175                         similar_terms
67176                     ).slice(0, maxSearchResults - 1);
67177
67178                     if (geometry) {
67179                         if (typeof geometry === 'string') {
67180                             results.push(presets.fallback(geometry));
67181                         } else {
67182                             geometry.forEach(function(geom) {
67183                                 results.push(presets.fallback(geom));
67184                             });
67185                         }
67186                     }
67187
67188                     return presetCollection(utilArrayUniq(results));
67189                 }
67190             };
67191
67192
67193             return presets;
67194         }
67195
67196         function presetCategory(id, category, all) {
67197             category = Object.assign({}, category);   // shallow copy
67198
67199             category.id = id;
67200
67201
67202             category.members = presetCollection(category.members.map(function(id) {
67203                 return all.item(id);
67204             }));
67205
67206
67207             category.geometry = category.members.collection.reduce(function(geometries, preset) {
67208                 for (var index in preset.geometry) {
67209                     var geometry = preset.geometry[index];
67210                     if (geometries.indexOf(geometry) === -1) {
67211                         geometries.push(geometry);
67212                     }
67213                 }
67214                 return geometries;
67215             }, []);
67216
67217
67218             category.matchGeometry = function(geometry) {
67219                 return category.geometry.indexOf(geometry) >= 0;
67220             };
67221
67222
67223             category.matchScore = function() {
67224                 return -1;
67225             };
67226
67227
67228             category.name = function() {
67229                 return t('presets.categories.' + id + '.name', {'default': id});
67230             };
67231
67232
67233             category.terms = function() {
67234                 return [];
67235             };
67236
67237
67238             return category;
67239         }
67240
67241         function presetField(id, field) {
67242             field = Object.assign({}, field);   // shallow copy
67243
67244             field.id = id;
67245
67246             // for use in classes, element ids, css selectors
67247             field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
67248
67249             field.matchGeometry = function(geometry) {
67250                 return !field.geometry || field.geometry === geometry;
67251             };
67252
67253
67254             field.t = function(scope, options) {
67255                 return t('presets.fields.' + id + '.' + scope, options);
67256             };
67257
67258
67259             field.label = function() {
67260                 return field.overrideLabel || field.t('label', {'default': id});
67261             };
67262
67263
67264             var placeholder = field.placeholder;
67265             field.placeholder = function() {
67266                 return field.t('placeholder', {'default': placeholder});
67267             };
67268
67269
67270             return field;
67271         }
67272
67273         function presetPreset(id, preset, fields, visible, rawPresets) {
67274             preset = Object.assign({}, preset);   // shallow copy
67275
67276             preset.id = id;
67277
67278             preset.parentPresetID = function() {
67279                 var endIndex = preset.id.lastIndexOf('/');
67280                 if (endIndex < 0) return null;
67281
67282                 return preset.id.substring(0, endIndex);
67283             };
67284
67285
67286             // For a preset without fields, use the fields of the parent preset.
67287             // Replace {preset} placeholders with the fields of the specified presets.
67288             function resolveFieldInheritance() {
67289
67290                 // Skip `fields` for the keys which define the preset.
67291                 // These are usually `typeCombo` fields like `shop=*`
67292                 function shouldInheritFieldWithID(fieldID) {
67293                     var f = fields[fieldID];
67294                     if (f.key) {
67295                         if (preset.tags[f.key] !== undefined &&
67296                             // inherit anyway if multiple values are allowed or just a checkbox
67297                             f.type !== 'multiCombo' && f.type !== 'semiCombo' && f.type !== 'check') {
67298                             return false;
67299                         }
67300                     }
67301                     return true;
67302                 }
67303
67304                 // returns an array of field IDs to inherit from the given presetID, if found
67305                 function inheritedFieldIDs(presetID, prop) {
67306                     if (!presetID) return null;
67307
67308                     var inheritPreset = rawPresets[presetID];
67309                     if (!inheritPreset) return null;
67310
67311                     var inheritFieldIDs = inheritPreset[prop] || [];
67312
67313                     if (prop === 'fields') {
67314                         inheritFieldIDs = inheritFieldIDs.filter(shouldInheritFieldWithID);
67315                     }
67316
67317                     return inheritFieldIDs;
67318                 }
67319
67320
67321                 ['fields', 'moreFields'].forEach(function(prop) {
67322                     var fieldIDs = [];
67323                     if (preset[prop] && preset[prop].length) {    // fields were defined
67324                         preset[prop].forEach(function(fieldID) {
67325                             var match = fieldID.match(/\{(.*)\}/);
67326                             if (match !== null) {        // presetID wrapped in braces {}
67327                                 var inheritIDs = inheritedFieldIDs(match[1], prop);
67328                                 if (inheritIDs !== null) {
67329                                     fieldIDs = fieldIDs.concat(inheritIDs);
67330                                 } else {
67331                                     /* eslint-disable no-console */
67332                                     console.log('Cannot resolve presetID ' + match[0] +
67333                                         ' found in ' + preset.id + ' ' + prop);
67334                                     /* eslint-enable no-console */
67335                                 }
67336                             } else {
67337                                 fieldIDs.push(fieldID);  // no braces - just a normal field
67338                             }
67339                         });
67340
67341                     } else {  // no fields defined, so use the parent's if possible
67342                         fieldIDs = inheritedFieldIDs(preset.parentPresetID(), prop);
67343                     }
67344                     // resolve duplicate fields
67345                     fieldIDs = utilArrayUniq(fieldIDs);
67346
67347                     // update this preset with the results
67348                     preset[prop] = fieldIDs;
67349
67350                     // update the raw object to allow for multiple levels of inheritance
67351                     rawPresets[preset.id][prop] = fieldIDs;
67352                 });
67353             }
67354
67355             if (rawPresets) {
67356                 resolveFieldInheritance();
67357             }
67358
67359             preset.fields = (preset.fields || []).map(getFields);
67360             preset.moreFields = (preset.moreFields || []).map(getFields);
67361             preset.geometry = (preset.geometry || []);
67362
67363             visible = visible || false;
67364
67365             function getFields(f) {
67366                 return fields[f];
67367             }
67368
67369
67370             preset.matchGeometry = function(geometry) {
67371                 return preset.geometry.indexOf(geometry) >= 0;
67372             };
67373
67374
67375             preset.originalScore = preset.matchScore || 1;
67376
67377
67378             preset.matchScore = function(entityTags) {
67379                 var tags = preset.tags;
67380                 var score = 0;
67381
67382                 for (var t in tags) {
67383                     if (entityTags[t] === tags[t]) {
67384                         score += preset.originalScore;
67385                     } else if (tags[t] === '*' && t in entityTags) {
67386                         score += preset.originalScore / 2;
67387                     } else {
67388                         return -1;
67389                     }
67390                 }
67391
67392                 return score;
67393             };
67394
67395             var _textCache = {};
67396
67397             preset.t = function(scope, options) {
67398                 var textID = 'presets.presets.' + id + '.' + scope;
67399
67400                 if (_textCache[textID]) return _textCache[textID];
67401
67402                 var text = t(textID, options);
67403                 _textCache[textID] = text;
67404                 return text;
67405             };
67406
67407
67408             preset.originalName = preset.name || '';
67409
67410
67411             preset.name = function() {
67412                 if (preset.suggestion) {
67413                     var path = id.split('/');
67414                     path.pop();  // remove brand name
67415                     // NOTE: insert an en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
67416                     return preset.originalName + ' – ' + t('presets.presets.' + path.join('/') + '.name');
67417                 }
67418                 return preset.t('name', { 'default': preset.originalName });
67419             };
67420
67421
67422             preset.originalTerms = (preset.terms || []).join();
67423
67424
67425             preset.terms = function() {
67426                 return preset.t('terms', { 'default': preset.originalTerms }).toLowerCase().trim().split(/\s*,+\s*/);
67427             };
67428
67429
67430             preset.isFallback = function() {
67431                 var tagCount = Object.keys(preset.tags).length;
67432                 return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
67433             };
67434
67435             preset.visible = function(val) {
67436                 if (!arguments.length) return visible;
67437                 visible = val;
67438                 return visible;
67439             };
67440
67441
67442             var reference = preset.reference || {};
67443             preset.reference = function(geometry) {
67444                 // Lookup documentation on Wikidata...
67445                 var qid = preset.tags.wikidata || preset.tags['brand:wikidata'] || preset.tags['operator:wikidata'];
67446                 if (qid) {
67447                     return { qid: qid };
67448                 }
67449
67450                 // Lookup documentation on OSM Wikibase...
67451                 var key = reference.key || Object.keys(utilObjectOmit(preset.tags, 'name'))[0];
67452                 var value = reference.value || preset.tags[key];
67453
67454                 if (geometry === 'relation' && key === 'type') {
67455                     if (value in preset.tags) {
67456                         key = value;
67457                         value = preset.tags[key];
67458                     } else {
67459                         return { rtype: value };
67460                     }
67461                 }
67462
67463                 if (value === '*') {
67464                     return { key: key };
67465                 } else {
67466                     return { key: key, value: value };
67467                 }
67468             };
67469
67470
67471             preset.removeTags = preset.removeTags || preset.addTags || preset.tags || {};
67472             preset.unsetTags = function(tags, geometry) {
67473                 tags = utilObjectOmit(tags, Object.keys(preset.removeTags));
67474
67475                 for (var f in preset.fields) {
67476                     var field = preset.fields[f];
67477                     if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
67478                         delete tags[field.key];
67479                     }
67480                 }
67481
67482                 delete tags.area;
67483                 return tags;
67484             };
67485
67486
67487             preset.addTags = preset.addTags || preset.tags || {};
67488             preset.setTags = function(tags, geometry, skipFieldDefaults) {
67489                 var addTags = preset.addTags;
67490                 var k;
67491
67492                 tags = Object.assign({}, tags);   // shallow copy
67493
67494                 for (k in addTags) {
67495                     if (addTags[k] === '*') {
67496                         tags[k] = 'yes';
67497                     } else {
67498                         tags[k] = addTags[k];
67499                     }
67500                 }
67501
67502                 // Add area=yes if necessary.
67503                 // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
67504                 // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
67505                 // 2. chosen preset doesn't have a key in osmAreaKeys (`railway=station`)
67506                 if (!addTags.hasOwnProperty('area')) {
67507                     delete tags.area;
67508                     if (geometry === 'area') {
67509                         var needsAreaTag = true;
67510                         if (preset.geometry.indexOf('line') === -1) {
67511                             for (k in addTags) {
67512                                 if (k in osmAreaKeys) {
67513                                     needsAreaTag = false;
67514                                     break;
67515                                 }
67516                             }
67517                         }
67518                         if (needsAreaTag) {
67519                             tags.area = 'yes';
67520                         }
67521                     }
67522                 }
67523                 if (geometry && !skipFieldDefaults) {
67524                     for (var f in preset.fields) {
67525                         var field = preset.fields[f];
67526                         if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
67527                             tags[field.key] = field.default;
67528                         }
67529                     }
67530                 }
67531
67532                 return tags;
67533             };
67534
67535
67536             return preset;
67537         }
67538
67539         function presetIndex(context) {
67540             // a presetCollection with methods for
67541             // loading new data and returning defaults
67542
67543             var dispatch$1 = dispatch('recentsChange', 'favoritePreset');
67544
67545             var all = presetCollection([]);
67546             var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67547             var _fields = {};
67548             var _universal = [];
67549             var _favorites, _recents;
67550
67551             // Index of presets by (geometry, tag key).
67552             var _index = {
67553                 point: {},
67554                 vertex: {},
67555                 line: {},
67556                 area: {},
67557                 relation: {}
67558             };
67559
67560             all.match = function(entity, resolver) {
67561                 return resolver.transient(entity, 'presetMatch', function() {
67562                     var geometry = entity.geometry(resolver);
67563
67564                     // Treat entities on addr:interpolation lines as points, not vertices - #3241
67565                     if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
67566                         geometry = 'point';
67567                     }
67568
67569                     return all.matchTags(entity.tags, geometry);
67570                 });
67571             };
67572
67573             all.matchTags = function(tags, geometry) {
67574
67575                 var address;
67576                 var geometryMatches = _index[geometry];
67577                 var best = -1;
67578                 var match;
67579
67580                 for (var k in tags) {
67581                     // If any part of an address is present,
67582                     // allow fallback to "Address" preset - #4353
67583                     if (/^addr:/.test(k) && geometryMatches['addr:*']) {
67584                         address = geometryMatches['addr:*'][0];
67585                     }
67586
67587                     var keyMatches = geometryMatches[k];
67588                     if (!keyMatches) continue;
67589
67590                     for (var i = 0; i < keyMatches.length; i++) {
67591                         var score = keyMatches[i].matchScore(tags);
67592                         if (score > best) {
67593                             best = score;
67594                             match = keyMatches[i];
67595                         }
67596                     }
67597
67598                 }
67599
67600                 if (address && (!match || match.isFallback())) {
67601                     match = address;
67602                 }
67603                 return match || all.fallback(geometry);
67604             };
67605
67606             all.allowsVertex = function(entity, resolver) {
67607                 if (entity.type !== 'node') return false;
67608                 if (Object.keys(entity.tags).length === 0) return true;
67609
67610                 return resolver.transient(entity, 'vertexMatch', function() {
67611                     // address lines allow vertices to act as standalone points
67612                     if (entity.isOnAddressLine(resolver)) return true;
67613
67614                     var geometries = osmNodeGeometriesForTags(entity.tags);
67615                     if (geometries.vertex) return true;
67616                     if (geometries.point) return false;
67617                     // allow vertices for unspecified points
67618                     return true;
67619                 });
67620             };
67621
67622
67623             // Because of the open nature of tagging, iD will never have a complete
67624             // list of tags used in OSM, so we want it to have logic like "assume
67625             // that a closed way with an amenity tag is an area, unless the amenity
67626             // is one of these specific types". This function computes a structure
67627             // that allows testing of such conditions, based on the presets designated
67628             // as as supporting (or not supporting) the area geometry.
67629             //
67630             // The returned object L is a whitelist/blacklist of tags. A closed way
67631             // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
67632             // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
67633             // and the subkeys form the blacklist.
67634             all.areaKeys = function() {
67635                 var areaKeys = {};
67636                 var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
67637
67638                 // ignore name-suggestion-index and deprecated presets
67639                 var presets = all.collection.filter(function(p) {
67640                     return !p.suggestion && !p.replacement;
67641                 });
67642
67643                 // whitelist
67644                 presets.forEach(function(d) {
67645                     for (var key in d.tags) break;
67646                     if (!key) return;
67647                     if (ignore.indexOf(key) !== -1) return;
67648
67649                     if (d.geometry.indexOf('area') !== -1) {    // probably an area..
67650                         areaKeys[key] = areaKeys[key] || {};
67651                     }
67652                 });
67653
67654                 // blacklist
67655                 presets.forEach(function(d) {
67656                     for (var key in d.tags) break;
67657                     if (!key) return;
67658                     if (ignore.indexOf(key) !== -1) return;
67659
67660                     var value = d.tags[key];
67661                     if (key in areaKeys &&                      // probably an area...
67662                         d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
67663                         value !== '*') {
67664                         areaKeys[key][value] = true;
67665                     }
67666                 });
67667
67668                 return areaKeys;
67669             };
67670
67671             all.pointTags = function() {
67672                 return all.collection.reduce(function(pointTags, d) {
67673                     // ignore name-suggestion-index, deprecated, and generic presets
67674                     if (d.suggestion || d.replacement || d.searchable === false) return pointTags;
67675
67676                     // only care about the primary tag
67677                     for (var key in d.tags) break;
67678                     if (!key) return pointTags;
67679
67680                     // if this can be a point
67681                     if (d.geometry.indexOf('point') !== -1) {
67682                         pointTags[key] = pointTags[key] || {};
67683                         pointTags[key][d.tags[key]] = true;
67684                     }
67685                     return pointTags;
67686                 }, {});
67687             };
67688
67689             all.vertexTags = function() {
67690                 return all.collection.reduce(function(vertexTags, d) {
67691                     // ignore name-suggestion-index, deprecated, and generic presets
67692                     if (d.suggestion || d.replacement || d.searchable === false) return vertexTags;
67693
67694                     // only care about the primary tag
67695                     for (var key in d.tags) break;
67696                     if (!key) return vertexTags;
67697
67698                     // if this can be a vertex
67699                     if (d.geometry.indexOf('vertex') !== -1) {
67700                         vertexTags[key] = vertexTags[key] || {};
67701                         vertexTags[key][d.tags[key]] = true;
67702                     }
67703                     return vertexTags;
67704                 }, {});
67705             };
67706
67707             all.build = function(d, visible) {
67708                 if (d.fields) {
67709                     Object.keys(d.fields).forEach(function(id) {
67710                         var f = d.fields[id];
67711                         _fields[id] = presetField(id, f);
67712                         if (f.universal) {
67713                             _universal.push(_fields[id]);
67714                         }
67715                     });
67716                 }
67717
67718                 if (d.presets) {
67719                     var rawPresets = d.presets;
67720                     Object.keys(d.presets).forEach(function(id) {
67721                         var p = d.presets[id];
67722                         var existing = all.index(id);
67723                         if (existing !== -1) {
67724                             all.collection[existing] = presetPreset(id, p, _fields, visible, rawPresets);
67725                         } else {
67726                             all.collection.push(presetPreset(id, p, _fields, visible, rawPresets));
67727                         }
67728                     });
67729                 }
67730
67731                 if (d.categories) {
67732                     Object.keys(d.categories).forEach(function(id) {
67733                         var c = d.categories[id];
67734                         var existing = all.index(id);
67735                         if (existing !== -1) {
67736                             all.collection[existing] = presetCategory(id, c, all);
67737                         } else {
67738                             all.collection.push(presetCategory(id, c, all));
67739                         }
67740                     });
67741                 }
67742
67743                 if (d.defaults) {
67744                     var getItem = (all.item).bind(all);
67745                     _defaults = {
67746                         area: presetCollection(d.defaults.area.map(getItem)),
67747                         line: presetCollection(d.defaults.line.map(getItem)),
67748                         point: presetCollection(d.defaults.point.map(getItem)),
67749                         vertex: presetCollection(d.defaults.vertex.map(getItem)),
67750                         relation: presetCollection(d.defaults.relation.map(getItem))
67751                     };
67752                 }
67753
67754                 for (var i = 0; i < all.collection.length; i++) {
67755                     var preset = all.collection[i];
67756                     var geometry = preset.geometry;
67757
67758                     for (var j = 0; j < geometry.length; j++) {
67759                         var g = _index[geometry[j]];
67760                         for (var k in preset.tags) {
67761                             (g[k] = g[k] || []).push(preset);
67762                         }
67763                     }
67764                 }
67765                 return all;
67766             };
67767
67768             all.init = function() {
67769                 all.collection = [];
67770                 _favorites = null;
67771                 _recents = null;
67772                 _fields = {};
67773                 _universal = [];
67774                 _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
67775
67776                 return all.build(data.presets, true);
67777             };
67778
67779
67780             all.reset = function() {
67781                 all.collection = [];
67782                 _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
67783                 _fields = {};
67784                 _universal = [];
67785                 _favorites = null;
67786                 _recents = null;
67787
67788                 // Index of presets by (geometry, tag key).
67789                 _index = {
67790                     point: {},
67791                     vertex: {},
67792                     line: {},
67793                     area: {},
67794                     relation: {}
67795                 };
67796
67797                 return all;
67798             };
67799
67800             all.fromExternal = function(external, done) {
67801                 all.reset();
67802                 d3_json(external)
67803                     .then(function(externalPresets) {
67804                         all.build(data.presets, false);    // make default presets hidden to begin
67805                         all.build(externalPresets, true);  // make the external visible
67806                     })
67807                     .catch(function() {
67808                         all.init();
67809                     })
67810                     .finally(function() {
67811                         done(all);
67812                     });
67813             };
67814
67815             all.field = function(id) {
67816                 return _fields[id];
67817             };
67818
67819             all.universal = function() {
67820                 return _universal;
67821             };
67822
67823             all.defaults = function(geometry, n) {
67824                 var rec = [];
67825                 if (!context.inIntro()) {
67826                     rec = all.recent().matchGeometry(geometry).collection.slice(0, 4);
67827                 }
67828                 var def = utilArrayUniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
67829                 return presetCollection(utilArrayUniq(rec.concat(def).concat(all.fallback(geometry))));
67830             };
67831
67832             all.recent = function() {
67833                 return presetCollection(utilArrayUniq(all.getRecents().map(function(d) {
67834                     return d.preset;
67835                 })));
67836             };
67837
67838             function RibbonItem(preset, geometry, source) {
67839                 var item = {};
67840                 item.preset = preset;
67841                 item.geometry = geometry;
67842                 item.source = source;
67843
67844                 item.isFavorite = function() {
67845                     return item.source === 'favorite';
67846                 };
67847                 item.isRecent = function() {
67848                     return item.source === 'recent';
67849                 };
67850                 item.matches = function(preset, geometry) {
67851                     return item.preset.id === preset.id && item.geometry === geometry;
67852                 };
67853                 item.minified = function() {
67854                     return {
67855                         pID: item.preset.id,
67856                         geom: item.geometry
67857                     };
67858                 };
67859                 return item;
67860             }
67861
67862             function ribbonItemForMinified(d, source) {
67863                 if (d && d.pID && d.geom) {
67864                     var preset = all.item(d.pID);
67865                     if (!preset) return null;
67866
67867                     var geom = d.geom;
67868                     // treat point and vertex features as one geometry
67869                     if (geom === 'vertex') geom = 'point';
67870
67871                     // iD's presets could have changed since this was saved,
67872                     // so make sure it's still valid.
67873                     if (preset.matchGeometry(geom) || (geom === 'point' && preset.matchGeometry('vertex'))) {
67874                         return RibbonItem(preset, geom, source);
67875                     }
67876                 }
67877                 return null;
67878             }
67879
67880             function setFavorites(items) {
67881                 _favorites = items;
67882                 var minifiedItems = items.map(function(d) { return d.minified(); });
67883                 context.storage('preset_favorites', JSON.stringify(minifiedItems));
67884
67885                 // call update
67886                 dispatch$1.call('favoritePreset');
67887             }
67888
67889             all.getFavorites = function() {
67890                 if (!_favorites) {
67891                     // fetch from local storage
67892                     _favorites = (JSON.parse(context.storage('preset_favorites')) || [
67893                             // use the generic presets as the default favorites
67894                             { pID: 'point', geom: 'point'},
67895                             { pID: 'line', geom: 'line'},
67896                             { pID: 'area', geom: 'area'}
67897                         ]).reduce(function(output, d) {
67898                             var item = ribbonItemForMinified(d, 'favorite');
67899                             if (item) output.push(item);
67900                             return output;
67901                         }, []);
67902                 }
67903                 return _favorites;
67904             };
67905
67906             function setRecents(items) {
67907                 _recents = items;
67908                 var minifiedItems = items.map(function(d) { return d.minified(); });
67909                 context.storage('preset_recents', JSON.stringify(minifiedItems));
67910
67911                 dispatch$1.call('recentsChange');
67912             }
67913
67914             all.getRecents = function() {
67915                 if (!_recents) {
67916                     // fetch from local storage
67917                     _recents = (JSON.parse(context.storage('preset_recents')) || [])
67918                         .reduce(function(output, d) {
67919                             var item = ribbonItemForMinified(d, 'recent');
67920                             if (item) output.push(item);
67921                             return output;
67922                         }, []);
67923                 }
67924                 return _recents;
67925             };
67926
67927             all.toggleFavorite = function(preset, geometry) {
67928                 geometry = all.fallback(geometry).id;
67929                 var favs = all.getFavorites();
67930                 var favorite = all.favoriteMatching(preset, geometry);
67931                 if (favorite) {
67932                     favs.splice(favs.indexOf(favorite), 1);
67933                 } else {
67934                     // only allow 10 favorites
67935                     if (favs.length === 10) {
67936                         // remove the last favorite (last in, first out)
67937                         favs.pop();
67938                     }
67939                     // append array
67940                     favs.push(RibbonItem(preset, geometry, 'favorite'));
67941                 }
67942                 setFavorites(favs);
67943             };
67944
67945             all.removeFavorite = function(preset, geometry) {
67946                 geometry = all.fallback(geometry).id;
67947                 var item = all.favoriteMatching(preset, geometry);
67948                 if (item) {
67949                     var items = all.getFavorites();
67950                     items.splice(items.indexOf(item), 1);
67951                     setFavorites(items);
67952                 }
67953             };
67954
67955             all.removeRecent = function(preset, geometry) {
67956                 var item = all.recentMatching(preset, geometry);
67957                 if (item) {
67958                     var items = all.getRecents();
67959                     items.splice(items.indexOf(item), 1);
67960                     setRecents(items);
67961                 }
67962             };
67963
67964             all.favoriteMatching = function(preset, geometry) {
67965                 geometry = all.fallback(geometry).id;
67966                 var favs = all.getFavorites();
67967                 for (var index in favs) {
67968                     if (favs[index].matches(preset, geometry)) {
67969                         return favs[index];
67970                     }
67971                 }
67972                 return null;
67973             };
67974             all.recentMatching = function(preset, geometry) {
67975                 geometry = all.fallback(geometry).id;
67976                 var items = all.getRecents();
67977                 for (var index in items) {
67978                     if (items[index].matches(preset, geometry)) {
67979                         return items[index];
67980                     }
67981                 }
67982                 return null;
67983             };
67984
67985             all.moveItem = function(items, fromIndex, toIndex) {
67986                 if (fromIndex === toIndex ||
67987                     fromIndex < 0 || toIndex < 0 ||
67988                     fromIndex >= items.length || toIndex >= items.length) return null;
67989                 items.splice(toIndex, 0, items.splice(fromIndex, 1)[0]);
67990                 return items;
67991             };
67992
67993             all.moveFavorite = function(fromIndex, toIndex) {
67994                 var items = all.moveItem(all.getFavorites(), fromIndex, toIndex);
67995                 if (items) setFavorites(items);
67996             };
67997
67998             all.moveRecent = function(item, beforeItem) {
67999                 var recents = all.getRecents();
68000                 var fromIndex = recents.indexOf(item);
68001                 var toIndex = recents.indexOf(beforeItem);
68002                 var items = all.moveItem(recents, fromIndex, toIndex);
68003                 if (items) setRecents(items);
68004             };
68005
68006             all.setMostRecent = function(preset, geometry) {
68007                 if (context.inIntro()) return;
68008                 if (preset.searchable === false) return;
68009
68010                 geometry = all.fallback(geometry).id;
68011
68012                 var items = all.getRecents();
68013                 var item = all.recentMatching(preset, geometry);
68014                 if (item) {
68015                     items.splice(items.indexOf(item), 1);
68016                 } else {
68017                     item = RibbonItem(preset, geometry, 'recent');
68018                 }
68019                 // allow 30 recents
68020                 if (items.length === 30) {
68021                     // remove the last favorite (first in, first out)
68022                     items.pop();
68023                 }
68024                 // prepend array
68025                 items.unshift(item);
68026                 setRecents(items);
68027             };
68028
68029             return utilRebind(all, dispatch$1, 'on');
68030         }
68031
68032         function localeDateString(s) {
68033             if (!s) return null;
68034             var detected = utilDetect();
68035             var options = { day: 'numeric', month: 'short', year: 'numeric' };
68036             var d = new Date(s);
68037             if (isNaN(d.getTime())) return null;
68038             return d.toLocaleDateString(detected.locale, options);
68039         }
68040
68041         function vintageRange(vintage) {
68042             var s;
68043             if (vintage.start || vintage.end) {
68044                 s = (vintage.start || '?');
68045                 if (vintage.start !== vintage.end) {
68046                     s += ' - ' + (vintage.end || '?');
68047                 }
68048             }
68049             return s;
68050         }
68051
68052
68053         function rendererBackgroundSource(data) {
68054             var source = Object.assign({}, data);   // shallow copy
68055             var offset = [0, 0];
68056             var name = source.name;
68057             var description = source.description;
68058             var best = !!source.best;
68059             var template = source.template;
68060
68061             source.tileSize = data.tileSize || 256;
68062             source.zoomExtent = data.zoomExtent || [0, 22];
68063             source.overzoom = data.overzoom !== false;
68064
68065             source.offset = function(_) {
68066                 if (!arguments.length) return offset;
68067                 offset = _;
68068                 return source;
68069             };
68070
68071
68072             source.nudge = function(val, zoomlevel) {
68073                 offset[0] += val[0] / Math.pow(2, zoomlevel);
68074                 offset[1] += val[1] / Math.pow(2, zoomlevel);
68075                 return source;
68076             };
68077
68078
68079             source.name = function() {
68080                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68081                 return t('imagery.' + id_safe + '.name', { default: name });
68082             };
68083
68084
68085             source.description = function() {
68086                 var id_safe = source.id.replace(/\./g, '<TX_DOT>');
68087                 return t('imagery.' + id_safe + '.description', { default: description });
68088             };
68089
68090
68091             source.best = function() {
68092                 return best;
68093             };
68094
68095
68096             source.area = function() {
68097                 if (!data.polygon) return Number.MAX_VALUE;  // worldwide
68098                 var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
68099                 return isNaN(area) ? 0 : area;
68100             };
68101
68102
68103             source.imageryUsed = function() {
68104                 return name || source.id;
68105             };
68106
68107
68108             source.template = function(_) {
68109                 if (!arguments.length) return template;
68110                 if (source.id === 'custom') template = _;
68111                 return source;
68112             };
68113
68114
68115             source.url = function(coord) {
68116                 if (this.type === 'wms') {
68117                     var tileToProjectedCoords = (function(x, y, z) {
68118                         //polyfill for IE11, PhantomJS
68119                         var sinh = Math.sinh || function(x) {
68120                             var y = Math.exp(x);
68121                             return (y - 1 / y) / 2;
68122                         };
68123
68124                         var zoomSize = Math.pow(2, z);
68125                         var lon = x / zoomSize * Math.PI * 2 - Math.PI;
68126                         var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
68127
68128                         switch (this.projection) {
68129                             case 'EPSG:4326':
68130                                 return {
68131                                     x: lon * 180 / Math.PI,
68132                                     y: lat * 180 / Math.PI
68133                                 };
68134                             default: // EPSG:3857 and synonyms
68135                                 var mercCoords = mercatorRaw(lon, lat);
68136                                 return {
68137                                     x: 20037508.34 / Math.PI * mercCoords[0],
68138                                     y: 20037508.34 / Math.PI * mercCoords[1]
68139                                 };
68140                         }
68141                     }).bind(this);
68142
68143                     var tileSize = this.tileSize;
68144                     var projection = this.projection;
68145                     var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
68146                     var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
68147                     return template.replace(/\{(\w+)\}/g, function (token, key) {
68148                       switch (key) {
68149                         case 'width':
68150                         case 'height':
68151                           return tileSize;
68152                         case 'proj':
68153                           return projection;
68154                         case 'wkid':
68155                           return projection.replace(/^EPSG:/, '');
68156                         case 'bbox':
68157                           return minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y;
68158                         case 'w':
68159                           return minXmaxY.x;
68160                         case 's':
68161                           return maxXminY.y;
68162                         case 'n':
68163                           return maxXminY.x;
68164                         case 'e':
68165                           return minXmaxY.y;
68166                         default:
68167                           return token;
68168                       }
68169                     });
68170                 }
68171                 return template
68172                     .replace('{x}', coord[0])
68173                     .replace('{y}', coord[1])
68174                     // TMS-flipped y coordinate
68175                     .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
68176                     .replace(/\{z(oom)?\}/, coord[2])
68177                     .replace(/\{switch:([^}]+)\}/, function(s, r) {
68178                         var subdomains = r.split(',');
68179                         return subdomains[(coord[0] + coord[1]) % subdomains.length];
68180                     })
68181                     .replace('{u}', function() {
68182                         var u = '';
68183                         for (var zoom = coord[2]; zoom > 0; zoom--) {
68184                             var b = 0;
68185                             var mask = 1 << (zoom - 1);
68186                             if ((coord[0] & mask) !== 0) b++;
68187                             if ((coord[1] & mask) !== 0) b += 2;
68188                             u += b.toString();
68189                         }
68190                         return u;
68191                     });
68192             };
68193
68194
68195             source.validZoom = function(z) {
68196                 return source.zoomExtent[0] <= z &&
68197                     (source.overzoom || source.zoomExtent[1] > z);
68198             };
68199
68200
68201             source.isLocatorOverlay = function() {
68202                 return source.id === 'mapbox_locator_overlay';
68203             };
68204
68205
68206             /* hides a source from the list, but leaves it available for use */
68207             source.isHidden = function() {
68208                 return source.id === 'DigitalGlobe-Premium-vintage' ||
68209                     source.id === 'DigitalGlobe-Standard-vintage';
68210             };
68211
68212
68213             source.copyrightNotices = function() {};
68214
68215
68216             source.getMetadata = function(center, tileCoord, callback) {
68217                 var vintage = {
68218                     start: localeDateString(source.startDate),
68219                     end: localeDateString(source.endDate)
68220                 };
68221                 vintage.range = vintageRange(vintage);
68222
68223                 var metadata = { vintage: vintage };
68224                 callback(null, metadata);
68225             };
68226
68227
68228             return source;
68229         }
68230
68231
68232         rendererBackgroundSource.Bing = function(data, dispatch) {
68233             // http://msdn.microsoft.com/en-us/library/ff701716.aspx
68234             // http://msdn.microsoft.com/en-us/library/ff701701.aspx
68235
68236             data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
68237
68238             var bing = rendererBackgroundSource(data);
68239             // var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // P2, JOSM, etc
68240             var key = 'Ak5oTE46TUbjRp08OFVcGpkARErDobfpuyNKa-W2mQ8wbt1K1KL8p1bIRwWwcF-Q';    // iD
68241
68242
68243             var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' + key;
68244             var cache = {};
68245             var inflight = {};
68246             var providers = [];
68247
68248             d3_json(url)
68249                 .then(function(json) {
68250                     providers = json.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
68251                         return {
68252                             attribution: provider.attribution,
68253                             areas: provider.coverageAreas.map(function(area) {
68254                                 return {
68255                                     zoom: [area.zoomMin, area.zoomMax],
68256                                     extent: geoExtent([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
68257                                 };
68258                             })
68259                         };
68260                     });
68261                     dispatch.call('change');
68262                 })
68263                 .catch(function() {
68264                     /* ignore */
68265                 });
68266
68267
68268             bing.copyrightNotices = function(zoom, extent) {
68269                 zoom = Math.min(zoom, 21);
68270                 return providers.filter(function(provider) {
68271                     return provider.areas.some(function(area) {
68272                         return extent.intersects(area.extent) &&
68273                             area.zoom[0] <= zoom &&
68274                             area.zoom[1] >= zoom;
68275                     });
68276                 }).map(function(provider) {
68277                     return provider.attribution;
68278                 }).join(', ');
68279             };
68280
68281
68282             bing.getMetadata = function(center, tileCoord, callback) {
68283                 var tileID = tileCoord.slice(0, 3).join('/');
68284                 var zoom = Math.min(tileCoord[2], 21);
68285                 var centerPoint = center[1] + ',' + center[0];  // lat,lng
68286                 var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
68287                         '?zl=' + zoom + '&key=' + key;
68288
68289                 if (inflight[tileID]) return;
68290
68291                 if (!cache[tileID]) {
68292                     cache[tileID] = {};
68293                 }
68294                 if (cache[tileID] && cache[tileID].metadata) {
68295                     return callback(null, cache[tileID].metadata);
68296                 }
68297
68298                 inflight[tileID] = true;
68299                 d3_json(url)
68300                     .then(function(result) {
68301                         delete inflight[tileID];
68302                         if (!result) {
68303                             throw new Error('Unknown Error');
68304                         }
68305                         var vintage = {
68306                             start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
68307                             end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
68308                         };
68309                         vintage.range = vintageRange(vintage);
68310
68311                         var metadata = { vintage: vintage };
68312                         cache[tileID].metadata = metadata;
68313                         if (callback) callback(null, metadata);
68314                     })
68315                     .catch(function(err) {
68316                         delete inflight[tileID];
68317                         if (callback) callback(err.message);
68318                     });
68319             };
68320
68321
68322             bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
68323
68324
68325             return bing;
68326         };
68327
68328
68329
68330         rendererBackgroundSource.Esri = function(data) {
68331             // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
68332             if (data.template.match(/blankTile/) === null) {
68333                 data.template = data.template + '?blankTile=false';
68334             }
68335
68336             var esri = rendererBackgroundSource(data);
68337             var cache = {};
68338             var inflight = {};
68339             var _prevCenter;
68340
68341             // use a tilemap service to set maximum zoom for esri tiles dynamically
68342             // https://developers.arcgis.com/documentation/tiled-elevation-service/
68343             esri.fetchTilemap = function(center) {
68344                 // skip if we have already fetched a tilemap within 5km
68345                 if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
68346                 _prevCenter = center;
68347
68348                 // tiles are available globally to zoom level 19, afterward they may or may not be present
68349                 var z = 20;
68350
68351                 // first generate a random url using the template
68352                 var dummyUrl = esri.url([1,2,3]);
68353
68354                 // calculate url z/y/x from the lat/long of the center of the map
68355                 var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
68356                 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)));
68357
68358                 // fetch an 8x8 grid to leverage cache
68359                 var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
68360
68361                 // make the request and introspect the response from the tilemap server
68362                 d3_json(tilemapUrl)
68363                     .then(function(tilemap) {
68364                         if (!tilemap) {
68365                             throw new Error('Unknown Error');
68366                         }
68367                         var hasTiles = true;
68368                         for (var i = 0; i < tilemap.data.length; i++) {
68369                             // 0 means an individual tile in the grid doesn't exist
68370                             if (!tilemap.data[i]) {
68371                                 hasTiles = false;
68372                                 break;
68373                             }
68374                         }
68375
68376                         // if any tiles are missing at level 20 we restrict maxZoom to 19
68377                         esri.zoomExtent[1] = (hasTiles ? 22 : 19);
68378                     })
68379                     .catch(function() {
68380                         /* ignore */
68381                     });
68382             };
68383
68384
68385             esri.getMetadata = function(center, tileCoord, callback) {
68386                 var tileID = tileCoord.slice(0, 3).join('/');
68387                 var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
68388                 var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
68389                 var unknown = t('info_panels.background.unknown');
68390                 var metadataLayer;
68391                 var vintage = {};
68392                 var metadata = {};
68393
68394                 if (inflight[tileID]) return;
68395
68396                 switch (true) {
68397                     case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
68398                         metadataLayer = 4;
68399                         break;
68400                     case zoom >= 19:
68401                         metadataLayer = 3;
68402                         break;
68403                     case zoom >= 17:
68404                         metadataLayer = 2;
68405                         break;
68406                     case zoom >= 13:
68407                         metadataLayer = 0;
68408                         break;
68409                     default:
68410                         metadataLayer = 99;
68411                 }
68412
68413                 var url;
68414                 // build up query using the layer appropriate to the current zoom
68415                 if (esri.id === 'EsriWorldImagery') {
68416                     url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
68417                 } else if (esri.id === 'EsriWorldImageryClarity') {
68418                     url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
68419                 }
68420
68421                 url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
68422
68423                 if (!cache[tileID]) {
68424                     cache[tileID] = {};
68425                 }
68426                 if (cache[tileID] && cache[tileID].metadata) {
68427                     return callback(null, cache[tileID].metadata);
68428                 }
68429
68430                 // accurate metadata is only available >= 13
68431                 if (metadataLayer === 99) {
68432                     vintage = {
68433                         start: null,
68434                         end: null,
68435                         range: null
68436                     };
68437                     metadata = {
68438                         vintage: null,
68439                         source: unknown,
68440                         description: unknown,
68441                         resolution: unknown,
68442                         accuracy: unknown
68443                     };
68444
68445                     callback(null, metadata);
68446
68447                 } else {
68448                     inflight[tileID] = true;
68449                     d3_json(url)
68450                         .then(function(result) {
68451                             delete inflight[tileID];
68452                             if (!result) {
68453                                 throw new Error('Unknown Error');
68454                             } else if (result.features && result.features.length < 1) {
68455                                 throw new Error('No Results');
68456                             } else if (result.error && result.error.message) {
68457                                 throw new Error(result.error.message);
68458                             }
68459
68460                             // pass through the discrete capture date from metadata
68461                             var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
68462                             vintage = {
68463                                 start: captureDate,
68464                                 end: captureDate,
68465                                 range: captureDate
68466                             };
68467                             metadata = {
68468                                 vintage: vintage,
68469                                 source: clean(result.features[0].attributes.NICE_NAME),
68470                                 description: clean(result.features[0].attributes.NICE_DESC),
68471                                 resolution: clean(result.features[0].attributes.SRC_RES),
68472                                 accuracy: clean(result.features[0].attributes.SRC_ACC)
68473                             };
68474
68475                             // append units - meters
68476                             if (isFinite(metadata.resolution)) {
68477                                 metadata.resolution += ' m';
68478                             }
68479                             if (isFinite(metadata.accuracy)) {
68480                                 metadata.accuracy += ' m';
68481                             }
68482
68483                             cache[tileID].metadata = metadata;
68484                             if (callback) callback(null, metadata);
68485                         })
68486                         .catch(function(err) {
68487                             delete inflight[tileID];
68488                             if (callback) callback(err.message);
68489                         });
68490                 }
68491
68492
68493                 function clean(val) {
68494                     return String(val).trim() || unknown;
68495                 }
68496             };
68497
68498             return esri;
68499         };
68500
68501
68502         rendererBackgroundSource.None = function() {
68503             var source = rendererBackgroundSource({ id: 'none', template: '' });
68504
68505
68506             source.name = function() {
68507                 return t('background.none');
68508             };
68509
68510
68511             source.imageryUsed = function() {
68512                 return null;
68513             };
68514
68515
68516             source.area = function() {
68517                 return -1;  // sources in background pane are sorted by area
68518             };
68519
68520
68521             return source;
68522         };
68523
68524
68525         rendererBackgroundSource.Custom = function(template) {
68526             var source = rendererBackgroundSource({ id: 'custom', template: template });
68527
68528
68529             source.name = function() {
68530                 return t('background.custom');
68531             };
68532
68533
68534             source.imageryUsed = function() {
68535                 return 'Custom (' + source.template() + ')';
68536             };
68537
68538
68539             source.area = function() {
68540                 return -2;  // sources in background pane are sorted by area
68541             };
68542
68543
68544             return source;
68545         };
68546
68547         function rendererTileLayer(context) {
68548             var transformProp = utilPrefixCSSProperty('Transform');
68549             var tiler = utilTiler();
68550
68551             var _tileSize = 256;
68552             var _projection;
68553             var _cache = {};
68554             var _tileOrigin;
68555             var _zoom;
68556             var _source;
68557
68558
68559             function tileSizeAtZoom(d, z) {
68560                 var EPSILON = 0.002;    // close seams
68561                 return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
68562             }
68563
68564
68565             function atZoom(t, distance) {
68566                 var power = Math.pow(2, distance);
68567                 return [
68568                     Math.floor(t[0] * power),
68569                     Math.floor(t[1] * power),
68570                     t[2] + distance
68571                 ];
68572             }
68573
68574
68575             function lookUp(d) {
68576                 for (var up = -1; up > -d[2]; up--) {
68577                     var tile = atZoom(d, up);
68578                     if (_cache[_source.url(tile)] !== false) {
68579                         return tile;
68580                     }
68581                 }
68582             }
68583
68584
68585             function uniqueBy(a, n) {
68586                 var o = [];
68587                 var seen = {};
68588                 for (var i = 0; i < a.length; i++) {
68589                     if (seen[a[i][n]] === undefined) {
68590                         o.push(a[i]);
68591                         seen[a[i][n]] = true;
68592                     }
68593                 }
68594                 return o;
68595             }
68596
68597
68598             function addSource(d) {
68599                 d.push(_source.url(d));
68600                 return d;
68601             }
68602
68603
68604             // Update tiles based on current state of `projection`.
68605             function background(selection) {
68606                 _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
68607
68608                 var pixelOffset;
68609                 if (_source) {
68610                     pixelOffset = [
68611                         _source.offset()[0] * Math.pow(2, _zoom),
68612                         _source.offset()[1] * Math.pow(2, _zoom)
68613                     ];
68614                 } else {
68615                     pixelOffset = [0, 0];
68616                 }
68617
68618                 var translate = [
68619                     _projection.translate()[0] + pixelOffset[0],
68620                     _projection.translate()[1] + pixelOffset[1]
68621                 ];
68622
68623                 tiler
68624                     .scale(_projection.scale() * 2 * Math.PI)
68625                     .translate(translate);
68626
68627                 _tileOrigin = [
68628                     _projection.scale() * Math.PI - translate[0],
68629                     _projection.scale() * Math.PI - translate[1]
68630                 ];
68631
68632                 render(selection);
68633             }
68634
68635
68636             // Derive the tiles onscreen, remove those offscreen and position them.
68637             // Important that this part not depend on `_projection` because it's
68638             // rentered when tiles load/error (see #644).
68639             function render(selection) {
68640                 if (!_source) return;
68641                 var requests = [];
68642                 var showDebug = context.getDebug('tile') && !_source.overlay;
68643
68644                 if (_source.validZoom(_zoom)) {
68645                     tiler.skipNullIsland(!!_source.overlay);
68646
68647                     tiler().forEach(function(d) {
68648                         addSource(d);
68649                         if (d[3] === '') return;
68650                         if (typeof d[3] !== 'string') return; // Workaround for #2295
68651                         requests.push(d);
68652                         if (_cache[d[3]] === false && lookUp(d)) {
68653                             requests.push(addSource(lookUp(d)));
68654                         }
68655                     });
68656
68657                     requests = uniqueBy(requests, 3).filter(function(r) {
68658                         // don't re-request tiles which have failed in the past
68659                         return _cache[r[3]] !== false;
68660                     });
68661                 }
68662
68663                 function load(d) {
68664                     _cache[d[3]] = true;
68665                     d3_select(this)
68666                         .on('error', null)
68667                         .on('load', null)
68668                         .classed('tile-loaded', true);
68669                     render(selection);
68670                 }
68671
68672                 function error(d) {
68673                     _cache[d[3]] = false;
68674                     d3_select(this)
68675                         .on('error', null)
68676                         .on('load', null)
68677                         .remove();
68678                     render(selection);
68679                 }
68680
68681                 function imageTransform(d) {
68682                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68683                     var scale = tileSizeAtZoom(d, _zoom);
68684                     return 'translate(' +
68685                         ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
68686                         ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
68687                         'scale(' + scale + ',' + scale + ')';
68688                 }
68689
68690                 function tileCenter(d) {
68691                     var ts = _tileSize * Math.pow(2, _zoom - d[2]);
68692                     return [
68693                         ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
68694                         ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
68695                     ];
68696                 }
68697
68698                 function debugTransform(d) {
68699                     var coord = tileCenter(d);
68700                     return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
68701                 }
68702
68703
68704                 // Pick a representative tile near the center of the viewport
68705                 // (This is useful for sampling the imagery vintage)
68706                 var dims = tiler.size();
68707                 var mapCenter = [dims[0] / 2, dims[1] / 2];
68708                 var minDist = Math.max(dims[0], dims[1]);
68709                 var nearCenter;
68710
68711                 requests.forEach(function(d) {
68712                     var c = tileCenter(d);
68713                     var dist = geoVecLength(c, mapCenter);
68714                     if (dist < minDist) {
68715                         minDist = dist;
68716                         nearCenter = d;
68717                     }
68718                 });
68719
68720
68721                 var image = selection.selectAll('img')
68722                     .data(requests, function(d) { return d[3]; });
68723
68724                 image.exit()
68725                     .style(transformProp, imageTransform)
68726                     .classed('tile-removing', true)
68727                     .classed('tile-center', false)
68728                     .each(function() {
68729                         var tile = d3_select(this);
68730                         window.setTimeout(function() {
68731                             if (tile.classed('tile-removing')) {
68732                                 tile.remove();
68733                             }
68734                         }, 300);
68735                     });
68736
68737                 image.enter()
68738                   .append('img')
68739                     .attr('class', 'tile')
68740                     .attr('src', function(d) { return d[3]; })
68741                     .on('error', error)
68742                     .on('load', load)
68743                   .merge(image)
68744                     .style(transformProp, imageTransform)
68745                     .classed('tile-debug', showDebug)
68746                     .classed('tile-removing', false)
68747                     .classed('tile-center', function(d) { return d === nearCenter; });
68748
68749
68750
68751                 var debug = selection.selectAll('.tile-label-debug')
68752                     .data(showDebug ? requests : [], function(d) { return d[3]; });
68753
68754                 debug.exit()
68755                     .remove();
68756
68757                 if (showDebug) {
68758                     var debugEnter = debug.enter()
68759                         .append('div')
68760                         .attr('class', 'tile-label-debug');
68761
68762                     debugEnter
68763                         .append('div')
68764                         .attr('class', 'tile-label-debug-coord');
68765
68766                     debugEnter
68767                         .append('div')
68768                         .attr('class', 'tile-label-debug-vintage');
68769
68770                     debug = debug.merge(debugEnter);
68771
68772                     debug
68773                         .style(transformProp, debugTransform);
68774
68775                     debug
68776                         .selectAll('.tile-label-debug-coord')
68777                         .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
68778
68779                     debug
68780                         .selectAll('.tile-label-debug-vintage')
68781                         .each(function(d) {
68782                             var span = d3_select(this);
68783                             var center = context.projection.invert(tileCenter(d));
68784                             _source.getMetadata(center, d, function(err, result) {
68785                                 span.text((result && result.vintage && result.vintage.range) ||
68786                                     t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
68787                                 );
68788                             });
68789                         });
68790                 }
68791
68792             }
68793
68794
68795             background.projection = function(val) {
68796                 if (!arguments.length) return _projection;
68797                 _projection = val;
68798                 return background;
68799             };
68800
68801
68802             background.dimensions = function(val) {
68803                 if (!arguments.length) return tiler.size();
68804                 tiler.size(val);
68805                 return background;
68806             };
68807
68808
68809             background.source = function(val) {
68810                 if (!arguments.length) return _source;
68811                 _source = val;
68812                 _tileSize = _source.tileSize;
68813                 _cache = {};
68814                 tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
68815                 return background;
68816             };
68817
68818
68819             return background;
68820         }
68821
68822         function rendererBackground(context) {
68823             var dispatch$1 = dispatch('change');
68824             var detected = utilDetect();
68825             var baseLayer = rendererTileLayer(context).projection(context.projection);
68826             var _isValid = true;
68827             var _overlayLayers = [];
68828             var _backgroundSources = [];
68829             var _brightness = 1;
68830             var _contrast = 1;
68831             var _saturation = 1;
68832             var _sharpness = 1;
68833
68834
68835             function background(selection) {
68836                 // If we are displaying an Esri basemap at high zoom,
68837                 // check its tilemap to see how high the zoom can go
68838                 if (context.map().zoom() > 18) {
68839                     var basemap = baseLayer.source();
68840                     if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
68841                         var center = context.map().center();
68842                         basemap.fetchTilemap(center);
68843                     }
68844                 }
68845
68846                 // Is the imagery valid here? - #4827
68847                 var sources = background.sources(context.map().extent());
68848                 var wasValid = _isValid;
68849                 _isValid = !!sources
68850                     .filter(function(d) { return d === baseLayer.source(); }).length;
68851
68852                 if (wasValid !== _isValid) {      // change in valid status
68853                     background.updateImagery();
68854                 }
68855
68856
68857                 var baseFilter = '';
68858                 if (detected.cssfilters) {
68859                     if (_brightness !== 1) {
68860                         baseFilter += 'brightness(' + _brightness + ')';
68861                     }
68862                     if (_contrast !== 1) {
68863                         baseFilter += 'contrast(' + _contrast + ')';
68864                     }
68865                     if (_saturation !== 1) {
68866                         baseFilter += 'saturate(' + _saturation + ')';
68867                     }
68868                     if (_sharpness < 1) {  // gaussian blur
68869                         var blur = d3_interpolateNumber(0.5, 5)(1 - _sharpness);
68870                         baseFilter += 'blur(' + blur + 'px)';
68871                     }
68872                 }
68873
68874                 var base = selection.selectAll('.layer-background')
68875                     .data([0]);
68876
68877                 base = base.enter()
68878                     .insert('div', '.layer-data')
68879                     .attr('class', 'layer layer-background')
68880                     .merge(base);
68881
68882                 if (detected.cssfilters) {
68883                     base.style('filter', baseFilter || null);
68884                 } else {
68885                     base.style('opacity', _brightness);
68886                 }
68887
68888
68889                 var imagery = base.selectAll('.layer-imagery')
68890                     .data([0]);
68891
68892                 imagery.enter()
68893                     .append('div')
68894                     .attr('class', 'layer layer-imagery')
68895                     .merge(imagery)
68896                     .call(baseLayer);
68897
68898
68899                 var maskFilter = '';
68900                 var mixBlendMode = '';
68901                 if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
68902                     mixBlendMode = 'overlay';
68903                     maskFilter = 'saturate(0) blur(3px) invert(1)';
68904
68905                     var contrast = _sharpness - 1;
68906                     maskFilter += ' contrast(' + contrast + ')';
68907
68908                     var brightness = d3_interpolateNumber(1, 0.85)(_sharpness - 1);
68909                     maskFilter += ' brightness(' + brightness + ')';
68910                 }
68911
68912                 var mask = base.selectAll('.layer-unsharp-mask')
68913                     .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
68914
68915                 mask.exit()
68916                     .remove();
68917
68918                 mask.enter()
68919                     .append('div')
68920                     .attr('class', 'layer layer-mask layer-unsharp-mask')
68921                     .merge(mask)
68922                     .call(baseLayer)
68923                     .style('filter', maskFilter || null)
68924                     .style('mix-blend-mode', mixBlendMode || null);
68925
68926
68927                 var overlays = selection.selectAll('.layer-overlay')
68928                     .data(_overlayLayers, function(d) { return d.source().name(); });
68929
68930                 overlays.exit()
68931                     .remove();
68932
68933                 overlays.enter()
68934                     .insert('div', '.layer-data')
68935                     .attr('class', 'layer layer-overlay')
68936                     .merge(overlays)
68937                     .each(function(layer) { d3_select(this).call(layer); });
68938             }
68939
68940
68941             background.updateImagery = function() {
68942                 var b = baseLayer.source();
68943                 if (context.inIntro() || !b) return;
68944
68945                 var o = _overlayLayers
68946                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
68947                     .map(function (d) { return d.source().id; })
68948                     .join(',');
68949
68950                 var meters = geoOffsetToMeters(b.offset());
68951                 var epsilon = 0.01;
68952                 var x = +meters[0].toFixed(2);
68953                 var y = +meters[1].toFixed(2);
68954                 var q = utilStringQs(window.location.hash.substring(1));
68955
68956                 var id = b.id;
68957                 if (id === 'custom') {
68958                     id = 'custom:' + b.template();
68959                 }
68960
68961                 if (id) {
68962                     q.background = id;
68963                 } else {
68964                     delete q.background;
68965                 }
68966
68967                 if (o) {
68968                     q.overlays = o;
68969                 } else {
68970                     delete q.overlays;
68971                 }
68972
68973                 if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
68974                     q.offset = x + ',' + y;
68975                 } else {
68976                     delete q.offset;
68977                 }
68978
68979                 if (!window.mocha) {
68980                     window.location.replace('#' + utilQsString(q, true));
68981                 }
68982
68983                 var imageryUsed = [];
68984                 var photoOverlaysUsed = [];
68985
68986                 var current = b.imageryUsed();
68987                 if (current && _isValid) {
68988                     imageryUsed.push(current);
68989                 }
68990
68991                 _overlayLayers
68992                     .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
68993                     .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
68994
68995                 var data = context.layers().layer('data');
68996                 if (data && data.enabled() && data.hasData()) {
68997                     imageryUsed.push(data.getSrc());
68998                 }
68999
69000                 var photoOverlayLayers = {
69001                     streetside: 'Bing Streetside',
69002                     mapillary: 'Mapillary Images',
69003                     'mapillary-signs': 'Mapillary Signs',
69004                     openstreetcam: 'OpenStreetCam Images'
69005                 };
69006
69007                 for (var layerID in photoOverlayLayers) {
69008                     var layer = context.layers().layer(layerID);
69009                     if (layer && layer.enabled()) {
69010                         photoOverlaysUsed.push(layerID);
69011                         imageryUsed.push(photoOverlayLayers[layerID]);
69012                     }
69013                 }
69014
69015                 context.history().photoOverlaysUsed(photoOverlaysUsed);
69016                 context.history().imageryUsed(imageryUsed);
69017             };
69018
69019
69020             background.sources = function(extent) {
69021                 if (!data.imagery || !data.imagery.query) return [];   // called before init()?
69022
69023                 var matchIDs = {};
69024                 var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
69025                 matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
69026
69027                 return _backgroundSources.filter(function(source) {
69028                     return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
69029                 });
69030             };
69031
69032
69033             background.dimensions = function(d) {
69034                 if (!d) return;
69035                 baseLayer.dimensions(d);
69036
69037                 _overlayLayers.forEach(function(layer) {
69038                     layer.dimensions(d);
69039                 });
69040             };
69041
69042
69043             background.baseLayerSource = function(d) {
69044                 if (!arguments.length) return baseLayer.source();
69045
69046                 // test source against OSM imagery blacklists..
69047                 var osm = context.connection();
69048                 if (!osm) return background;
69049
69050                 var blacklists = context.connection().imageryBlacklists();
69051                 var template = d.template();
69052                 var fail = false;
69053                 var tested = 0;
69054                 var regex;
69055
69056                 for (var i = 0; i < blacklists.length; i++) {
69057                     try {
69058                         regex = new RegExp(blacklists[i]);
69059                         fail = regex.test(template);
69060                         tested++;
69061                         if (fail) break;
69062                     } catch (e) {
69063                         /* noop */
69064                     }
69065                 }
69066
69067                 // ensure at least one test was run.
69068                 if (!tested) {
69069                     regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
69070                     fail = regex.test(template);
69071                 }
69072
69073                 baseLayer.source(!fail ? d : background.findSource('none'));
69074                 dispatch$1.call('change');
69075                 background.updateImagery();
69076                 return background;
69077             };
69078
69079
69080             background.findSource = function(id) {
69081                 return _backgroundSources.find(function(d) {
69082                     return d.id && d.id === id;
69083                 });
69084             };
69085
69086
69087             background.bing = function() {
69088                 background.baseLayerSource(background.findSource('Bing'));
69089             };
69090
69091
69092             background.showsLayer = function(d) {
69093                 return d.id === baseLayer.source().id ||
69094                     _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
69095             };
69096
69097
69098             background.overlayLayerSources = function() {
69099                 return _overlayLayers.map(function (l) { return l.source(); });
69100             };
69101
69102
69103             background.toggleOverlayLayer = function(d) {
69104                 var layer;
69105                 for (var i = 0; i < _overlayLayers.length; i++) {
69106                     layer = _overlayLayers[i];
69107                     if (layer.source() === d) {
69108                         _overlayLayers.splice(i, 1);
69109                         dispatch$1.call('change');
69110                         background.updateImagery();
69111                         return;
69112                     }
69113                 }
69114
69115                 layer = rendererTileLayer(context)
69116                     .source(d)
69117                     .projection(context.projection)
69118                     .dimensions(baseLayer.dimensions()
69119                 );
69120
69121                 _overlayLayers.push(layer);
69122                 dispatch$1.call('change');
69123                 background.updateImagery();
69124             };
69125
69126
69127             background.nudge = function(d, zoom) {
69128                 baseLayer.source().nudge(d, zoom);
69129                 dispatch$1.call('change');
69130                 background.updateImagery();
69131                 return background;
69132             };
69133
69134
69135             background.offset = function(d) {
69136                 if (!arguments.length) return baseLayer.source().offset();
69137                 baseLayer.source().offset(d);
69138                 dispatch$1.call('change');
69139                 background.updateImagery();
69140                 return background;
69141             };
69142
69143
69144             background.brightness = function(d) {
69145                 if (!arguments.length) return _brightness;
69146                 _brightness = d;
69147                 if (context.mode()) dispatch$1.call('change');
69148                 return background;
69149             };
69150
69151
69152             background.contrast = function(d) {
69153                 if (!arguments.length) return _contrast;
69154                 _contrast = d;
69155                 if (context.mode()) dispatch$1.call('change');
69156                 return background;
69157             };
69158
69159
69160             background.saturation = function(d) {
69161                 if (!arguments.length) return _saturation;
69162                 _saturation = d;
69163                 if (context.mode()) dispatch$1.call('change');
69164                 return background;
69165             };
69166
69167
69168             background.sharpness = function(d) {
69169                 if (!arguments.length) return _sharpness;
69170                 _sharpness = d;
69171                 if (context.mode()) dispatch$1.call('change');
69172                 return background;
69173             };
69174
69175
69176             background.init = function() {
69177                 function parseMap(qmap) {
69178                     if (!qmap) return false;
69179                     var args = qmap.split('/').map(Number);
69180                     if (args.length < 3 || args.some(isNaN)) return false;
69181                     return geoExtent([args[2], args[1]]);
69182                 }
69183
69184                 var q = utilStringQs(window.location.hash.substring(1));
69185                 var requested = q.background || q.layer;
69186                 var extent = parseMap(q.map);
69187                 var first;
69188                 var best;
69189
69190
69191                 data.imagery = data.imagery || [];
69192                 data.imagery.features = {};
69193
69194                 // build efficient index and querying for data.imagery
69195                 var features = data.imagery.map(function(source) {
69196                     if (!source.polygon) return null;
69197
69198                     // Add an extra array nest to each element in `source.polygon`
69199                     // so the rings are not treated as a bunch of holes:
69200                     // what we have: [ [[outer],[hole],[hole]] ]
69201                     // what we want: [ [[outer]],[[outer]],[[outer]] ]
69202                     var rings = source.polygon.map(function(ring) { return [ring]; });
69203
69204                     var feature = {
69205                         type: 'Feature',
69206                         properties: { id: source.id },
69207                         geometry: { type: 'MultiPolygon', coordinates: rings }
69208                     };
69209
69210                     data.imagery.features[source.id] = feature;
69211                     return feature;
69212
69213                 }).filter(Boolean);
69214
69215                 data.imagery.query = whichPolygon_1({
69216                     type: 'FeatureCollection',
69217                     features: features
69218                 });
69219
69220
69221                 // Add all the available imagery sources
69222                 _backgroundSources = data.imagery.map(function(source) {
69223                     if (source.type === 'bing') {
69224                         return rendererBackgroundSource.Bing(source, dispatch$1);
69225                     } else if (/^EsriWorldImagery/.test(source.id)) {
69226                         return rendererBackgroundSource.Esri(source);
69227                     } else {
69228                         return rendererBackgroundSource(source);
69229                     }
69230                 });
69231
69232                 first = _backgroundSources.length && _backgroundSources[0];
69233
69234                 // Add 'None'
69235                 _backgroundSources.unshift(rendererBackgroundSource.None());
69236
69237                 // Add 'Custom'
69238                 var template = context.storage('background-custom-template') || '';
69239                 var custom = rendererBackgroundSource.Custom(template);
69240                 _backgroundSources.unshift(custom);
69241
69242
69243                 // Decide which background layer to display
69244                 if (!requested && extent) {
69245                     best = this.sources(extent).find(function(s) { return s.best(); });
69246                 }
69247                 if (requested && requested.indexOf('custom:') === 0) {
69248                     template = requested.replace(/^custom:/, '');
69249                     background.baseLayerSource(custom.template(template));
69250                     context.storage('background-custom-template', template);
69251                 } else {
69252                     background.baseLayerSource(
69253                         background.findSource(requested) ||
69254                         best ||
69255                         background.findSource(context.storage('background-last-used')) ||
69256                         background.findSource('Bing') ||
69257                         first ||
69258                         background.findSource('none')
69259                     );
69260                 }
69261
69262                 var locator = _backgroundSources.find(function(d) {
69263                     return d.overlay && d.default;
69264                 });
69265
69266                 if (locator) {
69267                     background.toggleOverlayLayer(locator);
69268                 }
69269
69270                 var overlays = (q.overlays || '').split(',');
69271                 overlays.forEach(function(overlay) {
69272                     overlay = background.findSource(overlay);
69273                     if (overlay) {
69274                         background.toggleOverlayLayer(overlay);
69275                     }
69276                 });
69277
69278                 if (q.gpx) {
69279                     var gpx = context.layers().layer('data');
69280                     if (gpx) {
69281                         gpx.url(q.gpx, '.gpx');
69282                     }
69283                 }
69284
69285                 if (q.offset) {
69286                     var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
69287                         return !isNaN(n) && n;
69288                     });
69289
69290                     if (offset.length === 2) {
69291                         background.offset(geoMetersToOffset(offset));
69292                     }
69293                 }
69294             };
69295
69296
69297             return utilRebind(background, dispatch$1, 'on');
69298         }
69299
69300         function rendererFeatures(context) {
69301             var dispatch$1 = dispatch('change', 'redraw');
69302             var features = utilRebind({}, dispatch$1, 'on');
69303             var _deferred = new Set();
69304
69305             var traffic_roads = {
69306                 'motorway': true,
69307                 'motorway_link': true,
69308                 'trunk': true,
69309                 'trunk_link': true,
69310                 'primary': true,
69311                 'primary_link': true,
69312                 'secondary': true,
69313                 'secondary_link': true,
69314                 'tertiary': true,
69315                 'tertiary_link': true,
69316                 'residential': true,
69317                 'unclassified': true,
69318                 'living_street': true
69319             };
69320
69321             var service_roads = {
69322                 'service': true,
69323                 'road': true,
69324                 'track': true
69325             };
69326
69327             var paths = {
69328                 'path': true,
69329                 'footway': true,
69330                 'cycleway': true,
69331                 'bridleway': true,
69332                 'steps': true,
69333                 'pedestrian': true,
69334                 'corridor': true
69335             };
69336
69337             var past_futures = {
69338                 'proposed': true,
69339                 'construction': true,
69340                 'abandoned': true,
69341                 'dismantled': true,
69342                 'disused': true,
69343                 'razed': true,
69344                 'demolished': true,
69345                 'obliterated': true
69346             };
69347
69348             var _cullFactor = 1;
69349             var _cache = {};
69350             var _rules = {};
69351             var _stats = {};
69352             var _keys = [];
69353             var _hidden = [];
69354             var _forceVisible = {};
69355
69356
69357             function update() {
69358                 if (!window.mocha) {
69359                     var q = utilStringQs(window.location.hash.substring(1));
69360                     var disabled = features.disabled();
69361                     if (disabled.length) {
69362                         q.disable_features = disabled.join(',');
69363                     } else {
69364                         delete q.disable_features;
69365                     }
69366                     window.location.replace('#' + utilQsString(q, true));
69367                     context.storage('disabled-features', disabled.join(','));
69368                 }
69369                 _hidden = features.hidden();
69370                 dispatch$1.call('change');
69371                 dispatch$1.call('redraw');
69372             }
69373
69374
69375             function defineRule(k, filter, max) {
69376                 var isEnabled = true;
69377
69378                 _keys.push(k);
69379                 _rules[k] = {
69380                     filter: filter,
69381                     enabled: isEnabled,   // whether the user wants it enabled..
69382                     count: 0,
69383                     currentMax: (max || Infinity),
69384                     defaultMax: (max || Infinity),
69385                     enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
69386                     disable: function() { this.enabled = false; this.currentMax = 0; },
69387                     hidden: function() {
69388                         return !context.editable() ||
69389                             (this.count === 0 && !this.enabled) ||
69390                             this.count > this.currentMax * _cullFactor;
69391                     },
69392                     autoHidden: function() { return this.hidden() && this.currentMax > 0; }
69393                 };
69394             }
69395
69396
69397             defineRule('points', function isPoint(tags, geometry) {
69398                 return geometry === 'point';
69399             }, 200);
69400
69401             defineRule('traffic_roads', function isTrafficRoad(tags) {
69402                 return traffic_roads[tags.highway];
69403             });
69404
69405             defineRule('service_roads', function isServiceRoad(tags) {
69406                 return service_roads[tags.highway];
69407             });
69408
69409             defineRule('paths', function isPath(tags) {
69410                 return paths[tags.highway];
69411             });
69412
69413             defineRule('buildings', function isBuilding(tags) {
69414                 return (
69415                     (!!tags.building && tags.building !== 'no') ||
69416                     tags.parking === 'multi-storey' ||
69417                     tags.parking === 'sheds' ||
69418                     tags.parking === 'carports' ||
69419                     tags.parking === 'garage_boxes'
69420                 );
69421             }, 250);
69422
69423             defineRule('building_parts', function isBuildingPart(tags) {
69424                 return tags['building:part'];
69425             });
69426
69427             defineRule('indoor', function isIndoor(tags) {
69428                 return tags.indoor;
69429             });
69430
69431             defineRule('landuse', function isLanduse(tags, geometry) {
69432                 return geometry === 'area' &&
69433                     !_rules.buildings.filter(tags) &&
69434                     !_rules.building_parts.filter(tags) &&
69435                     !_rules.indoor.filter(tags) &&
69436                     !_rules.water.filter(tags) &&
69437                     !_rules.pistes.filter(tags);
69438             });
69439
69440             defineRule('boundaries', function isBoundary(tags) {
69441                 return (
69442                     !!tags.boundary
69443                 ) && !(
69444                     traffic_roads[tags.highway] ||
69445                     service_roads[tags.highway] ||
69446                     paths[tags.highway] ||
69447                     tags.waterway ||
69448                     tags.railway ||
69449                     tags.landuse ||
69450                     tags.natural ||
69451                     tags.building ||
69452                     tags.power
69453                 );
69454             });
69455
69456             defineRule('water', function isWater(tags) {
69457                 return (
69458                     !!tags.waterway ||
69459                     tags.natural === 'water' ||
69460                     tags.natural === 'coastline' ||
69461                     tags.natural === 'bay' ||
69462                     tags.landuse === 'pond' ||
69463                     tags.landuse === 'basin' ||
69464                     tags.landuse === 'reservoir' ||
69465                     tags.landuse === 'salt_pond'
69466                 );
69467             });
69468
69469             defineRule('rail', function isRail(tags) {
69470                 return (
69471                     !!tags.railway ||
69472                     tags.landuse === 'railway'
69473                 ) && !(
69474                     traffic_roads[tags.highway] ||
69475                     service_roads[tags.highway] ||
69476                     paths[tags.highway]
69477                 );
69478             });
69479
69480             defineRule('pistes', function isPiste(tags) {
69481                 return tags['piste:type'];
69482             });
69483
69484             defineRule('aerialways', function isPiste(tags) {
69485                 return tags.aerialway &&
69486                     tags.aerialway !== 'yes' &&
69487                     tags.aerialway !== 'station';
69488             });
69489
69490             defineRule('power', function isPower(tags) {
69491                 return !!tags.power;
69492             });
69493
69494             // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
69495             defineRule('past_future', function isPastFuture(tags) {
69496                 if (
69497                     traffic_roads[tags.highway] ||
69498                     service_roads[tags.highway] ||
69499                     paths[tags.highway]
69500                 ) { return false; }
69501
69502                 var strings = Object.keys(tags);
69503
69504                 for (var i = 0; i < strings.length; i++) {
69505                     var s = strings[i];
69506                     if (past_futures[s] || past_futures[tags[s]]) { return true; }
69507                 }
69508                 return false;
69509             });
69510
69511             // Lines or areas that don't match another feature filter.
69512             // IMPORTANT: The 'others' feature must be the last one defined,
69513             //   so that code in getMatches can skip this test if `hasMatch = true`
69514             defineRule('others', function isOther(tags, geometry) {
69515                 return (geometry === 'line' || geometry === 'area');
69516             });
69517
69518
69519
69520             features.features = function() {
69521                 return _rules;
69522             };
69523
69524
69525             features.keys = function() {
69526                 return _keys;
69527             };
69528
69529
69530             features.enabled = function(k) {
69531                 if (!arguments.length) {
69532                     return _keys.filter(function(k) { return _rules[k].enabled; });
69533                 }
69534                 return _rules[k] && _rules[k].enabled;
69535             };
69536
69537
69538             features.disabled = function(k) {
69539                 if (!arguments.length) {
69540                     return _keys.filter(function(k) { return !_rules[k].enabled; });
69541                 }
69542                 return _rules[k] && !_rules[k].enabled;
69543             };
69544
69545
69546             features.hidden = function(k) {
69547                 if (!arguments.length) {
69548                     return _keys.filter(function(k) { return _rules[k].hidden(); });
69549                 }
69550                 return _rules[k] && _rules[k].hidden();
69551             };
69552
69553
69554             features.autoHidden = function(k) {
69555                 if (!arguments.length) {
69556                     return _keys.filter(function(k) { return _rules[k].autoHidden(); });
69557                 }
69558                 return _rules[k] && _rules[k].autoHidden();
69559             };
69560
69561
69562             features.enable = function(k) {
69563                 if (_rules[k] && !_rules[k].enabled) {
69564                     _rules[k].enable();
69565                     update();
69566                 }
69567             };
69568
69569             features.enableAll = function() {
69570                 var didEnable = false;
69571                 for (var k in _rules) {
69572                     if (!_rules[k].enabled) {
69573                         didEnable = true;
69574                         _rules[k].enable();
69575                     }
69576                 }
69577                 if (didEnable) update();
69578             };
69579
69580
69581             features.disable = function(k) {
69582                 if (_rules[k] && _rules[k].enabled) {
69583                     _rules[k].disable();
69584                     update();
69585                 }
69586             };
69587
69588             features.disableAll = function() {
69589                 var didDisable = false;
69590                 for (var k in _rules) {
69591                     if (_rules[k].enabled) {
69592                         didDisable = true;
69593                         _rules[k].disable();
69594                     }
69595                 }
69596                 if (didDisable) update();
69597             };
69598
69599
69600             features.toggle = function(k) {
69601                 if (_rules[k]) {
69602                     (function(f) { return f.enabled ? f.disable() : f.enable(); }(_rules[k]));
69603                     update();
69604                 }
69605             };
69606
69607
69608             features.resetStats = function() {
69609                 for (var i = 0; i < _keys.length; i++) {
69610                     _rules[_keys[i]].count = 0;
69611                 }
69612                 dispatch$1.call('change');
69613             };
69614
69615
69616             features.gatherStats = function(d, resolver, dimensions) {
69617                 var needsRedraw = false;
69618                 var types = utilArrayGroupBy(d, 'type');
69619                 var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69620                 var currHidden, geometry, matches, i, j;
69621
69622                 for (i = 0; i < _keys.length; i++) {
69623                     _rules[_keys[i]].count = 0;
69624                 }
69625
69626                 // adjust the threshold for point/building culling based on viewport size..
69627                 // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
69628                 _cullFactor = dimensions[0] * dimensions[1] / 1000000;
69629
69630                 for (i = 0; i < entities.length; i++) {
69631                     geometry = entities[i].geometry(resolver);
69632                     matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
69633                     for (j = 0; j < matches.length; j++) {
69634                         _rules[matches[j]].count++;
69635                     }
69636                 }
69637
69638                 currHidden = features.hidden();
69639                 if (currHidden !== _hidden) {
69640                     _hidden = currHidden;
69641                     needsRedraw = true;
69642                     dispatch$1.call('change');
69643                 }
69644
69645                 return needsRedraw;
69646             };
69647
69648
69649             features.stats = function() {
69650                 for (var i = 0; i < _keys.length; i++) {
69651                     _stats[_keys[i]] = _rules[_keys[i]].count;
69652                 }
69653
69654                 return _stats;
69655             };
69656
69657
69658             features.clear = function(d) {
69659                 for (var i = 0; i < d.length; i++) {
69660                     features.clearEntity(d[i]);
69661                 }
69662             };
69663
69664
69665             features.clearEntity = function(entity) {
69666                 delete _cache[osmEntity.key(entity)];
69667             };
69668
69669
69670             features.reset = function() {
69671                 Array.from(_deferred).forEach(function(handle) {
69672                     window.cancelIdleCallback(handle);
69673                     _deferred.delete(handle);
69674                 });
69675
69676                 _cache = {};
69677             };
69678
69679             // only certain relations are worth checking
69680             function relationShouldBeChecked(relation) {
69681                 // multipolygon features have `area` geometry and aren't checked here
69682                 return relation.tags.type === 'boundary';
69683             }
69684
69685             features.getMatches = function(entity, resolver, geometry) {
69686                 if (geometry === 'vertex' ||
69687                     (geometry === 'relation' && !relationShouldBeChecked(entity))) return {};
69688
69689                 var ent = osmEntity.key(entity);
69690                 if (!_cache[ent]) {
69691                     _cache[ent] = {};
69692                 }
69693
69694                 if (!_cache[ent].matches) {
69695                     var matches = {};
69696                     var hasMatch = false;
69697
69698                     for (var i = 0; i < _keys.length; i++) {
69699                         if (_keys[i] === 'others') {
69700                             if (hasMatch) continue;
69701
69702                             // If an entity...
69703                             //   1. is a way that hasn't matched other 'interesting' feature rules,
69704                             if (entity.type === 'way') {
69705                                 var parents = features.getParents(entity, resolver, geometry);
69706
69707                                 //   2a. belongs only to a single multipolygon relation
69708                                 if ((parents.length === 1 && parents[0].isMultipolygon()) ||
69709                                     // 2b. or belongs only to boundary relations
69710                                     (parents.length > 0 && parents.every(function(parent) { return parent.tags.type === 'boundary'; }))) {
69711
69712                                     // ...then match whatever feature rules the parent relation has matched.
69713                                     // see #2548, #2887
69714                                     //
69715                                     // IMPORTANT:
69716                                     // For this to work, getMatches must be called on relations before ways.
69717                                     //
69718                                     var pkey = osmEntity.key(parents[0]);
69719                                     if (_cache[pkey] && _cache[pkey].matches) {
69720                                         matches = Object.assign({}, _cache[pkey].matches);  // shallow copy
69721                                         continue;
69722                                     }
69723                                 }
69724                             }
69725                         }
69726
69727                         if (_rules[_keys[i]].filter(entity.tags, geometry)) {
69728                             matches[_keys[i]] = hasMatch = true;
69729                         }
69730                     }
69731                     _cache[ent].matches = matches;
69732                 }
69733
69734                 return _cache[ent].matches;
69735             };
69736
69737
69738             features.getParents = function(entity, resolver, geometry) {
69739                 if (geometry === 'point') return [];
69740
69741                 var ent = osmEntity.key(entity);
69742                 if (!_cache[ent]) {
69743                     _cache[ent] = {};
69744                 }
69745
69746                 if (!_cache[ent].parents) {
69747                     var parents = [];
69748                     if (geometry === 'vertex') {
69749                         parents = resolver.parentWays(entity);
69750                     } else {   // 'line', 'area', 'relation'
69751                         parents = resolver.parentRelations(entity);
69752                     }
69753                     _cache[ent].parents = parents;
69754                 }
69755                 return _cache[ent].parents;
69756             };
69757
69758
69759             features.isHiddenPreset = function(preset, geometry) {
69760                 if (!_hidden.length) return false;
69761                 if (!preset.tags) return false;
69762
69763                 var test = preset.setTags({}, geometry);
69764                 for (var key in _rules) {
69765                     if (_rules[key].filter(test, geometry)) {
69766                         if (_hidden.indexOf(key) !== -1) {
69767                             return key;
69768                         }
69769                         return false;
69770                     }
69771                 }
69772                 return false;
69773             };
69774
69775
69776             features.isHiddenFeature = function(entity, resolver, geometry) {
69777                 if (!_hidden.length) return false;
69778                 if (!entity.version) return false;
69779                 if (_forceVisible[entity.id]) return false;
69780
69781                 var matches = Object.keys(features.getMatches(entity, resolver, geometry));
69782                 return matches.length && matches.every(function(k) { return features.hidden(k); });
69783             };
69784
69785
69786             features.isHiddenChild = function(entity, resolver, geometry) {
69787                 if (!_hidden.length) return false;
69788                 if (!entity.version || geometry === 'point') return false;
69789                 if (_forceVisible[entity.id]) return false;
69790
69791                 var parents = features.getParents(entity, resolver, geometry);
69792                 if (!parents.length) return false;
69793
69794                 for (var i = 0; i < parents.length; i++) {
69795                     if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
69796                         return false;
69797                     }
69798                 }
69799                 return true;
69800             };
69801
69802
69803             features.hasHiddenConnections = function(entity, resolver) {
69804                 if (!_hidden.length) return false;
69805
69806                 var childNodes, connections;
69807                 if (entity.type === 'midpoint') {
69808                     childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
69809                     connections = [];
69810                 } else {
69811                     childNodes = entity.nodes ? resolver.childNodes(entity) : [];
69812                     connections = features.getParents(entity, resolver, entity.geometry(resolver));
69813                 }
69814
69815                 // gather ways connected to child nodes..
69816                 connections = childNodes.reduce(function(result, e) {
69817                     return resolver.isShared(e) ? utilArrayUnion(result, resolver.parentWays(e)) : result;
69818                 }, connections);
69819
69820                 return connections.some(function(e) {
69821                     return features.isHidden(e, resolver, e.geometry(resolver));
69822                 });
69823             };
69824
69825
69826             features.isHidden = function(entity, resolver, geometry) {
69827                 if (!_hidden.length) return false;
69828                 if (!entity.version) return false;
69829
69830                 var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
69831                 return fn(entity, resolver, geometry);
69832             };
69833
69834
69835             features.filter = function(d, resolver) {
69836                 if (!_hidden.length) return d;
69837
69838                 var result = [];
69839                 for (var i = 0; i < d.length; i++) {
69840                     var entity = d[i];
69841                     if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
69842                         result.push(entity);
69843                     }
69844                 }
69845                 return result;
69846             };
69847
69848
69849             features.forceVisible = function(entityIDs) {
69850                 if (!arguments.length) return Object.keys(_forceVisible);
69851
69852                 _forceVisible = {};
69853                 for (var i = 0; i < entityIDs.length; i++) {
69854                     _forceVisible[entityIDs[i]] = true;
69855                     var entity = context.hasEntity(entityIDs[i]);
69856                     if (entity && entity.type === 'relation') {
69857                         // also show relation members (one level deep)
69858                         for (var j in entity.members) {
69859                             _forceVisible[entity.members[j].id] = true;
69860                         }
69861                     }
69862                 }
69863                 return features;
69864             };
69865
69866
69867             features.init = function() {
69868                 var storage = context.storage('disabled-features');
69869                 if (storage) {
69870                     var storageDisabled = storage.replace(/;/g, ',').split(',');
69871                     storageDisabled.forEach(features.disable);
69872                 }
69873
69874                 var q = utilStringQs(window.location.hash.substring(1));
69875                 if (q.disable_features) {
69876                     var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
69877                     hashDisabled.forEach(features.disable);
69878                 }
69879             };
69880
69881
69882             // warm up the feature matching cache upon merging fetched data
69883             context.history().on('merge.features', function(newEntities) {
69884                 if (!newEntities) return;
69885                 var handle = window.requestIdleCallback(function() {
69886                     var graph = context.graph();
69887                     var types = utilArrayGroupBy(newEntities, 'type');
69888                     // ensure that getMatches is called on relations before ways
69889                     var entities = [].concat(types.relation || [], types.way || [], types.node || []);
69890                     for (var i = 0; i < entities.length; i++) {
69891                         var geometry = entities[i].geometry(graph);
69892                         features.getMatches(entities[i], graph, geometry);
69893                     }
69894                 });
69895                 _deferred.add(handle);
69896             });
69897
69898
69899             return features;
69900         }
69901
69902         // Touch targets control which other vertices we can drag a vertex onto.
69903         //
69904         // - the activeID - nope
69905         // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
69906         // - 2 away from the activeID - nope (would create a self intersecting segment)
69907         // - all others on a linear way - yes
69908         // - all others on a closed way - nope (would create a self intersecting polygon)
69909         //
69910         // returns
69911         // 0 = active vertex - no touch/connect
69912         // 1 = passive vertex - yes touch/connect
69913         // 2 = adjacent vertex - yes but pay attention segmenting a line here
69914         //
69915         function svgPassiveVertex(node, graph, activeID) {
69916             if (!activeID) return 1;
69917             if (activeID === node.id) return 0;
69918
69919             var parents = graph.parentWays(node);
69920
69921             for (var i = 0; i < parents.length; i++) {
69922                 var nodes = parents[i].nodes;
69923                 var isClosed = parents[i].isClosed();
69924                 for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
69925                     if (nodes[j] === node.id) {
69926                         var ix1 = j - 2;
69927                         var ix2 = j - 1;
69928                         var ix3 = j + 1;
69929                         var ix4 = j + 2;
69930
69931                         if (isClosed) {  // wraparound if needed
69932                             var max = nodes.length - 1;
69933                             if (ix1 < 0)   ix1 = max + ix1;
69934                             if (ix2 < 0)   ix2 = max + ix2;
69935                             if (ix3 > max) ix3 = ix3 - max;
69936                             if (ix4 > max) ix4 = ix4 - max;
69937                         }
69938
69939                         if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
69940                         else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
69941                         else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
69942                         else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
69943                         else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
69944                     }
69945                 }
69946             }
69947
69948             return 1;   // ok
69949         }
69950
69951
69952         function svgMarkerSegments(projection, graph, dt,
69953                                           shouldReverse,
69954                                           bothDirections) {
69955             return function(entity) {
69956                 var i = 0;
69957                 var offset = dt;
69958                 var segments = [];
69959                 var clip = d3_geoIdentity().clipExtent(projection.clipExtent()).stream;
69960                 var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
69961                 var a, b;
69962
69963                 if (shouldReverse(entity)) {
69964                     coordinates.reverse();
69965                 }
69966
69967                 d3_geoStream({
69968                     type: 'LineString',
69969                     coordinates: coordinates
69970                 }, projection.stream(clip({
69971                     lineStart: function() {},
69972                     lineEnd: function() { a = null; },
69973                     point: function(x, y) {
69974                         b = [x, y];
69975
69976                         if (a) {
69977                             var span = geoVecLength(a, b) - offset;
69978
69979                             if (span >= 0) {
69980                                 var heading = geoVecAngle(a, b);
69981                                 var dx = dt * Math.cos(heading);
69982                                 var dy = dt * Math.sin(heading);
69983                                 var p = [
69984                                     a[0] + offset * Math.cos(heading),
69985                                     a[1] + offset * Math.sin(heading)
69986                                 ];
69987
69988                                 // gather coordinates
69989                                 var coord = [a, p];
69990                                 for (span -= dt; span >= 0; span -= dt) {
69991                                     p = geoVecAdd(p, [dx, dy]);
69992                                     coord.push(p);
69993                                 }
69994                                 coord.push(b);
69995
69996                                 // generate svg paths
69997                                 var segment = '';
69998                                 var j;
69999
70000                                 for (j = 0; j < coord.length; j++) {
70001                                     segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70002                                 }
70003                                 segments.push({ id: entity.id, index: i++, d: segment });
70004
70005                                 if (bothDirections(entity)) {
70006                                     segment = '';
70007                                     for (j = coord.length - 1; j >= 0; j--) {
70008                                         segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
70009                                     }
70010                                     segments.push({ id: entity.id, index: i++, d: segment });
70011                                 }
70012                             }
70013
70014                             offset = -span;
70015                         }
70016
70017                         a = b;
70018                     }
70019                 })));
70020
70021                 return segments;
70022             };
70023         }
70024
70025
70026         function svgPath(projection, graph, isArea) {
70027
70028             // Explanation of magic numbers:
70029             // "padding" here allows space for strokes to extend beyond the viewport,
70030             // so that the stroke isn't drawn along the edge of the viewport when
70031             // the shape is clipped.
70032             //
70033             // When drawing lines, pad viewport by 5px.
70034             // When drawing areas, pad viewport by 65px in each direction to allow
70035             // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
70036
70037             var cache = {};
70038             var padding = isArea ? 65 : 5;
70039             var viewport = projection.clipExtent();
70040             var paddedExtent = [
70041                 [viewport[0][0] - padding, viewport[0][1] - padding],
70042                 [viewport[1][0] + padding, viewport[1][1] + padding]
70043             ];
70044             var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
70045             var project = projection.stream;
70046             var path = d3_geoPath()
70047                 .projection({stream: function(output) { return project(clip(output)); }});
70048
70049             var svgpath = function(entity) {
70050                 if (entity.id in cache) {
70051                     return cache[entity.id];
70052                 } else {
70053                     return cache[entity.id] = path(entity.asGeoJSON(graph));
70054                 }
70055             };
70056
70057             svgpath.geojson = function(d) {
70058                 if (d.__featurehash__ !== undefined) {
70059                     if (d.__featurehash__ in cache) {
70060                         return cache[d.__featurehash__];
70061                     } else {
70062                         return cache[d.__featurehash__] = path(d);
70063                     }
70064                 } else {
70065                     return path(d);
70066                 }
70067             };
70068
70069             return svgpath;
70070         }
70071
70072
70073         function svgPointTransform(projection) {
70074             var svgpoint = function(entity) {
70075                 // http://jsperf.com/short-array-join
70076                 var pt = projection(entity.loc);
70077                 return 'translate(' + pt[0] + ',' + pt[1] + ')';
70078             };
70079
70080             svgpoint.geojson = function(d) {
70081                 return svgpoint(d.properties.entity);
70082             };
70083
70084             return svgpoint;
70085         }
70086
70087
70088         function svgRelationMemberTags(graph) {
70089             return function(entity) {
70090                 var tags = entity.tags;
70091                 var shouldCopyMultipolygonTags = !entity.hasInterestingTags();
70092                 graph.parentRelations(entity).forEach(function(relation) {
70093                     var type = relation.tags.type;
70094                     if ((type === 'multipolygon' && shouldCopyMultipolygonTags) || type === 'boundary') {
70095                         tags = Object.assign({}, relation.tags, tags);
70096                     }
70097                 });
70098                 return tags;
70099             };
70100         }
70101
70102
70103         function svgSegmentWay(way, graph, activeID) {
70104             // When there is no activeID, we can memoize this expensive computation
70105             if (activeID === undefined) {
70106                 return graph.transient(way, 'waySegments', getWaySegments);
70107             } else {
70108                 return getWaySegments();
70109             }
70110
70111             function getWaySegments() {
70112                 var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
70113                 var features = { passive: [], active: [] };
70114                 var start = {};
70115                 var end = {};
70116                 var node, type;
70117
70118                 for (var i = 0; i < way.nodes.length; i++) {
70119                     node = graph.entity(way.nodes[i]);
70120                     type = svgPassiveVertex(node, graph, activeID);
70121                     end = { node: node, type: type };
70122
70123                     if (start.type !== undefined) {
70124                         if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
70125                             pushActive(start, end, i);
70126                         } else if (start.type === 0 && end.type === 0) {   // both active vertices
70127                             pushActive(start, end, i);
70128                         } else {
70129                             pushPassive(start, end, i);
70130                         }
70131                     }
70132
70133                     start = end;
70134                 }
70135
70136                 return features;
70137
70138                 function pushActive(start, end, index) {
70139                     features.active.push({
70140                         type: 'Feature',
70141                         id: way.id + '-' + index + '-nope',
70142                         properties: {
70143                             nope: true,
70144                             target: true,
70145                             entity: way,
70146                             nodes: [start.node, end.node],
70147                             index: index
70148                         },
70149                         geometry: {
70150                             type: 'LineString',
70151                             coordinates: [start.node.loc, end.node.loc]
70152                         }
70153                     });
70154                 }
70155
70156                 function pushPassive(start, end, index) {
70157                     features.passive.push({
70158                         type: 'Feature',
70159                         id: way.id + '-' + index,
70160                         properties: {
70161                             target: true,
70162                             entity: way,
70163                             nodes: [start.node, end.node],
70164                             index: index
70165                         },
70166                         geometry: {
70167                             type: 'LineString',
70168                             coordinates: [start.node.loc, end.node.loc]
70169                         }
70170                     });
70171                 }
70172             }
70173         }
70174
70175         function svgTagClasses() {
70176             var primaries = [
70177                 'building', 'highway', 'railway', 'waterway', 'aeroway', 'aerialway',
70178                 'piste:type', 'boundary', 'power', 'amenity', 'natural', 'landuse',
70179                 'leisure', 'military', 'place', 'man_made', 'route', 'attraction',
70180                 'building:part', 'indoor'
70181             ];
70182             var statuses = [
70183                 'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
70184                 'razed', 'demolished', 'obliterated', 'intermittent'
70185             ];
70186             var secondaries = [
70187                 'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
70188                 'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
70189                 'public_transport', 'location', 'parking', 'golf', 'type', 'leisure',
70190                 'man_made', 'indoor'
70191             ];
70192             var _tags = function(entity) { return entity.tags; };
70193
70194
70195             var tagClasses = function(selection) {
70196                 selection.each(function tagClassesEach(entity) {
70197                     var value = this.className;
70198
70199                     if (value.baseVal !== undefined) {
70200                         value = value.baseVal;
70201                     }
70202
70203                     var t = _tags(entity);
70204
70205                     var computed = tagClasses.getClassesString(t, value, entity);
70206
70207                     if (computed !== value) {
70208                         d3_select(this).attr('class', computed);
70209                     }
70210                 });
70211             };
70212
70213
70214             tagClasses.getClassesString = function(t, value, entity) {
70215                 var primary, status;
70216                 var i, k, v;
70217
70218                 // in some situations we want to render perimeter strokes a certain way
70219                 var overrideGeometry;
70220                 if (/\bstroke\b/.test(value)) {
70221                     if (!!t.barrier && t.barrier !== 'no') {
70222                         overrideGeometry = 'line';
70223                     } else if (t.type === 'multipolygon' && !entity.hasInterestingTags()) {
70224                         overrideGeometry = 'area';
70225                     }
70226                 }
70227
70228                 // preserve base classes (nothing with `tag-`)
70229                 var classes = value.trim().split(/\s+/)
70230                     .filter(function(klass) {
70231                         return klass.length && !/^tag-/.test(klass);
70232                     })
70233                     .map(function(klass) {  // special overrides for some perimeter strokes
70234                         return (klass === 'line' || klass === 'area') ? (overrideGeometry || klass) : klass;
70235                     });
70236
70237                 // pick at most one primary classification tag..
70238                 for (i = 0; i < primaries.length; i++) {
70239                     k = primaries[i];
70240                     v = t[k];
70241                     if (!v || v === 'no') continue;
70242
70243                     if (k === 'piste:type') {  // avoid a ':' in the class name
70244                         k = 'piste';
70245                     } else if (k === 'building:part') {  // avoid a ':' in the class name
70246                         k = 'building_part';
70247                     }
70248
70249                     primary = k;
70250                     if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
70251                         status = v;
70252                         classes.push('tag-' + k);
70253                     } else {
70254                         classes.push('tag-' + k);
70255                         classes.push('tag-' + k + '-' + v);
70256                     }
70257
70258                     break;
70259                 }
70260
70261                 // add at most one status tag, only if relates to primary tag..
70262                 if (!status) {
70263                     for (i = 0; i < statuses.length; i++) {
70264                         k = statuses[i];
70265                         v = t[k];
70266                         if (!v || v === 'no') continue;
70267
70268                         if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
70269                             status = k;
70270                         }
70271                         else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
70272                             status = k;
70273                         } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
70274                             status = k;
70275                             primary = v;
70276                             classes.push('tag-' + v);
70277                         }  // else ignore e.g.  `highway=path + abandoned=railway`
70278
70279                         if (status) break;
70280                     }
70281                 }
70282
70283                 if (status) {
70284                     classes.push('tag-status');
70285                     classes.push('tag-status-' + status);
70286                 }
70287
70288                 // add any secondary tags
70289                 for (i = 0; i < secondaries.length; i++) {
70290                     k = secondaries[i];
70291                     v = t[k];
70292                     if (!v || v === 'no' || k === primary) continue;
70293                     classes.push('tag-' + k);
70294                     classes.push('tag-' + k + '-' + v);
70295                 }
70296
70297                 // For highways, look for surface tagging..
70298                 if (primary === 'highway' || primary === 'aeroway') {
70299                     var paved = (t.highway !== 'track');
70300                     for (k in t) {
70301                         v = t[k];
70302                         if (k in osmPavedTags) {
70303                             paved = !!osmPavedTags[k][v];
70304                             break;
70305                         }
70306                     }
70307                     if (!paved) {
70308                         classes.push('tag-unpaved');
70309                     }
70310                 }
70311
70312                 // If this is a wikidata-tagged item, add a class for that..
70313                 if (t.wikidata || t['brand:wikidata']) {
70314                     classes.push('tag-wikidata');
70315                 }
70316
70317                 return classes.join(' ').trim();
70318             };
70319
70320
70321             tagClasses.tags = function(val) {
70322                 if (!arguments.length) return _tags;
70323                 _tags = val;
70324                 return tagClasses;
70325             };
70326
70327             return tagClasses;
70328         }
70329
70330         function svgAreas(projection, context) {
70331             // Patterns only work in Firefox when set directly on element.
70332             // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
70333             var patterns = {
70334                 // tag - pattern name
70335                 // -or-
70336                 // tag - value - pattern name
70337                 // -or-
70338                 // tag - value - rules (optional tag-values, pattern name)
70339                 // (matches earlier rules first, so fallback should be last entry)
70340                 amenity: {
70341                     grave_yard: 'cemetery',
70342                     fountain: 'water_standing'
70343                 },
70344                 landuse: {
70345                     cemetery: [
70346                         { religion: 'christian', pattern: 'cemetery_christian' },
70347                         { religion: 'buddhist', pattern: 'cemetery_buddhist' },
70348                         { religion: 'muslim', pattern: 'cemetery_muslim' },
70349                         { religion: 'jewish', pattern: 'cemetery_jewish' },
70350                         { pattern: 'cemetery' }
70351                     ],
70352                     construction: 'construction',
70353                     farmland: 'farmland',
70354                     farmyard: 'farmyard',
70355                     forest: [
70356                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70357                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70358                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70359                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70360                     ],
70361                     grave_yard: 'cemetery',
70362                     grass: 'grass',
70363                     landfill: 'landfill',
70364                     meadow: 'meadow',
70365                     military: 'construction',
70366                     orchard: 'orchard',
70367                     quarry: 'quarry',
70368                     vineyard: 'vineyard'
70369                 },
70370                 natural: {
70371                     beach: 'beach',
70372                     grassland: 'grass',
70373                     sand: 'beach',
70374                     scrub: 'scrub',
70375                     water: [
70376                         { water: 'pond', pattern: 'pond' },
70377                         { water: 'reservoir', pattern: 'water_standing' },
70378                         { pattern: 'waves' }
70379                     ],
70380                     wetland: [
70381                         { wetland: 'marsh', pattern: 'wetland_marsh' },
70382                         { wetland: 'swamp', pattern: 'wetland_swamp' },
70383                         { wetland: 'bog', pattern: 'wetland_bog' },
70384                         { wetland: 'reedbed', pattern: 'wetland_reedbed' },
70385                         { pattern: 'wetland' }
70386                     ],
70387                     wood: [
70388                         { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
70389                         { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
70390                         { leaf_type: 'leafless', pattern: 'forest_leafless' },
70391                         { pattern: 'forest' } // same as 'leaf_type:mixed'
70392                     ]
70393                 },
70394                 traffic_calming: {
70395                     island: [
70396                         { surface: 'grass', pattern: 'grass' },
70397                     ],
70398                     chicane: [
70399                         { surface: 'grass', pattern: 'grass' },
70400                     ],
70401                     choker: [
70402                         { surface: 'grass', pattern: 'grass' },
70403                     ]
70404                 }
70405             };
70406
70407             function setPattern(entity) {
70408                 // Skip pattern filling if this is a building (buildings don't get patterns applied)
70409                 if (entity.tags.building && entity.tags.building !== 'no') {
70410                     this.style.fill = this.style.stroke = '';
70411                     return;
70412                 }
70413
70414                 for (var tag in patterns) {
70415                     var entityValue = entity.tags[tag];
70416                     if (!entityValue) continue;
70417
70418                     if (typeof patterns[tag] === 'string') { // extra short syntax (just tag) - pattern name
70419                         this.style.fill = this.style.stroke = 'url("#pattern-' + patterns[tag] + '")';
70420                         return;
70421                     } else {
70422                         var values = patterns[tag];
70423                         for (var value in values) {
70424                             if (entityValue !== value) continue;
70425
70426                             var rules = values[value];
70427                             if (typeof rules === 'string') { // short syntax - pattern name
70428                                 this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
70429                                 return;
70430                             } else { // long syntax - rule array
70431                                 for (var ruleKey in rules) {
70432                                     var rule = rules[ruleKey];
70433
70434                                     var pass = true;
70435                                     for (var criterion in rule) {
70436                                         if (criterion !== 'pattern') { // reserved for pattern name
70437                                             // The only rule is a required tag-value pair
70438                                             var v = entity.tags[criterion];
70439                                             if (!v || v !== rule[criterion]) {
70440                                                 pass = false;
70441                                                 break;
70442                                             }
70443                                         }
70444                                     }
70445
70446                                     if (pass) {
70447                                         this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
70448                                         return;
70449                                     }
70450                                 }
70451                             }
70452                         }
70453                     }
70454                 }
70455
70456                 this.style.fill = this.style.stroke = '';
70457             }
70458
70459
70460             function drawTargets(selection, graph, entities, filter) {
70461                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
70462                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
70463                 var getPath = svgPath(projection).geojson;
70464                 var activeID = context.activeID();
70465
70466                 // The targets and nopes will be MultiLineString sub-segments of the ways
70467                 var data = { targets: [], nopes: [] };
70468
70469                 entities.forEach(function(way) {
70470                     var features = svgSegmentWay(way, graph, activeID);
70471                     data.targets.push.apply(data.targets, features.passive);
70472                     data.nopes.push.apply(data.nopes, features.active);
70473                 });
70474
70475
70476                 // Targets allow hover and vertex snapping
70477                 var targetData = data.targets.filter(getPath);
70478                 var targets = selection.selectAll('.area.target-allowed')
70479                     .filter(function(d) { return filter(d.properties.entity); })
70480                     .data(targetData, function key(d) { return d.id; });
70481
70482                 // exit
70483                 targets.exit()
70484                     .remove();
70485
70486                 // enter/update
70487                 targets.enter()
70488                     .append('path')
70489                     .merge(targets)
70490                     .attr('d', getPath)
70491                     .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
70492
70493
70494                 // NOPE
70495                 var nopeData = data.nopes.filter(getPath);
70496                 var nopes = selection.selectAll('.area.target-nope')
70497                     .filter(function(d) { return filter(d.properties.entity); })
70498                     .data(nopeData, function key(d) { return d.id; });
70499
70500                 // exit
70501                 nopes.exit()
70502                     .remove();
70503
70504                 // enter/update
70505                 nopes.enter()
70506                     .append('path')
70507                     .merge(nopes)
70508                     .attr('d', getPath)
70509                     .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
70510             }
70511
70512
70513             function drawAreas(selection, graph, entities, filter) {
70514                 var path = svgPath(projection, graph, true);
70515                 var areas = {};
70516                 var multipolygon;
70517
70518                 for (var i = 0; i < entities.length; i++) {
70519                     var entity = entities[i];
70520                     if (entity.geometry(graph) !== 'area') continue;
70521
70522                     multipolygon = osmIsOldMultipolygonOuterMember(entity, graph);
70523                     if (multipolygon) {
70524                         areas[multipolygon.id] = {
70525                             entity: multipolygon.mergeTags(entity.tags),
70526                             area: Math.abs(entity.area(graph))
70527                         };
70528                     } else if (!areas[entity.id]) {
70529                         areas[entity.id] = {
70530                             entity: entity,
70531                             area: Math.abs(entity.area(graph))
70532                         };
70533                     }
70534                 }
70535
70536                 var fills = Object.values(areas).filter(function hasPath(a) { return path(a.entity); });
70537                 fills.sort(function areaSort(a, b) { return b.area - a.area; });
70538                 fills = fills.map(function(a) { return a.entity; });
70539
70540                 var strokes = fills.filter(function(area) { return area.type === 'way'; });
70541
70542                 var data = {
70543                     clip: fills,
70544                     shadow: strokes,
70545                     stroke: strokes,
70546                     fill: fills
70547                 };
70548
70549                 var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
70550                    .filter(filter)
70551                    .data(data.clip, osmEntity.key);
70552
70553                 clipPaths.exit()
70554                    .remove();
70555
70556                 var clipPathsEnter = clipPaths.enter()
70557                    .append('clipPath')
70558                    .attr('class', 'clipPath-osm')
70559                    .attr('id', function(entity) { return entity.id + '-clippath'; });
70560
70561                 clipPathsEnter
70562                    .append('path');
70563
70564                 clipPaths.merge(clipPathsEnter)
70565                    .selectAll('path')
70566                    .attr('d', path);
70567
70568
70569                 var drawLayer = selection.selectAll('.layer-osm.areas');
70570                 var touchLayer = selection.selectAll('.layer-touch.areas');
70571
70572                 // Draw areas..
70573                 var areagroup = drawLayer
70574                     .selectAll('g.areagroup')
70575                     .data(['fill', 'shadow', 'stroke']);
70576
70577                 areagroup = areagroup.enter()
70578                     .append('g')
70579                     .attr('class', function(d) { return 'areagroup area-' + d; })
70580                     .merge(areagroup);
70581
70582                 var paths = areagroup
70583                     .selectAll('path')
70584                     .filter(filter)
70585                     .data(function(layer) { return data[layer]; }, osmEntity.key);
70586
70587                 paths.exit()
70588                     .remove();
70589
70590
70591                 var fillpaths = selection.selectAll('.area-fill path.area').nodes();
70592                 var bisect = d3_bisector(function(node) { return -node.__data__.area(graph); }).left;
70593
70594                 function sortedByArea(entity) {
70595                     if (this._parent.__data__ === 'fill') {
70596                         return fillpaths[bisect(fillpaths, -entity.area(graph))];
70597                     }
70598                 }
70599
70600                 paths = paths.enter()
70601                     .insert('path', sortedByArea)
70602                     .merge(paths)
70603                     .each(function(entity) {
70604                         var layer = this.parentNode.__data__;
70605                         this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
70606
70607                         if (layer === 'fill') {
70608                             this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
70609                             setPattern.call(this, entity);
70610                         }
70611                     })
70612                     .call(svgTagClasses())
70613                     .attr('d', path);
70614
70615
70616                 // Draw touch targets..
70617                 touchLayer
70618                     .call(drawTargets, graph, data.stroke, filter);
70619             }
70620
70621             return drawAreas;
70622         }
70623
70624         //[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]
70625         //[4a]          NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
70626         //[5]           Name       ::=          NameStartChar (NameChar)*
70627         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
70628         var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
70629         var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
70630         //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
70631         //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(',')
70632
70633         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70634         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70635         var S_TAG = 0;//tag name offerring
70636         var S_ATTR = 1;//attr name offerring 
70637         var S_ATTR_SPACE=2;//attr name end and space offer
70638         var S_EQ = 3;//=space?
70639         var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
70640         var S_ATTR_END = 5;//attr value end and no space(quot end)
70641         var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
70642         var S_TAG_CLOSE = 7;//closed el<el />
70643
70644         function XMLReader(){
70645                 
70646         }
70647
70648         XMLReader.prototype = {
70649                 parse:function(source,defaultNSMap,entityMap){
70650                         var domBuilder = this.domBuilder;
70651                         domBuilder.startDocument();
70652                         _copy(defaultNSMap ,defaultNSMap = {});
70653                         parse(source,defaultNSMap,entityMap,
70654                                         domBuilder,this.errorHandler);
70655                         domBuilder.endDocument();
70656                 }
70657         };
70658         function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
70659                 function fixedFromCharCode(code) {
70660                         // String.prototype.fromCharCode does not supports
70661                         // > 2 bytes unicode chars directly
70662                         if (code > 0xffff) {
70663                                 code -= 0x10000;
70664                                 var surrogate1 = 0xd800 + (code >> 10)
70665                                         , surrogate2 = 0xdc00 + (code & 0x3ff);
70666
70667                                 return String.fromCharCode(surrogate1, surrogate2);
70668                         } else {
70669                                 return String.fromCharCode(code);
70670                         }
70671                 }
70672                 function entityReplacer(a){
70673                         var k = a.slice(1,-1);
70674                         if(k in entityMap){
70675                                 return entityMap[k]; 
70676                         }else if(k.charAt(0) === '#'){
70677                                 return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
70678                         }else{
70679                                 errorHandler.error('entity not found:'+a);
70680                                 return a;
70681                         }
70682                 }
70683                 function appendText(end){//has some bugs
70684                         if(end>start){
70685                                 var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
70686                                 locator&&position(start);
70687                                 domBuilder.characters(xt,0,end-start);
70688                                 start = end;
70689                         }
70690                 }
70691                 function position(p,m){
70692                         while(p>=lineEnd && (m = linePattern.exec(source))){
70693                                 lineStart = m.index;
70694                                 lineEnd = lineStart + m[0].length;
70695                                 locator.lineNumber++;
70696                                 //console.log('line++:',locator,startPos,endPos)
70697                         }
70698                         locator.columnNumber = p-lineStart+1;
70699                 }
70700                 var lineStart = 0;
70701                 var lineEnd = 0;
70702                 var linePattern = /.*(?:\r\n?|\n)|.*$/g;
70703                 var locator = domBuilder.locator;
70704                 
70705                 var parseStack = [{currentNSMap:defaultNSMapCopy}];
70706                 var closeMap = {};
70707                 var start = 0;
70708                 while(true){
70709                         try{
70710                                 var tagStart = source.indexOf('<',start);
70711                                 if(tagStart<0){
70712                                         if(!source.substr(start).match(/^\s*$/)){
70713                                                 var doc = domBuilder.doc;
70714                                         var text = doc.createTextNode(source.substr(start));
70715                                         doc.appendChild(text);
70716                                         domBuilder.currentElement = text;
70717                                         }
70718                                         return;
70719                                 }
70720                                 if(tagStart>start){
70721                                         appendText(tagStart);
70722                                 }
70723                                 switch(source.charAt(tagStart+1)){
70724                                 case '/':
70725                                         var end = source.indexOf('>',tagStart+3);
70726                                         var tagName = source.substring(tagStart+2,end);
70727                                         var config = parseStack.pop();
70728                                         if(end<0){
70729                                                 
70730                                         tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
70731                                         //console.error('#@@@@@@'+tagName)
70732                                         errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
70733                                         end = tagStart+1+tagName.length;
70734                                 }else if(tagName.match(/\s</)){
70735                                         tagName = tagName.replace(/[\s<].*/,'');
70736                                         errorHandler.error("end tag name: "+tagName+' maybe not complete');
70737                                         end = tagStart+1+tagName.length;
70738                                         }
70739                                         //console.error(parseStack.length,parseStack)
70740                                         //console.error(config);
70741                                         var localNSMap = config.localNSMap;
70742                                         var endMatch = config.tagName == tagName;
70743                                         var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
70744                                 if(endIgnoreCaseMach){
70745                                         domBuilder.endElement(config.uri,config.localName,tagName);
70746                                                 if(localNSMap){
70747                                                         for(var prefix in localNSMap){
70748                                                                 domBuilder.endPrefixMapping(prefix) ;
70749                                                         }
70750                                                 }
70751                                                 if(!endMatch){
70752                                         errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
70753                                                 }
70754                                 }else{
70755                                         parseStack.push(config);
70756                                 }
70757                                         
70758                                         end++;
70759                                         break;
70760                                         // end elment
70761                                 case '?':// <?...?>
70762                                         locator&&position(tagStart);
70763                                         end = parseInstruction(source,tagStart,domBuilder);
70764                                         break;
70765                                 case '!':// <!doctype,<![CDATA,<!--
70766                                         locator&&position(tagStart);
70767                                         end = parseDCC(source,tagStart,domBuilder,errorHandler);
70768                                         break;
70769                                 default:
70770                                         locator&&position(tagStart);
70771                                         var el = new ElementAttributes();
70772                                         var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
70773                                         //elStartEnd
70774                                         var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
70775                                         var len = el.length;
70776                                         
70777                                         
70778                                         if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
70779                                                 el.closed = true;
70780                                                 if(!entityMap.nbsp){
70781                                                         errorHandler.warning('unclosed xml attribute');
70782                                                 }
70783                                         }
70784                                         if(locator && len){
70785                                                 var locator2 = copyLocator(locator,{});
70786                                                 //try{//attribute position fixed
70787                                                 for(var i = 0;i<len;i++){
70788                                                         var a = el[i];
70789                                                         position(a.offset);
70790                                                         a.locator = copyLocator(locator,{});
70791                                                 }
70792                                                 //}catch(e){console.error('@@@@@'+e)}
70793                                                 domBuilder.locator = locator2;
70794                                                 if(appendElement(el,domBuilder,currentNSMap)){
70795                                                         parseStack.push(el);
70796                                                 }
70797                                                 domBuilder.locator = locator;
70798                                         }else{
70799                                                 if(appendElement(el,domBuilder,currentNSMap)){
70800                                                         parseStack.push(el);
70801                                                 }
70802                                         }
70803                                         
70804                                         
70805                                         
70806                                         if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
70807                                                 end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
70808                                         }else{
70809                                                 end++;
70810                                         }
70811                                 }
70812                         }catch(e){
70813                                 errorHandler.error('element parse error: '+e);
70814                                 //errorHandler.error('element parse error: '+e);
70815                                 end = -1;
70816                                 //throw e;
70817                         }
70818                         if(end>start){
70819                                 start = end;
70820                         }else{
70821                                 //TODO: 这里有可能sax回退,有位置错误风险
70822                                 appendText(Math.max(tagStart,start)+1);
70823                         }
70824                 }
70825         }
70826         function copyLocator(f,t){
70827                 t.lineNumber = f.lineNumber;
70828                 t.columnNumber = f.columnNumber;
70829                 return t;
70830         }
70831
70832         /**
70833          * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
70834          * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
70835          */
70836         function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
70837                 var attrName;
70838                 var value;
70839                 var p = ++start;
70840                 var s = S_TAG;//status
70841                 while(true){
70842                         var c = source.charAt(p);
70843                         switch(c){
70844                         case '=':
70845                                 if(s === S_ATTR){//attrName
70846                                         attrName = source.slice(start,p);
70847                                         s = S_EQ;
70848                                 }else if(s === S_ATTR_SPACE){
70849                                         s = S_EQ;
70850                                 }else{
70851                                         //fatalError: equal must after attrName or space after attrName
70852                                         throw new Error('attribute equal must after attrName');
70853                                 }
70854                                 break;
70855                         case '\'':
70856                         case '"':
70857                                 if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
70858                                         ){//equal
70859                                         if(s === S_ATTR){
70860                                                 errorHandler.warning('attribute value must after "="');
70861                                                 attrName = source.slice(start,p);
70862                                         }
70863                                         start = p+1;
70864                                         p = source.indexOf(c,start);
70865                                         if(p>0){
70866                                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70867                                                 el.add(attrName,value,start-1);
70868                                                 s = S_ATTR_END;
70869                                         }else{
70870                                                 //fatalError: no end quot match
70871                                                 throw new Error('attribute value no end \''+c+'\' match');
70872                                         }
70873                                 }else if(s == S_ATTR_NOQUOT_VALUE){
70874                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70875                                         //console.log(attrName,value,start,p)
70876                                         el.add(attrName,value,start);
70877                                         //console.dir(el)
70878                                         errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
70879                                         start = p+1;
70880                                         s = S_ATTR_END;
70881                                 }else{
70882                                         //fatalError: no equal before
70883                                         throw new Error('attribute value must after "="');
70884                                 }
70885                                 break;
70886                         case '/':
70887                                 switch(s){
70888                                 case S_TAG:
70889                                         el.setTagName(source.slice(start,p));
70890                                 case S_ATTR_END:
70891                                 case S_TAG_SPACE:
70892                                 case S_TAG_CLOSE:
70893                                         s =S_TAG_CLOSE;
70894                                         el.closed = true;
70895                                 case S_ATTR_NOQUOT_VALUE:
70896                                 case S_ATTR:
70897                                 case S_ATTR_SPACE:
70898                                         break;
70899                                 //case S_EQ:
70900                                 default:
70901                                         throw new Error("attribute invalid close char('/')")
70902                                 }
70903                                 break;
70904                         case ''://end document
70905                                 //throw new Error('unexpected end of input')
70906                                 errorHandler.error('unexpected end of input');
70907                                 if(s == S_TAG){
70908                                         el.setTagName(source.slice(start,p));
70909                                 }
70910                                 return p;
70911                         case '>':
70912                                 switch(s){
70913                                 case S_TAG:
70914                                         el.setTagName(source.slice(start,p));
70915                                 case S_ATTR_END:
70916                                 case S_TAG_SPACE:
70917                                 case S_TAG_CLOSE:
70918                                         break;//normal
70919                                 case S_ATTR_NOQUOT_VALUE://Compatible state
70920                                 case S_ATTR:
70921                                         value = source.slice(start,p);
70922                                         if(value.slice(-1) === '/'){
70923                                                 el.closed  = true;
70924                                                 value = value.slice(0,-1);
70925                                         }
70926                                 case S_ATTR_SPACE:
70927                                         if(s === S_ATTR_SPACE){
70928                                                 value = attrName;
70929                                         }
70930                                         if(s == S_ATTR_NOQUOT_VALUE){
70931                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
70932                                                 el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
70933                                         }else{
70934                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
70935                                                         errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
70936                                                 }
70937                                                 el.add(value,value,start);
70938                                         }
70939                                         break;
70940                                 case S_EQ:
70941                                         throw new Error('attribute value missed!!');
70942                                 }
70943         //                      console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
70944                                 return p;
70945                         /*xml space '\x20' | #x9 | #xD | #xA; */
70946                         case '\u0080':
70947                                 c = ' ';
70948                         default:
70949                                 if(c<= ' '){//space
70950                                         switch(s){
70951                                         case S_TAG:
70952                                                 el.setTagName(source.slice(start,p));//tagName
70953                                                 s = S_TAG_SPACE;
70954                                                 break;
70955                                         case S_ATTR:
70956                                                 attrName = source.slice(start,p);
70957                                                 s = S_ATTR_SPACE;
70958                                                 break;
70959                                         case S_ATTR_NOQUOT_VALUE:
70960                                                 var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
70961                                                 errorHandler.warning('attribute "'+value+'" missed quot(")!!');
70962                                                 el.add(attrName,value,start);
70963                                         case S_ATTR_END:
70964                                                 s = S_TAG_SPACE;
70965                                                 break;
70966                                         //case S_TAG_SPACE:
70967                                         //case S_EQ:
70968                                         //case S_ATTR_SPACE:
70969                                         //      void();break;
70970                                         //case S_TAG_CLOSE:
70971                                                 //ignore warning
70972                                         }
70973                                 }else{//not space
70974         //S_TAG,        S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
70975         //S_ATTR_SPACE, S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
70976                                         switch(s){
70977                                         //case S_TAG:void();break;
70978                                         //case S_ATTR:void();break;
70979                                         //case S_ATTR_NOQUOT_VALUE:void();break;
70980                                         case S_ATTR_SPACE:
70981                                                 var tagName =  el.tagName;
70982                                                 if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
70983                                                         errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
70984                                                 }
70985                                                 el.add(attrName,attrName,start);
70986                                                 start = p;
70987                                                 s = S_ATTR;
70988                                                 break;
70989                                         case S_ATTR_END:
70990                                                 errorHandler.warning('attribute space is required"'+attrName+'"!!');
70991                                         case S_TAG_SPACE:
70992                                                 s = S_ATTR;
70993                                                 start = p;
70994                                                 break;
70995                                         case S_EQ:
70996                                                 s = S_ATTR_NOQUOT_VALUE;
70997                                                 start = p;
70998                                                 break;
70999                                         case S_TAG_CLOSE:
71000                                                 throw new Error("elements closed character '/' and '>' must be connected to");
71001                                         }
71002                                 }
71003                         }//end outer switch
71004                         //console.log('p++',p)
71005                         p++;
71006                 }
71007         }
71008         /**
71009          * @return true if has new namespace define
71010          */
71011         function appendElement(el,domBuilder,currentNSMap){
71012                 var tagName = el.tagName;
71013                 var localNSMap = null;
71014                 //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
71015                 var i = el.length;
71016                 while(i--){
71017                         var a = el[i];
71018                         var qName = a.qName;
71019                         var value = a.value;
71020                         var nsp = qName.indexOf(':');
71021                         if(nsp>0){
71022                                 var prefix = a.prefix = qName.slice(0,nsp);
71023                                 var localName = qName.slice(nsp+1);
71024                                 var nsPrefix = prefix === 'xmlns' && localName;
71025                         }else{
71026                                 localName = qName;
71027                                 prefix = null;
71028                                 nsPrefix = qName === 'xmlns' && '';
71029                         }
71030                         //can not set prefix,because prefix !== ''
71031                         a.localName = localName ;
71032                         //prefix == null for no ns prefix attribute 
71033                         if(nsPrefix !== false){//hack!!
71034                                 if(localNSMap == null){
71035                                         localNSMap = {};
71036                                         //console.log(currentNSMap,0)
71037                                         _copy(currentNSMap,currentNSMap={});
71038                                         //console.log(currentNSMap,1)
71039                                 }
71040                                 currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
71041                                 a.uri = 'http://www.w3.org/2000/xmlns/';
71042                                 domBuilder.startPrefixMapping(nsPrefix, value); 
71043                         }
71044                 }
71045                 var i = el.length;
71046                 while(i--){
71047                         a = el[i];
71048                         var prefix = a.prefix;
71049                         if(prefix){//no prefix attribute has no namespace
71050                                 if(prefix === 'xml'){
71051                                         a.uri = 'http://www.w3.org/XML/1998/namespace';
71052                                 }if(prefix !== 'xmlns'){
71053                                         a.uri = currentNSMap[prefix || ''];
71054                                         
71055                                         //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
71056                                 }
71057                         }
71058                 }
71059                 var nsp = tagName.indexOf(':');
71060                 if(nsp>0){
71061                         prefix = el.prefix = tagName.slice(0,nsp);
71062                         localName = el.localName = tagName.slice(nsp+1);
71063                 }else{
71064                         prefix = null;//important!!
71065                         localName = el.localName = tagName;
71066                 }
71067                 //no prefix element has default namespace
71068                 var ns = el.uri = currentNSMap[prefix || ''];
71069                 domBuilder.startElement(ns,localName,tagName,el);
71070                 //endPrefixMapping and startPrefixMapping have not any help for dom builder
71071                 //localNSMap = null
71072                 if(el.closed){
71073                         domBuilder.endElement(ns,localName,tagName);
71074                         if(localNSMap){
71075                                 for(prefix in localNSMap){
71076                                         domBuilder.endPrefixMapping(prefix); 
71077                                 }
71078                         }
71079                 }else{
71080                         el.currentNSMap = currentNSMap;
71081                         el.localNSMap = localNSMap;
71082                         //parseStack.push(el);
71083                         return true;
71084                 }
71085         }
71086         function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
71087                 if(/^(?:script|textarea)$/i.test(tagName)){
71088                         var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
71089                         var text = source.substring(elStartEnd+1,elEndStart);
71090                         if(/[&<]/.test(text)){
71091                                 if(/^script$/i.test(tagName)){
71092                                         //if(!/\]\]>/.test(text)){
71093                                                 //lexHandler.startCDATA();
71094                                                 domBuilder.characters(text,0,text.length);
71095                                                 //lexHandler.endCDATA();
71096                                                 return elEndStart;
71097                                         //}
71098                                 }//}else{//text area
71099                                         text = text.replace(/&#?\w+;/g,entityReplacer);
71100                                         domBuilder.characters(text,0,text.length);
71101                                         return elEndStart;
71102                                 //}
71103                                 
71104                         }
71105                 }
71106                 return elStartEnd+1;
71107         }
71108         function fixSelfClosed(source,elStartEnd,tagName,closeMap){
71109                 //if(tagName in closeMap){
71110                 var pos = closeMap[tagName];
71111                 if(pos == null){
71112                         //console.log(tagName)
71113                         pos =  source.lastIndexOf('</'+tagName+'>');
71114                         if(pos<elStartEnd){//忘记闭合
71115                                 pos = source.lastIndexOf('</'+tagName);
71116                         }
71117                         closeMap[tagName] =pos;
71118                 }
71119                 return pos<elStartEnd;
71120                 //} 
71121         }
71122         function _copy(source,target){
71123                 for(var n in source){target[n] = source[n];}
71124         }
71125         function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
71126                 var next= source.charAt(start+2);
71127                 switch(next){
71128                 case '-':
71129                         if(source.charAt(start + 3) === '-'){
71130                                 var end = source.indexOf('-->',start+4);
71131                                 //append comment source.substring(4,end)//<!--
71132                                 if(end>start){
71133                                         domBuilder.comment(source,start+4,end-start-4);
71134                                         return end+3;
71135                                 }else{
71136                                         errorHandler.error("Unclosed comment");
71137                                         return -1;
71138                                 }
71139                         }else{
71140                                 //error
71141                                 return -1;
71142                         }
71143                 default:
71144                         if(source.substr(start+3,6) == 'CDATA['){
71145                                 var end = source.indexOf(']]>',start+9);
71146                                 domBuilder.startCDATA();
71147                                 domBuilder.characters(source,start+9,end-start-9);
71148                                 domBuilder.endCDATA(); 
71149                                 return end+3;
71150                         }
71151                         //<!DOCTYPE
71152                         //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
71153                         var matchs = split(source,start);
71154                         var len = matchs.length;
71155                         if(len>1 && /!doctype/i.test(matchs[0][0])){
71156                                 var name = matchs[1][0];
71157                                 var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
71158                                 var sysid = len>4 && matchs[4][0];
71159                                 var lastMatch = matchs[len-1];
71160                                 domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
71161                                                 sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
71162                                 domBuilder.endDTD();
71163                                 
71164                                 return lastMatch.index+lastMatch[0].length
71165                         }
71166                 }
71167                 return -1;
71168         }
71169
71170
71171
71172         function parseInstruction(source,start,domBuilder){
71173                 var end = source.indexOf('?>',start);
71174                 if(end){
71175                         var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
71176                         if(match){
71177                                 var len = match[0].length;
71178                                 domBuilder.processingInstruction(match[1], match[2]) ;
71179                                 return end+2;
71180                         }else{//error
71181                                 return -1;
71182                         }
71183                 }
71184                 return -1;
71185         }
71186
71187         /**
71188          * @param source
71189          */
71190         function ElementAttributes(source){
71191                 
71192         }
71193         ElementAttributes.prototype = {
71194                 setTagName:function(tagName){
71195                         if(!tagNamePattern.test(tagName)){
71196                                 throw new Error('invalid tagName:'+tagName)
71197                         }
71198                         this.tagName = tagName;
71199                 },
71200                 add:function(qName,value,offset){
71201                         if(!tagNamePattern.test(qName)){
71202                                 throw new Error('invalid attribute:'+qName)
71203                         }
71204                         this[this.length++] = {qName:qName,value:value,offset:offset};
71205                 },
71206                 length:0,
71207                 getLocalName:function(i){return this[i].localName},
71208                 getLocator:function(i){return this[i].locator},
71209                 getQName:function(i){return this[i].qName},
71210                 getURI:function(i){return this[i].uri},
71211                 getValue:function(i){return this[i].value}
71212         //      ,getIndex:function(uri, localName)){
71213         //              if(localName){
71214         //                      
71215         //              }else{
71216         //                      var qName = uri
71217         //              }
71218         //      },
71219         //      getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
71220         //      getType:function(uri,localName){}
71221         //      getType:function(i){},
71222         };
71223
71224
71225
71226
71227         function _set_proto_(thiz,parent){
71228                 thiz.__proto__ = parent;
71229                 return thiz;
71230         }
71231         if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
71232                 _set_proto_ = function(thiz,parent){
71233                         function p(){}          p.prototype = parent;
71234                         p = new p();
71235                         for(parent in thiz){
71236                                 p[parent] = thiz[parent];
71237                         }
71238                         return p;
71239                 };
71240         }
71241
71242         function split(source,start){
71243                 var match;
71244                 var buf = [];
71245                 var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
71246                 reg.lastIndex = start;
71247                 reg.exec(source);//skip <
71248                 while(match = reg.exec(source)){
71249                         buf.push(match);
71250                         if(match[1])return buf;
71251                 }
71252         }
71253
71254         var XMLReader_1 = XMLReader;
71255
71256         var sax = {
71257                 XMLReader: XMLReader_1
71258         };
71259
71260         /*
71261          * DOM Level 2
71262          * Object DOMException
71263          * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
71264          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
71265          */
71266
71267         function copy$3(src,dest){
71268                 for(var p in src){
71269                         dest[p] = src[p];
71270                 }
71271         }
71272         /**
71273         ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
71274         ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
71275          */
71276         function _extends(Class,Super){
71277                 var pt = Class.prototype;
71278                 if(Object.create){
71279                         var ppt = Object.create(Super.prototype);
71280                         pt.__proto__ = ppt;
71281                 }
71282                 if(!(pt instanceof Super)){
71283                         function t(){}          t.prototype = Super.prototype;
71284                         t = new t();
71285                         copy$3(pt,t);
71286                         Class.prototype = pt = t;
71287                 }
71288                 if(pt.constructor != Class){
71289                         if(typeof Class != 'function'){
71290                                 console.error("unknow Class:"+Class);
71291                         }
71292                         pt.constructor = Class;
71293                 }
71294         }
71295         var htmlns = 'http://www.w3.org/1999/xhtml' ;
71296         // Node Types
71297         var NodeType = {};
71298         var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
71299         var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
71300         var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
71301         var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
71302         var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
71303         var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
71304         var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
71305         var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
71306         var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
71307         var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
71308         var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
71309         var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
71310
71311         // ExceptionCode
71312         var ExceptionCode = {};
71313         var ExceptionMessage = {};
71314         var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
71315         var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
71316         var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
71317         var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
71318         var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
71319         var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
71320         var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
71321         var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
71322         var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
71323         var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
71324         //level2
71325         var INVALID_STATE_ERR           = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
71326         var SYNTAX_ERR                  = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
71327         var INVALID_MODIFICATION_ERR    = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
71328         var NAMESPACE_ERR               = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
71329         var INVALID_ACCESS_ERR          = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
71330
71331
71332         function DOMException$2(code, message) {
71333                 if(message instanceof Error){
71334                         var error = message;
71335                 }else{
71336                         error = this;
71337                         Error.call(this, ExceptionMessage[code]);
71338                         this.message = ExceptionMessage[code];
71339                         if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException$2);
71340                 }
71341                 error.code = code;
71342                 if(message) this.message = this.message + ": " + message;
71343                 return error;
71344         }DOMException$2.prototype = Error.prototype;
71345         copy$3(ExceptionCode,DOMException$2);
71346         /**
71347          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
71348          * 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.
71349          * The items in the NodeList are accessible via an integral index, starting from 0.
71350          */
71351         function NodeList() {
71352         }NodeList.prototype = {
71353                 /**
71354                  * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
71355                  * @standard level1
71356                  */
71357                 length:0, 
71358                 /**
71359                  * 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.
71360                  * @standard level1
71361                  * @param index  unsigned long 
71362                  *   Index into the collection.
71363                  * @return Node
71364                  *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
71365                  */
71366                 item: function(index) {
71367                         return this[index] || null;
71368                 },
71369                 toString:function(isHTML,nodeFilter){
71370                         for(var buf = [], i = 0;i<this.length;i++){
71371                                 serializeToString(this[i],buf,isHTML,nodeFilter);
71372                         }
71373                         return buf.join('');
71374                 }
71375         };
71376         function LiveNodeList(node,refresh){
71377                 this._node = node;
71378                 this._refresh = refresh;
71379                 _updateLiveList(this);
71380         }
71381         function _updateLiveList(list){
71382                 var inc = list._node._inc || list._node.ownerDocument._inc;
71383                 if(list._inc != inc){
71384                         var ls = list._refresh(list._node);
71385                         //console.log(ls.length)
71386                         __set__(list,'length',ls.length);
71387                         copy$3(ls,list);
71388                         list._inc = inc;
71389                 }
71390         }
71391         LiveNodeList.prototype.item = function(i){
71392                 _updateLiveList(this);
71393                 return this[i];
71394         };
71395
71396         _extends(LiveNodeList,NodeList);
71397         /**
71398          * 
71399          * 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.
71400          * NamedNodeMap objects in the DOM are live.
71401          * used for attributes or DocumentType entities 
71402          */
71403         function NamedNodeMap() {
71404         }
71405         function _findNodeIndex(list,node){
71406                 var i = list.length;
71407                 while(i--){
71408                         if(list[i] === node){return i}
71409                 }
71410         }
71411
71412         function _addNamedNode(el,list,newAttr,oldAttr){
71413                 if(oldAttr){
71414                         list[_findNodeIndex(list,oldAttr)] = newAttr;
71415                 }else{
71416                         list[list.length++] = newAttr;
71417                 }
71418                 if(el){
71419                         newAttr.ownerElement = el;
71420                         var doc = el.ownerDocument;
71421                         if(doc){
71422                                 oldAttr && _onRemoveAttribute(doc,el,oldAttr);
71423                                 _onAddAttribute(doc,el,newAttr);
71424                         }
71425                 }
71426         }
71427         function _removeNamedNode(el,list,attr){
71428                 //console.log('remove attr:'+attr)
71429                 var i = _findNodeIndex(list,attr);
71430                 if(i>=0){
71431                         var lastIndex = list.length-1;
71432                         while(i<lastIndex){
71433                                 list[i] = list[++i];
71434                         }
71435                         list.length = lastIndex;
71436                         if(el){
71437                                 var doc = el.ownerDocument;
71438                                 if(doc){
71439                                         _onRemoveAttribute(doc,el,attr);
71440                                         attr.ownerElement = null;
71441                                 }
71442                         }
71443                 }else{
71444                         throw DOMException$2(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
71445                 }
71446         }
71447         NamedNodeMap.prototype = {
71448                 length:0,
71449                 item:NodeList.prototype.item,
71450                 getNamedItem: function(key) {
71451         //              if(key.indexOf(':')>0 || key == 'xmlns'){
71452         //                      return null;
71453         //              }
71454                         //console.log()
71455                         var i = this.length;
71456                         while(i--){
71457                                 var attr = this[i];
71458                                 //console.log(attr.nodeName,key)
71459                                 if(attr.nodeName == key){
71460                                         return attr;
71461                                 }
71462                         }
71463                 },
71464                 setNamedItem: function(attr) {
71465                         var el = attr.ownerElement;
71466                         if(el && el!=this._ownerElement){
71467                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71468                         }
71469                         var oldAttr = this.getNamedItem(attr.nodeName);
71470                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71471                         return oldAttr;
71472                 },
71473                 /* returns Node */
71474                 setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
71475                         var el = attr.ownerElement, oldAttr;
71476                         if(el && el!=this._ownerElement){
71477                                 throw new DOMException$2(INUSE_ATTRIBUTE_ERR);
71478                         }
71479                         oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
71480                         _addNamedNode(this._ownerElement,this,attr,oldAttr);
71481                         return oldAttr;
71482                 },
71483
71484                 /* returns Node */
71485                 removeNamedItem: function(key) {
71486                         var attr = this.getNamedItem(key);
71487                         _removeNamedNode(this._ownerElement,this,attr);
71488                         return attr;
71489                         
71490                         
71491                 },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
71492                 
71493                 //for level2
71494                 removeNamedItemNS:function(namespaceURI,localName){
71495                         var attr = this.getNamedItemNS(namespaceURI,localName);
71496                         _removeNamedNode(this._ownerElement,this,attr);
71497                         return attr;
71498                 },
71499                 getNamedItemNS: function(namespaceURI, localName) {
71500                         var i = this.length;
71501                         while(i--){
71502                                 var node = this[i];
71503                                 if(node.localName == localName && node.namespaceURI == namespaceURI){
71504                                         return node;
71505                                 }
71506                         }
71507                         return null;
71508                 }
71509         };
71510         /**
71511          * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
71512          */
71513         function DOMImplementation(/* Object */ features) {
71514                 this._features = {};
71515                 if (features) {
71516                         for (var feature in features) {
71517                                  this._features = features[feature];
71518                         }
71519                 }
71520         }
71521         DOMImplementation.prototype = {
71522                 hasFeature: function(/* string */ feature, /* string */ version) {
71523                         var versions = this._features[feature.toLowerCase()];
71524                         if (versions && (!version || version in versions)) {
71525                                 return true;
71526                         } else {
71527                                 return false;
71528                         }
71529                 },
71530                 // Introduced in DOM Level 2:
71531                 createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
71532                         var doc = new Document();
71533                         doc.implementation = this;
71534                         doc.childNodes = new NodeList();
71535                         doc.doctype = doctype;
71536                         if(doctype){
71537                                 doc.appendChild(doctype);
71538                         }
71539                         if(qualifiedName){
71540                                 var root = doc.createElementNS(namespaceURI,qualifiedName);
71541                                 doc.appendChild(root);
71542                         }
71543                         return doc;
71544                 },
71545                 // Introduced in DOM Level 2:
71546                 createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
71547                         var node = new DocumentType();
71548                         node.name = qualifiedName;
71549                         node.nodeName = qualifiedName;
71550                         node.publicId = publicId;
71551                         node.systemId = systemId;
71552                         // Introduced in DOM Level 2:
71553                         //readonly attribute DOMString        internalSubset;
71554                         
71555                         //TODO:..
71556                         //  readonly attribute NamedNodeMap     entities;
71557                         //  readonly attribute NamedNodeMap     notations;
71558                         return node;
71559                 }
71560         };
71561
71562
71563         /**
71564          * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
71565          */
71566
71567         function Node$2() {
71568         }
71569         Node$2.prototype = {
71570                 firstChild : null,
71571                 lastChild : null,
71572                 previousSibling : null,
71573                 nextSibling : null,
71574                 attributes : null,
71575                 parentNode : null,
71576                 childNodes : null,
71577                 ownerDocument : null,
71578                 nodeValue : null,
71579                 namespaceURI : null,
71580                 prefix : null,
71581                 localName : null,
71582                 // Modified in DOM Level 2:
71583                 insertBefore:function(newChild, refChild){//raises 
71584                         return _insertBefore(this,newChild,refChild);
71585                 },
71586                 replaceChild:function(newChild, oldChild){//raises 
71587                         this.insertBefore(newChild,oldChild);
71588                         if(oldChild){
71589                                 this.removeChild(oldChild);
71590                         }
71591                 },
71592                 removeChild:function(oldChild){
71593                         return _removeChild(this,oldChild);
71594                 },
71595                 appendChild:function(newChild){
71596                         return this.insertBefore(newChild,null);
71597                 },
71598                 hasChildNodes:function(){
71599                         return this.firstChild != null;
71600                 },
71601                 cloneNode:function(deep){
71602                         return cloneNode(this.ownerDocument||this,this,deep);
71603                 },
71604                 // Modified in DOM Level 2:
71605                 normalize:function(){
71606                         var child = this.firstChild;
71607                         while(child){
71608                                 var next = child.nextSibling;
71609                                 if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
71610                                         this.removeChild(next);
71611                                         child.appendData(next.data);
71612                                 }else{
71613                                         child.normalize();
71614                                         child = next;
71615                                 }
71616                         }
71617                 },
71618                 // Introduced in DOM Level 2:
71619                 isSupported:function(feature, version){
71620                         return this.ownerDocument.implementation.hasFeature(feature,version);
71621                 },
71622             // Introduced in DOM Level 2:
71623             hasAttributes:function(){
71624                 return this.attributes.length>0;
71625             },
71626             lookupPrefix:function(namespaceURI){
71627                 var el = this;
71628                 while(el){
71629                         var map = el._nsMap;
71630                         //console.dir(map)
71631                         if(map){
71632                                 for(var n in map){
71633                                         if(map[n] == namespaceURI){
71634                                                 return n;
71635                                         }
71636                                 }
71637                         }
71638                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71639                 }
71640                 return null;
71641             },
71642             // Introduced in DOM Level 3:
71643             lookupNamespaceURI:function(prefix){
71644                 var el = this;
71645                 while(el){
71646                         var map = el._nsMap;
71647                         //console.dir(map)
71648                         if(map){
71649                                 if(prefix in map){
71650                                         return map[prefix] ;
71651                                 }
71652                         }
71653                         el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
71654                 }
71655                 return null;
71656             },
71657             // Introduced in DOM Level 3:
71658             isDefaultNamespace:function(namespaceURI){
71659                 var prefix = this.lookupPrefix(namespaceURI);
71660                 return prefix == null;
71661             }
71662         };
71663
71664
71665         function _xmlEncoder(c){
71666                 return c == '<' && '&lt;' ||
71667                  c == '>' && '&gt;' ||
71668                  c == '&' && '&amp;' ||
71669                  c == '"' && '&quot;' ||
71670                  '&#'+c.charCodeAt()+';'
71671         }
71672
71673
71674         copy$3(NodeType,Node$2);
71675         copy$3(NodeType,Node$2.prototype);
71676
71677         /**
71678          * @param callback return true for continue,false for break
71679          * @return boolean true: break visit;
71680          */
71681         function _visitNode(node,callback){
71682                 if(callback(node)){
71683                         return true;
71684                 }
71685                 if(node = node.firstChild){
71686                         do{
71687                                 if(_visitNode(node,callback)){return true}
71688                 }while(node=node.nextSibling)
71689             }
71690         }
71691
71692
71693
71694         function Document(){
71695         }
71696         function _onAddAttribute(doc,el,newAttr){
71697                 doc && doc._inc++;
71698                 var ns = newAttr.namespaceURI ;
71699                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71700                         //update namespace
71701                         el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
71702                 }
71703         }
71704         function _onRemoveAttribute(doc,el,newAttr,remove){
71705                 doc && doc._inc++;
71706                 var ns = newAttr.namespaceURI ;
71707                 if(ns == 'http://www.w3.org/2000/xmlns/'){
71708                         //update namespace
71709                         delete el._nsMap[newAttr.prefix?newAttr.localName:''];
71710                 }
71711         }
71712         function _onUpdateChild(doc,el,newChild){
71713                 if(doc && doc._inc){
71714                         doc._inc++;
71715                         //update childNodes
71716                         var cs = el.childNodes;
71717                         if(newChild){
71718                                 cs[cs.length++] = newChild;
71719                         }else{
71720                                 //console.log(1)
71721                                 var child = el.firstChild;
71722                                 var i = 0;
71723                                 while(child){
71724                                         cs[i++] = child;
71725                                         child =child.nextSibling;
71726                                 }
71727                                 cs.length = i;
71728                         }
71729                 }
71730         }
71731
71732         /**
71733          * attributes;
71734          * children;
71735          * 
71736          * writeable properties:
71737          * nodeValue,Attr:value,CharacterData:data
71738          * prefix
71739          */
71740         function _removeChild(parentNode,child){
71741                 var previous = child.previousSibling;
71742                 var next = child.nextSibling;
71743                 if(previous){
71744                         previous.nextSibling = next;
71745                 }else{
71746                         parentNode.firstChild = next;
71747                 }
71748                 if(next){
71749                         next.previousSibling = previous;
71750                 }else{
71751                         parentNode.lastChild = previous;
71752                 }
71753                 _onUpdateChild(parentNode.ownerDocument,parentNode);
71754                 return child;
71755         }
71756         /**
71757          * preformance key(refChild == null)
71758          */
71759         function _insertBefore(parentNode,newChild,nextChild){
71760                 var cp = newChild.parentNode;
71761                 if(cp){
71762                         cp.removeChild(newChild);//remove and update
71763                 }
71764                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71765                         var newFirst = newChild.firstChild;
71766                         if (newFirst == null) {
71767                                 return newChild;
71768                         }
71769                         var newLast = newChild.lastChild;
71770                 }else{
71771                         newFirst = newLast = newChild;
71772                 }
71773                 var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
71774
71775                 newFirst.previousSibling = pre;
71776                 newLast.nextSibling = nextChild;
71777                 
71778                 
71779                 if(pre){
71780                         pre.nextSibling = newFirst;
71781                 }else{
71782                         parentNode.firstChild = newFirst;
71783                 }
71784                 if(nextChild == null){
71785                         parentNode.lastChild = newLast;
71786                 }else{
71787                         nextChild.previousSibling = newLast;
71788                 }
71789                 do{
71790                         newFirst.parentNode = parentNode;
71791                 }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
71792                 _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
71793                 //console.log(parentNode.lastChild.nextSibling == null)
71794                 if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
71795                         newChild.firstChild = newChild.lastChild = null;
71796                 }
71797                 return newChild;
71798         }
71799         function _appendSingleChild(parentNode,newChild){
71800                 var cp = newChild.parentNode;
71801                 if(cp){
71802                         var pre = parentNode.lastChild;
71803                         cp.removeChild(newChild);//remove and update
71804                         var pre = parentNode.lastChild;
71805                 }
71806                 var pre = parentNode.lastChild;
71807                 newChild.parentNode = parentNode;
71808                 newChild.previousSibling = pre;
71809                 newChild.nextSibling = null;
71810                 if(pre){
71811                         pre.nextSibling = newChild;
71812                 }else{
71813                         parentNode.firstChild = newChild;
71814                 }
71815                 parentNode.lastChild = newChild;
71816                 _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
71817                 return newChild;
71818                 //console.log("__aa",parentNode.lastChild.nextSibling == null)
71819         }
71820         Document.prototype = {
71821                 //implementation : null,
71822                 nodeName :  '#document',
71823                 nodeType :  DOCUMENT_NODE,
71824                 doctype :  null,
71825                 documentElement :  null,
71826                 _inc : 1,
71827                 
71828                 insertBefore :  function(newChild, refChild){//raises 
71829                         if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
71830                                 var child = newChild.firstChild;
71831                                 while(child){
71832                                         var next = child.nextSibling;
71833                                         this.insertBefore(child,refChild);
71834                                         child = next;
71835                                 }
71836                                 return newChild;
71837                         }
71838                         if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
71839                                 this.documentElement = newChild;
71840                         }
71841                         
71842                         return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
71843                 },
71844                 removeChild :  function(oldChild){
71845                         if(this.documentElement == oldChild){
71846                                 this.documentElement = null;
71847                         }
71848                         return _removeChild(this,oldChild);
71849                 },
71850                 // Introduced in DOM Level 2:
71851                 importNode : function(importedNode,deep){
71852                         return importNode(this,importedNode,deep);
71853                 },
71854                 // Introduced in DOM Level 2:
71855                 getElementById :        function(id){
71856                         var rtv = null;
71857                         _visitNode(this.documentElement,function(node){
71858                                 if(node.nodeType == ELEMENT_NODE){
71859                                         if(node.getAttribute('id') == id){
71860                                                 rtv = node;
71861                                                 return true;
71862                                         }
71863                                 }
71864                         });
71865                         return rtv;
71866                 },
71867                 
71868                 //document factory method:
71869                 createElement : function(tagName){
71870                         var node = new Element();
71871                         node.ownerDocument = this;
71872                         node.nodeName = tagName;
71873                         node.tagName = tagName;
71874                         node.childNodes = new NodeList();
71875                         var attrs       = node.attributes = new NamedNodeMap();
71876                         attrs._ownerElement = node;
71877                         return node;
71878                 },
71879                 createDocumentFragment :        function(){
71880                         var node = new DocumentFragment();
71881                         node.ownerDocument = this;
71882                         node.childNodes = new NodeList();
71883                         return node;
71884                 },
71885                 createTextNode :        function(data){
71886                         var node = new Text();
71887                         node.ownerDocument = this;
71888                         node.appendData(data);
71889                         return node;
71890                 },
71891                 createComment : function(data){
71892                         var node = new Comment();
71893                         node.ownerDocument = this;
71894                         node.appendData(data);
71895                         return node;
71896                 },
71897                 createCDATASection :    function(data){
71898                         var node = new CDATASection();
71899                         node.ownerDocument = this;
71900                         node.appendData(data);
71901                         return node;
71902                 },
71903                 createProcessingInstruction :   function(target,data){
71904                         var node = new ProcessingInstruction();
71905                         node.ownerDocument = this;
71906                         node.tagName = node.target = target;
71907                         node.nodeValue= node.data = data;
71908                         return node;
71909                 },
71910                 createAttribute :       function(name){
71911                         var node = new Attr();
71912                         node.ownerDocument      = this;
71913                         node.name = name;
71914                         node.nodeName   = name;
71915                         node.localName = name;
71916                         node.specified = true;
71917                         return node;
71918                 },
71919                 createEntityReference : function(name){
71920                         var node = new EntityReference();
71921                         node.ownerDocument      = this;
71922                         node.nodeName   = name;
71923                         return node;
71924                 },
71925                 // Introduced in DOM Level 2:
71926                 createElementNS :       function(namespaceURI,qualifiedName){
71927                         var node = new Element();
71928                         var pl = qualifiedName.split(':');
71929                         var attrs       = node.attributes = new NamedNodeMap();
71930                         node.childNodes = new NodeList();
71931                         node.ownerDocument = this;
71932                         node.nodeName = qualifiedName;
71933                         node.tagName = qualifiedName;
71934                         node.namespaceURI = namespaceURI;
71935                         if(pl.length == 2){
71936                                 node.prefix = pl[0];
71937                                 node.localName = pl[1];
71938                         }else{
71939                                 //el.prefix = null;
71940                                 node.localName = qualifiedName;
71941                         }
71942                         attrs._ownerElement = node;
71943                         return node;
71944                 },
71945                 // Introduced in DOM Level 2:
71946                 createAttributeNS :     function(namespaceURI,qualifiedName){
71947                         var node = new Attr();
71948                         var pl = qualifiedName.split(':');
71949                         node.ownerDocument = this;
71950                         node.nodeName = qualifiedName;
71951                         node.name = qualifiedName;
71952                         node.namespaceURI = namespaceURI;
71953                         node.specified = true;
71954                         if(pl.length == 2){
71955                                 node.prefix = pl[0];
71956                                 node.localName = pl[1];
71957                         }else{
71958                                 //el.prefix = null;
71959                                 node.localName = qualifiedName;
71960                         }
71961                         return node;
71962                 }
71963         };
71964         _extends(Document,Node$2);
71965
71966
71967         function Element() {
71968                 this._nsMap = {};
71969         }Element.prototype = {
71970                 nodeType : ELEMENT_NODE,
71971                 hasAttribute : function(name){
71972                         return this.getAttributeNode(name)!=null;
71973                 },
71974                 getAttribute : function(name){
71975                         var attr = this.getAttributeNode(name);
71976                         return attr && attr.value || '';
71977                 },
71978                 getAttributeNode : function(name){
71979                         return this.attributes.getNamedItem(name);
71980                 },
71981                 setAttribute : function(name, value){
71982                         var attr = this.ownerDocument.createAttribute(name);
71983                         attr.value = attr.nodeValue = "" + value;
71984                         this.setAttributeNode(attr);
71985                 },
71986                 removeAttribute : function(name){
71987                         var attr = this.getAttributeNode(name);
71988                         attr && this.removeAttributeNode(attr);
71989                 },
71990                 
71991                 //four real opeartion method
71992                 appendChild:function(newChild){
71993                         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
71994                                 return this.insertBefore(newChild,null);
71995                         }else{
71996                                 return _appendSingleChild(this,newChild);
71997                         }
71998                 },
71999                 setAttributeNode : function(newAttr){
72000                         return this.attributes.setNamedItem(newAttr);
72001                 },
72002                 setAttributeNodeNS : function(newAttr){
72003                         return this.attributes.setNamedItemNS(newAttr);
72004                 },
72005                 removeAttributeNode : function(oldAttr){
72006                         //console.log(this == oldAttr.ownerElement)
72007                         return this.attributes.removeNamedItem(oldAttr.nodeName);
72008                 },
72009                 //get real attribute name,and remove it by removeAttributeNode
72010                 removeAttributeNS : function(namespaceURI, localName){
72011                         var old = this.getAttributeNodeNS(namespaceURI, localName);
72012                         old && this.removeAttributeNode(old);
72013                 },
72014                 
72015                 hasAttributeNS : function(namespaceURI, localName){
72016                         return this.getAttributeNodeNS(namespaceURI, localName)!=null;
72017                 },
72018                 getAttributeNS : function(namespaceURI, localName){
72019                         var attr = this.getAttributeNodeNS(namespaceURI, localName);
72020                         return attr && attr.value || '';
72021                 },
72022                 setAttributeNS : function(namespaceURI, qualifiedName, value){
72023                         var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
72024                         attr.value = attr.nodeValue = "" + value;
72025                         this.setAttributeNode(attr);
72026                 },
72027                 getAttributeNodeNS : function(namespaceURI, localName){
72028                         return this.attributes.getNamedItemNS(namespaceURI, localName);
72029                 },
72030                 
72031                 getElementsByTagName : function(tagName){
72032                         return new LiveNodeList(this,function(base){
72033                                 var ls = [];
72034                                 _visitNode(base,function(node){
72035                                         if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
72036                                                 ls.push(node);
72037                                         }
72038                                 });
72039                                 return ls;
72040                         });
72041                 },
72042                 getElementsByTagNameNS : function(namespaceURI, localName){
72043                         return new LiveNodeList(this,function(base){
72044                                 var ls = [];
72045                                 _visitNode(base,function(node){
72046                                         if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
72047                                                 ls.push(node);
72048                                         }
72049                                 });
72050                                 return ls;
72051                                 
72052                         });
72053                 }
72054         };
72055         Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
72056         Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
72057
72058
72059         _extends(Element,Node$2);
72060         function Attr() {
72061         }Attr.prototype.nodeType = ATTRIBUTE_NODE;
72062         _extends(Attr,Node$2);
72063
72064
72065         function CharacterData() {
72066         }CharacterData.prototype = {
72067                 data : '',
72068                 substringData : function(offset, count) {
72069                         return this.data.substring(offset, offset+count);
72070                 },
72071                 appendData: function(text) {
72072                         text = this.data+text;
72073                         this.nodeValue = this.data = text;
72074                         this.length = text.length;
72075                 },
72076                 insertData: function(offset,text) {
72077                         this.replaceData(offset,0,text);
72078                 
72079                 },
72080                 appendChild:function(newChild){
72081                         throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
72082                 },
72083                 deleteData: function(offset, count) {
72084                         this.replaceData(offset,count,"");
72085                 },
72086                 replaceData: function(offset, count, text) {
72087                         var start = this.data.substring(0,offset);
72088                         var end = this.data.substring(offset+count);
72089                         text = start + text + end;
72090                         this.nodeValue = this.data = text;
72091                         this.length = text.length;
72092                 }
72093         };
72094         _extends(CharacterData,Node$2);
72095         function Text() {
72096         }Text.prototype = {
72097                 nodeName : "#text",
72098                 nodeType : TEXT_NODE,
72099                 splitText : function(offset) {
72100                         var text = this.data;
72101                         var newText = text.substring(offset);
72102                         text = text.substring(0, offset);
72103                         this.data = this.nodeValue = text;
72104                         this.length = text.length;
72105                         var newNode = this.ownerDocument.createTextNode(newText);
72106                         if(this.parentNode){
72107                                 this.parentNode.insertBefore(newNode, this.nextSibling);
72108                         }
72109                         return newNode;
72110                 }
72111         };
72112         _extends(Text,CharacterData);
72113         function Comment() {
72114         }Comment.prototype = {
72115                 nodeName : "#comment",
72116                 nodeType : COMMENT_NODE
72117         };
72118         _extends(Comment,CharacterData);
72119
72120         function CDATASection() {
72121         }CDATASection.prototype = {
72122                 nodeName : "#cdata-section",
72123                 nodeType : CDATA_SECTION_NODE
72124         };
72125         _extends(CDATASection,CharacterData);
72126
72127
72128         function DocumentType() {
72129         }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
72130         _extends(DocumentType,Node$2);
72131
72132         function Notation() {
72133         }Notation.prototype.nodeType = NOTATION_NODE;
72134         _extends(Notation,Node$2);
72135
72136         function Entity() {
72137         }Entity.prototype.nodeType = ENTITY_NODE;
72138         _extends(Entity,Node$2);
72139
72140         function EntityReference() {
72141         }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
72142         _extends(EntityReference,Node$2);
72143
72144         function DocumentFragment() {
72145         }DocumentFragment.prototype.nodeName =  "#document-fragment";
72146         DocumentFragment.prototype.nodeType =   DOCUMENT_FRAGMENT_NODE;
72147         _extends(DocumentFragment,Node$2);
72148
72149
72150         function ProcessingInstruction() {
72151         }
72152         ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
72153         _extends(ProcessingInstruction,Node$2);
72154         function XMLSerializer$1(){}
72155         XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
72156                 return nodeSerializeToString.call(node,isHtml,nodeFilter);
72157         };
72158         Node$2.prototype.toString = nodeSerializeToString;
72159         function nodeSerializeToString(isHtml,nodeFilter){
72160                 var buf = [];
72161                 var refNode = this.nodeType == 9?this.documentElement:this;
72162                 var prefix = refNode.prefix;
72163                 var uri = refNode.namespaceURI;
72164                 
72165                 if(uri && prefix == null){
72166                         //console.log(prefix)
72167                         var prefix = refNode.lookupPrefix(uri);
72168                         if(prefix == null){
72169                                 //isHTML = true;
72170                                 var visibleNamespaces=[
72171                                 {namespace:uri,prefix:null}
72172                                 //{namespace:uri,prefix:''}
72173                                 ];
72174                         }
72175                 }
72176                 serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
72177                 //console.log('###',this.nodeType,uri,prefix,buf.join(''))
72178                 return buf.join('');
72179         }
72180         function needNamespaceDefine(node,isHTML, visibleNamespaces) {
72181                 var prefix = node.prefix||'';
72182                 var uri = node.namespaceURI;
72183                 if (!prefix && !uri){
72184                         return false;
72185                 }
72186                 if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
72187                         || uri == 'http://www.w3.org/2000/xmlns/'){
72188                         return false;
72189                 }
72190                 
72191                 var i = visibleNamespaces.length; 
72192                 //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
72193                 while (i--) {
72194                         var ns = visibleNamespaces[i];
72195                         // get namespace prefix
72196                         //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
72197                         if (ns.prefix == prefix){
72198                                 return ns.namespace != uri;
72199                         }
72200                 }
72201                 //console.log(isHTML,uri,prefix=='')
72202                 //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
72203                 //      return false;
72204                 //}
72205                 //node.flag = '11111'
72206                 //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
72207                 return true;
72208         }
72209         function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
72210                 if(nodeFilter){
72211                         node = nodeFilter(node);
72212                         if(node){
72213                                 if(typeof node == 'string'){
72214                                         buf.push(node);
72215                                         return;
72216                                 }
72217                         }else{
72218                                 return;
72219                         }
72220                         //buf.sort.apply(attrs, attributeSorter);
72221                 }
72222                 switch(node.nodeType){
72223                 case ELEMENT_NODE:
72224                         if (!visibleNamespaces) visibleNamespaces = [];
72225                         var startVisibleNamespaces = visibleNamespaces.length;
72226                         var attrs = node.attributes;
72227                         var len = attrs.length;
72228                         var child = node.firstChild;
72229                         var nodeName = node.tagName;
72230                         
72231                         isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
72232                         buf.push('<',nodeName);
72233                         
72234                         
72235                         
72236                         for(var i=0;i<len;i++){
72237                                 // add namespaces for attributes
72238                                 var attr = attrs.item(i);
72239                                 if (attr.prefix == 'xmlns') {
72240                                         visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
72241                                 }else if(attr.nodeName == 'xmlns'){
72242                                         visibleNamespaces.push({ prefix: '', namespace: attr.value });
72243                                 }
72244                         }
72245                         for(var i=0;i<len;i++){
72246                                 var attr = attrs.item(i);
72247                                 if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
72248                                         var prefix = attr.prefix||'';
72249                                         var uri = attr.namespaceURI;
72250                                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72251                                         buf.push(ns, '="' , uri , '"');
72252                                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
72253                                 }
72254                                 serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
72255                         }
72256                         // add namespace for current node               
72257                         if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
72258                                 var prefix = node.prefix||'';
72259                                 var uri = node.namespaceURI;
72260                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
72261                                 buf.push(ns, '="' , uri , '"');
72262                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
72263                         }
72264                         
72265                         if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
72266                                 buf.push('>');
72267                                 //if is cdata child node
72268                                 if(isHTML && /^script$/i.test(nodeName)){
72269                                         while(child){
72270                                                 if(child.data){
72271                                                         buf.push(child.data);
72272                                                 }else{
72273                                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72274                                                 }
72275                                                 child = child.nextSibling;
72276                                         }
72277                                 }else
72278                                 {
72279                                         while(child){
72280                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72281                                                 child = child.nextSibling;
72282                                         }
72283                                 }
72284                                 buf.push('</',nodeName,'>');
72285                         }else{
72286                                 buf.push('/>');
72287                         }
72288                         // remove added visible namespaces
72289                         //visibleNamespaces.length = startVisibleNamespaces;
72290                         return;
72291                 case DOCUMENT_NODE:
72292                 case DOCUMENT_FRAGMENT_NODE:
72293                         var child = node.firstChild;
72294                         while(child){
72295                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
72296                                 child = child.nextSibling;
72297                         }
72298                         return;
72299                 case ATTRIBUTE_NODE:
72300                         return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
72301                 case TEXT_NODE:
72302                         return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
72303                 case CDATA_SECTION_NODE:
72304                         return buf.push( '<![CDATA[',node.data,']]>');
72305                 case COMMENT_NODE:
72306                         return buf.push( "<!--",node.data,"-->");
72307                 case DOCUMENT_TYPE_NODE:
72308                         var pubid = node.publicId;
72309                         var sysid = node.systemId;
72310                         buf.push('<!DOCTYPE ',node.name);
72311                         if(pubid){
72312                                 buf.push(' PUBLIC "',pubid);
72313                                 if (sysid && sysid!='.') {
72314                                         buf.push( '" "',sysid);
72315                                 }
72316                                 buf.push('">');
72317                         }else if(sysid && sysid!='.'){
72318                                 buf.push(' SYSTEM "',sysid,'">');
72319                         }else{
72320                                 var sub = node.internalSubset;
72321                                 if(sub){
72322                                         buf.push(" [",sub,"]");
72323                                 }
72324                                 buf.push(">");
72325                         }
72326                         return;
72327                 case PROCESSING_INSTRUCTION_NODE:
72328                         return buf.push( "<?",node.target," ",node.data,"?>");
72329                 case ENTITY_REFERENCE_NODE:
72330                         return buf.push( '&',node.nodeName,';');
72331                 //case ENTITY_NODE:
72332                 //case NOTATION_NODE:
72333                 default:
72334                         buf.push('??',node.nodeName);
72335                 }
72336         }
72337         function importNode(doc,node,deep){
72338                 var node2;
72339                 switch (node.nodeType) {
72340                 case ELEMENT_NODE:
72341                         node2 = node.cloneNode(false);
72342                         node2.ownerDocument = doc;
72343                         //var attrs = node2.attributes;
72344                         //var len = attrs.length;
72345                         //for(var i=0;i<len;i++){
72346                                 //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
72347                         //}
72348                 case DOCUMENT_FRAGMENT_NODE:
72349                         break;
72350                 case ATTRIBUTE_NODE:
72351                         deep = true;
72352                         break;
72353                 //case ENTITY_REFERENCE_NODE:
72354                 //case PROCESSING_INSTRUCTION_NODE:
72355                 ////case TEXT_NODE:
72356                 //case CDATA_SECTION_NODE:
72357                 //case COMMENT_NODE:
72358                 //      deep = false;
72359                 //      break;
72360                 //case DOCUMENT_NODE:
72361                 //case DOCUMENT_TYPE_NODE:
72362                 //cannot be imported.
72363                 //case ENTITY_NODE:
72364                 //case NOTATION_NODE:
72365                 //can not hit in level3
72366                 //default:throw e;
72367                 }
72368                 if(!node2){
72369                         node2 = node.cloneNode(false);//false
72370                 }
72371                 node2.ownerDocument = doc;
72372                 node2.parentNode = null;
72373                 if(deep){
72374                         var child = node.firstChild;
72375                         while(child){
72376                                 node2.appendChild(importNode(doc,child,deep));
72377                                 child = child.nextSibling;
72378                         }
72379                 }
72380                 return node2;
72381         }
72382         //
72383         //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
72384         //                                      attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
72385         function cloneNode(doc,node,deep){
72386                 var node2 = new node.constructor();
72387                 for(var n in node){
72388                         var v = node[n];
72389                         if(typeof v != 'object' ){
72390                                 if(v != node2[n]){
72391                                         node2[n] = v;
72392                                 }
72393                         }
72394                 }
72395                 if(node.childNodes){
72396                         node2.childNodes = new NodeList();
72397                 }
72398                 node2.ownerDocument = doc;
72399                 switch (node2.nodeType) {
72400                 case ELEMENT_NODE:
72401                         var attrs       = node.attributes;
72402                         var attrs2      = node2.attributes = new NamedNodeMap();
72403                         var len = attrs.length;
72404                         attrs2._ownerElement = node2;
72405                         for(var i=0;i<len;i++){
72406                                 node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
72407                         }
72408                         break;
72409                 case ATTRIBUTE_NODE:
72410                         deep = true;
72411                 }
72412                 if(deep){
72413                         var child = node.firstChild;
72414                         while(child){
72415                                 node2.appendChild(cloneNode(doc,child,deep));
72416                                 child = child.nextSibling;
72417                         }
72418                 }
72419                 return node2;
72420         }
72421
72422         function __set__(object,key,value){
72423                 object[key] = value;
72424         }
72425         //do dynamic
72426         try{
72427                 if(Object.defineProperty){
72428                         Object.defineProperty(LiveNodeList.prototype,'length',{
72429                                 get:function(){
72430                                         _updateLiveList(this);
72431                                         return this.$$length;
72432                                 }
72433                         });
72434                         Object.defineProperty(Node$2.prototype,'textContent',{
72435                                 get:function(){
72436                                         return getTextContent(this);
72437                                 },
72438                                 set:function(data){
72439                                         switch(this.nodeType){
72440                                         case ELEMENT_NODE:
72441                                         case DOCUMENT_FRAGMENT_NODE:
72442                                                 while(this.firstChild){
72443                                                         this.removeChild(this.firstChild);
72444                                                 }
72445                                                 if(data || String(data)){
72446                                                         this.appendChild(this.ownerDocument.createTextNode(data));
72447                                                 }
72448                                                 break;
72449                                         default:
72450                                                 //TODO:
72451                                                 this.data = data;
72452                                                 this.value = data;
72453                                                 this.nodeValue = data;
72454                                         }
72455                                 }
72456                         });
72457                         
72458                         function getTextContent(node){
72459                                 switch(node.nodeType){
72460                                 case ELEMENT_NODE:
72461                                 case DOCUMENT_FRAGMENT_NODE:
72462                                         var buf = [];
72463                                         node = node.firstChild;
72464                                         while(node){
72465                                                 if(node.nodeType!==7 && node.nodeType !==8){
72466                                                         buf.push(getTextContent(node));
72467                                                 }
72468                                                 node = node.nextSibling;
72469                                         }
72470                                         return buf.join('');
72471                                 default:
72472                                         return node.nodeValue;
72473                                 }
72474                         }
72475                         __set__ = function(object,key,value){
72476                                 //console.log(value)
72477                                 object['$$'+key] = value;
72478                         };
72479                 }
72480         }catch(e){//ie8
72481         }
72482
72483         //if(typeof require == 'function'){
72484                 var DOMImplementation_1 = DOMImplementation;
72485                 var XMLSerializer_1 = XMLSerializer$1;
72486         //}
72487
72488         var dom = {
72489                 DOMImplementation: DOMImplementation_1,
72490                 XMLSerializer: XMLSerializer_1
72491         };
72492
72493         var domParser = createCommonjsModule(function (module, exports) {
72494         function DOMParser(options){
72495                 this.options = options ||{locator:{}};
72496                 
72497         }
72498         DOMParser.prototype.parseFromString = function(source,mimeType){
72499                 var options = this.options;
72500                 var sax =  new XMLReader();
72501                 var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
72502                 var errorHandler = options.errorHandler;
72503                 var locator = options.locator;
72504                 var defaultNSMap = options.xmlns||{};
72505                 var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
72506                 if(locator){
72507                         domBuilder.setDocumentLocator(locator);
72508                 }
72509                 
72510                 sax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
72511                 sax.domBuilder = options.domBuilder || domBuilder;
72512                 if(/\/x?html?$/.test(mimeType)){
72513                         entityMap.nbsp = '\xa0';
72514                         entityMap.copy = '\xa9';
72515                         defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
72516                 }
72517                 defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
72518                 if(source){
72519                         sax.parse(source,defaultNSMap,entityMap);
72520                 }else{
72521                         sax.errorHandler.error("invalid doc source");
72522                 }
72523                 return domBuilder.doc;
72524         };
72525         function buildErrorHandler(errorImpl,domBuilder,locator){
72526                 if(!errorImpl){
72527                         if(domBuilder instanceof DOMHandler){
72528                                 return domBuilder;
72529                         }
72530                         errorImpl = domBuilder ;
72531                 }
72532                 var errorHandler = {};
72533                 var isCallback = errorImpl instanceof Function;
72534                 locator = locator||{};
72535                 function build(key){
72536                         var fn = errorImpl[key];
72537                         if(!fn && isCallback){
72538                                 fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
72539                         }
72540                         errorHandler[key] = fn && function(msg){
72541                                 fn('[xmldom '+key+']\t'+msg+_locator(locator));
72542                         }||function(){};
72543                 }
72544                 build('warning');
72545                 build('error');
72546                 build('fatalError');
72547                 return errorHandler;
72548         }
72549
72550         //console.log('#\n\n\n\n\n\n\n####')
72551         /**
72552          * +ContentHandler+ErrorHandler
72553          * +LexicalHandler+EntityResolver2
72554          * -DeclHandler-DTDHandler 
72555          * 
72556          * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
72557          * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
72558          * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
72559          */
72560         function DOMHandler() {
72561             this.cdata = false;
72562         }
72563         function position(locator,node){
72564                 node.lineNumber = locator.lineNumber;
72565                 node.columnNumber = locator.columnNumber;
72566         }
72567         /**
72568          * @see org.xml.sax.ContentHandler#startDocument
72569          * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
72570          */ 
72571         DOMHandler.prototype = {
72572                 startDocument : function() {
72573                 this.doc = new DOMImplementation().createDocument(null, null, null);
72574                 if (this.locator) {
72575                         this.doc.documentURI = this.locator.systemId;
72576                 }
72577                 },
72578                 startElement:function(namespaceURI, localName, qName, attrs) {
72579                         var doc = this.doc;
72580                     var el = doc.createElementNS(namespaceURI, qName||localName);
72581                     var len = attrs.length;
72582                     appendElement(this, el);
72583                     this.currentElement = el;
72584                     
72585                         this.locator && position(this.locator,el);
72586                     for (var i = 0 ; i < len; i++) {
72587                         var namespaceURI = attrs.getURI(i);
72588                         var value = attrs.getValue(i);
72589                         var qName = attrs.getQName(i);
72590                                 var attr = doc.createAttributeNS(namespaceURI, qName);
72591                                 this.locator &&position(attrs.getLocator(i),attr);
72592                                 attr.value = attr.nodeValue = value;
72593                                 el.setAttributeNode(attr);
72594                     }
72595                 },
72596                 endElement:function(namespaceURI, localName, qName) {
72597                         var current = this.currentElement;
72598                         var tagName = current.tagName;
72599                         this.currentElement = current.parentNode;
72600                 },
72601                 startPrefixMapping:function(prefix, uri) {
72602                 },
72603                 endPrefixMapping:function(prefix) {
72604                 },
72605                 processingInstruction:function(target, data) {
72606                     var ins = this.doc.createProcessingInstruction(target, data);
72607                     this.locator && position(this.locator,ins);
72608                     appendElement(this, ins);
72609                 },
72610                 ignorableWhitespace:function(ch, start, length) {
72611                 },
72612                 characters:function(chars, start, length) {
72613                         chars = _toString.apply(this,arguments);
72614                         //console.log(chars)
72615                         if(chars){
72616                                 if (this.cdata) {
72617                                         var charNode = this.doc.createCDATASection(chars);
72618                                 } else {
72619                                         var charNode = this.doc.createTextNode(chars);
72620                                 }
72621                                 if(this.currentElement){
72622                                         this.currentElement.appendChild(charNode);
72623                                 }else if(/^\s*$/.test(chars)){
72624                                         this.doc.appendChild(charNode);
72625                                         //process xml
72626                                 }
72627                                 this.locator && position(this.locator,charNode);
72628                         }
72629                 },
72630                 skippedEntity:function(name) {
72631                 },
72632                 endDocument:function() {
72633                         this.doc.normalize();
72634                 },
72635                 setDocumentLocator:function (locator) {
72636                     if(this.locator = locator){// && !('lineNumber' in locator)){
72637                         locator.lineNumber = 0;
72638                     }
72639                 },
72640                 //LexicalHandler
72641                 comment:function(chars, start, length) {
72642                         chars = _toString.apply(this,arguments);
72643                     var comm = this.doc.createComment(chars);
72644                     this.locator && position(this.locator,comm);
72645                     appendElement(this, comm);
72646                 },
72647                 
72648                 startCDATA:function() {
72649                     //used in characters() methods
72650                     this.cdata = true;
72651                 },
72652                 endCDATA:function() {
72653                     this.cdata = false;
72654                 },
72655                 
72656                 startDTD:function(name, publicId, systemId) {
72657                         var impl = this.doc.implementation;
72658                     if (impl && impl.createDocumentType) {
72659                         var dt = impl.createDocumentType(name, publicId, systemId);
72660                         this.locator && position(this.locator,dt);
72661                         appendElement(this, dt);
72662                     }
72663                 },
72664                 /**
72665                  * @see org.xml.sax.ErrorHandler
72666                  * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
72667                  */
72668                 warning:function(error) {
72669                         console.warn('[xmldom warning]\t'+error,_locator(this.locator));
72670                 },
72671                 error:function(error) {
72672                         console.error('[xmldom error]\t'+error,_locator(this.locator));
72673                 },
72674                 fatalError:function(error) {
72675                         console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
72676                     throw error;
72677                 }
72678         };
72679         function _locator(l){
72680                 if(l){
72681                         return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
72682                 }
72683         }
72684         function _toString(chars,start,length){
72685                 if(typeof chars == 'string'){
72686                         return chars.substr(start,length)
72687                 }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
72688                         if(chars.length >= start+length || start){
72689                                 return new java.lang.String(chars,start,length)+'';
72690                         }
72691                         return chars;
72692                 }
72693         }
72694
72695         /*
72696          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
72697          * used method of org.xml.sax.ext.LexicalHandler:
72698          *  #comment(chars, start, length)
72699          *  #startCDATA()
72700          *  #endCDATA()
72701          *  #startDTD(name, publicId, systemId)
72702          *
72703          *
72704          * IGNORED method of org.xml.sax.ext.LexicalHandler:
72705          *  #endDTD()
72706          *  #startEntity(name)
72707          *  #endEntity(name)
72708          *
72709          *
72710          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
72711          * IGNORED method of org.xml.sax.ext.DeclHandler
72712          *      #attributeDecl(eName, aName, type, mode, value)
72713          *  #elementDecl(name, model)
72714          *  #externalEntityDecl(name, publicId, systemId)
72715          *  #internalEntityDecl(name, value)
72716          * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
72717          * IGNORED method of org.xml.sax.EntityResolver2
72718          *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
72719          *  #resolveEntity(publicId, systemId)
72720          *  #getExternalSubset(name, baseURI)
72721          * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
72722          * IGNORED method of org.xml.sax.DTDHandler
72723          *  #notationDecl(name, publicId, systemId) {};
72724          *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
72725          */
72726         "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
72727                 DOMHandler.prototype[key] = function(){return null};
72728         });
72729
72730         /* 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 */
72731         function appendElement (hander,node) {
72732             if (!hander.currentElement) {
72733                 hander.doc.appendChild(node);
72734             } else {
72735                 hander.currentElement.appendChild(node);
72736             }
72737         }//appendChild and setAttributeNS are preformance key
72738
72739         //if(typeof require == 'function'){
72740                 var XMLReader = sax.XMLReader;
72741                 var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
72742                 exports.XMLSerializer = dom.XMLSerializer ;
72743                 exports.DOMParser = DOMParser;
72744         //}
72745         });
72746         var domParser_1 = domParser.DOMImplementation;
72747         var domParser_2 = domParser.XMLSerializer;
72748         var domParser_3 = domParser.DOMParser;
72749
72750         var togeojson = createCommonjsModule(function (module, exports) {
72751         var toGeoJSON = (function() {
72752
72753             var removeSpace = /\s*/g,
72754                 trimSpace = /^\s*|\s*$/g,
72755                 splitSpace = /\s+/;
72756             // generate a short, numeric hash of a string
72757             function okhash(x) {
72758                 if (!x || !x.length) return 0;
72759                 for (var i = 0, h = 0; i < x.length; i++) {
72760                     h = ((h << 5) - h) + x.charCodeAt(i) | 0;
72761                 } return h;
72762             }
72763             // all Y children of X
72764             function get(x, y) { return x.getElementsByTagName(y); }
72765             function attr(x, y) { return x.getAttribute(y); }
72766             function attrf(x, y) { return parseFloat(attr(x, y)); }
72767             // one Y child of X, if any, otherwise null
72768             function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
72769             // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
72770             function norm(el) { if (el.normalize) { el.normalize(); } return el; }
72771             // cast array x into numbers
72772             function numarray(x) {
72773                 for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
72774                 return o;
72775             }
72776             // get the content of a text node, if any
72777             function nodeVal(x) {
72778                 if (x) { norm(x); }
72779                 return (x && x.textContent) || '';
72780             }
72781             // get the contents of multiple text nodes, if present
72782             function getMulti(x, ys) {
72783                 var o = {}, n, k;
72784                 for (k = 0; k < ys.length; k++) {
72785                     n = get1(x, ys[k]);
72786                     if (n) o[ys[k]] = nodeVal(n);
72787                 }
72788                 return o;
72789             }
72790             // add properties of Y to X, overwriting if present in both
72791             function extend(x, y) { for (var k in y) x[k] = y[k]; }
72792             // get one coordinate from a coordinate array, if any
72793             function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
72794             // get all coordinates from a coordinate array as [[],[]]
72795             function coord(v) {
72796                 var coords = v.replace(trimSpace, '').split(splitSpace),
72797                     o = [];
72798                 for (var i = 0; i < coords.length; i++) {
72799                     o.push(coord1(coords[i]));
72800                 }
72801                 return o;
72802             }
72803             function coordPair(x) {
72804                 var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
72805                     ele = get1(x, 'ele'),
72806                     // handle namespaced attribute in browser
72807                     heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
72808                     time = get1(x, 'time'),
72809                     e;
72810                 if (ele) {
72811                     e = parseFloat(nodeVal(ele));
72812                     if (!isNaN(e)) {
72813                         ll.push(e);
72814                     }
72815                 }
72816                 return {
72817                     coordinates: ll,
72818                     time: time ? nodeVal(time) : null,
72819                     heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
72820                 };
72821             }
72822
72823             // create a new feature collection parent object
72824             function fc() {
72825                 return {
72826                     type: 'FeatureCollection',
72827                     features: []
72828                 };
72829             }
72830
72831             var serializer;
72832             if (typeof XMLSerializer !== 'undefined') {
72833                 /* istanbul ignore next */
72834                 serializer = new XMLSerializer();
72835             // only require xmldom in a node environment
72836             } else if (typeof process === 'object' && !process.browser) {
72837                 serializer = new (domParser.XMLSerializer)();
72838             }
72839             function xml2str(str) {
72840                 // IE9 will create a new XMLSerializer but it'll crash immediately.
72841                 // This line is ignored because we don't run coverage tests in IE9
72842                 /* istanbul ignore next */
72843                 if (str.xml !== undefined) return str.xml;
72844                 return serializer.serializeToString(str);
72845             }
72846
72847             var t = {
72848                 kml: function(doc) {
72849
72850                     var gj = fc(),
72851                         // styleindex keeps track of hashed styles in order to match features
72852                         styleIndex = {}, styleByHash = {},
72853                         // stylemapindex keeps track of style maps to expose in properties
72854                         styleMapIndex = {},
72855                         // atomic geospatial types supported by KML - MultiGeometry is
72856                         // handled separately
72857                         geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
72858                         // all root placemarks in the file
72859                         placemarks = get(doc, 'Placemark'),
72860                         styles = get(doc, 'Style'),
72861                         styleMaps = get(doc, 'StyleMap');
72862
72863                     for (var k = 0; k < styles.length; k++) {
72864                         var hash = okhash(xml2str(styles[k])).toString(16);
72865                         styleIndex['#' + attr(styles[k], 'id')] = hash;
72866                         styleByHash[hash] = styles[k];
72867                     }
72868                     for (var l = 0; l < styleMaps.length; l++) {
72869                         styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
72870                         var pairs = get(styleMaps[l], 'Pair');
72871                         var pairsMap = {};
72872                         for (var m = 0; m < pairs.length; m++) {
72873                             pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
72874                         }
72875                         styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
72876
72877                     }
72878                     for (var j = 0; j < placemarks.length; j++) {
72879                         gj.features = gj.features.concat(getPlacemark(placemarks[j]));
72880                     }
72881                     function kmlColor(v) {
72882                         var color, opacity;
72883                         v = v || '';
72884                         if (v.substr(0, 1) === '#') { v = v.substr(1); }
72885                         if (v.length === 6 || v.length === 3) { color = v; }
72886                         if (v.length === 8) {
72887                             opacity = parseInt(v.substr(0, 2), 16) / 255;
72888                             color = '#' + v.substr(6, 2) +
72889                                 v.substr(4, 2) +
72890                                 v.substr(2, 2);
72891                         }
72892                         return [color, isNaN(opacity) ? undefined : opacity];
72893                     }
72894                     function gxCoord(v) { return numarray(v.split(' ')); }
72895                     function gxCoords(root) {
72896                         var elems = get(root, 'coord', 'gx'), coords = [], times = [];
72897                         if (elems.length === 0) elems = get(root, 'gx:coord');
72898                         for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
72899                         var timeElems = get(root, 'when');
72900                         for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
72901                         return {
72902                             coords: coords,
72903                             times: times
72904                         };
72905                     }
72906                     function getGeometry(root) {
72907                         var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
72908                         if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
72909                         if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
72910                         if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
72911                         for (i = 0; i < geotypes.length; i++) {
72912                             geomNodes = get(root, geotypes[i]);
72913                             if (geomNodes) {
72914                                 for (j = 0; j < geomNodes.length; j++) {
72915                                     geomNode = geomNodes[j];
72916                                     if (geotypes[i] === 'Point') {
72917                                         geoms.push({
72918                                             type: 'Point',
72919                                             coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
72920                                         });
72921                                     } else if (geotypes[i] === 'LineString') {
72922                                         geoms.push({
72923                                             type: 'LineString',
72924                                             coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
72925                                         });
72926                                     } else if (geotypes[i] === 'Polygon') {
72927                                         var rings = get(geomNode, 'LinearRing'),
72928                                             coords = [];
72929                                         for (k = 0; k < rings.length; k++) {
72930                                             coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
72931                                         }
72932                                         geoms.push({
72933                                             type: 'Polygon',
72934                                             coordinates: coords
72935                                         });
72936                                     } else if (geotypes[i] === 'Track' ||
72937                                         geotypes[i] === 'gx:Track') {
72938                                         var track = gxCoords(geomNode);
72939                                         geoms.push({
72940                                             type: 'LineString',
72941                                             coordinates: track.coords
72942                                         });
72943                                         if (track.times.length) coordTimes.push(track.times);
72944                                     }
72945                                 }
72946                             }
72947                         }
72948                         return {
72949                             geoms: geoms,
72950                             coordTimes: coordTimes
72951                         };
72952                     }
72953                     function getPlacemark(root) {
72954                         var geomsAndTimes = getGeometry(root), i, properties = {},
72955                             name = nodeVal(get1(root, 'name')),
72956                             address = nodeVal(get1(root, 'address')),
72957                             styleUrl = nodeVal(get1(root, 'styleUrl')),
72958                             description = nodeVal(get1(root, 'description')),
72959                             timeSpan = get1(root, 'TimeSpan'),
72960                             timeStamp = get1(root, 'TimeStamp'),
72961                             extendedData = get1(root, 'ExtendedData'),
72962                             lineStyle = get1(root, 'LineStyle'),
72963                             polyStyle = get1(root, 'PolyStyle'),
72964                             visibility = get1(root, 'visibility');
72965
72966                         if (!geomsAndTimes.geoms.length) return [];
72967                         if (name) properties.name = name;
72968                         if (address) properties.address = address;
72969                         if (styleUrl) {
72970                             if (styleUrl[0] !== '#') {
72971                                 styleUrl = '#' + styleUrl;
72972                             }
72973
72974                             properties.styleUrl = styleUrl;
72975                             if (styleIndex[styleUrl]) {
72976                                 properties.styleHash = styleIndex[styleUrl];
72977                             }
72978                             if (styleMapIndex[styleUrl]) {
72979                                 properties.styleMapHash = styleMapIndex[styleUrl];
72980                                 properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
72981                             }
72982                             // Try to populate the lineStyle or polyStyle since we got the style hash
72983                             var style = styleByHash[properties.styleHash];
72984                             if (style) {
72985                                 if (!lineStyle) lineStyle = get1(style, 'LineStyle');
72986                                 if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
72987                             }
72988                         }
72989                         if (description) properties.description = description;
72990                         if (timeSpan) {
72991                             var begin = nodeVal(get1(timeSpan, 'begin'));
72992                             var end = nodeVal(get1(timeSpan, 'end'));
72993                             properties.timespan = { begin: begin, end: end };
72994                         }
72995                         if (timeStamp) {
72996                             properties.timestamp = nodeVal(get1(timeStamp, 'when'));
72997                         }
72998                         if (lineStyle) {
72999                             var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
73000                                 color = linestyles[0],
73001                                 opacity = linestyles[1],
73002                                 width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73003                             if (color) properties.stroke = color;
73004                             if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
73005                             if (!isNaN(width)) properties['stroke-width'] = width;
73006                         }
73007                         if (polyStyle) {
73008                             var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
73009                                 pcolor = polystyles[0],
73010                                 popacity = polystyles[1],
73011                                 fill = nodeVal(get1(polyStyle, 'fill')),
73012                                 outline = nodeVal(get1(polyStyle, 'outline'));
73013                             if (pcolor) properties.fill = pcolor;
73014                             if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
73015                             if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
73016                             if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
73017                         }
73018                         if (extendedData) {
73019                             var datas = get(extendedData, 'Data'),
73020                                 simpleDatas = get(extendedData, 'SimpleData');
73021
73022                             for (i = 0; i < datas.length; i++) {
73023                                 properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
73024                             }
73025                             for (i = 0; i < simpleDatas.length; i++) {
73026                                 properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
73027                             }
73028                         }
73029                         if (visibility) {
73030                             properties.visibility = nodeVal(visibility);
73031                         }
73032                         if (geomsAndTimes.coordTimes.length) {
73033                             properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
73034                                 geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
73035                         }
73036                         var feature = {
73037                             type: 'Feature',
73038                             geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
73039                                 type: 'GeometryCollection',
73040                                 geometries: geomsAndTimes.geoms
73041                             },
73042                             properties: properties
73043                         };
73044                         if (attr(root, 'id')) feature.id = attr(root, 'id');
73045                         return [feature];
73046                     }
73047                     return gj;
73048                 },
73049                 gpx: function(doc) {
73050                     var i,
73051                         tracks = get(doc, 'trk'),
73052                         routes = get(doc, 'rte'),
73053                         waypoints = get(doc, 'wpt'),
73054                         // a feature collection
73055                         gj = fc(),
73056                         feature;
73057                     for (i = 0; i < tracks.length; i++) {
73058                         feature = getTrack(tracks[i]);
73059                         if (feature) gj.features.push(feature);
73060                     }
73061                     for (i = 0; i < routes.length; i++) {
73062                         feature = getRoute(routes[i]);
73063                         if (feature) gj.features.push(feature);
73064                     }
73065                     for (i = 0; i < waypoints.length; i++) {
73066                         gj.features.push(getPoint(waypoints[i]));
73067                     }
73068                     function getPoints(node, pointname) {
73069                         var pts = get(node, pointname),
73070                             line = [],
73071                             times = [],
73072                             heartRates = [],
73073                             l = pts.length;
73074                         if (l < 2) return {};  // Invalid line in GeoJSON
73075                         for (var i = 0; i < l; i++) {
73076                             var c = coordPair(pts[i]);
73077                             line.push(c.coordinates);
73078                             if (c.time) times.push(c.time);
73079                             if (c.heartRate) heartRates.push(c.heartRate);
73080                         }
73081                         return {
73082                             line: line,
73083                             times: times,
73084                             heartRates: heartRates
73085                         };
73086                     }
73087                     function getTrack(node) {
73088                         var segments = get(node, 'trkseg'),
73089                             track = [],
73090                             times = [],
73091                             heartRates = [],
73092                             line;
73093                         for (var i = 0; i < segments.length; i++) {
73094                             line = getPoints(segments[i], 'trkpt');
73095                             if (line) {
73096                                 if (line.line) track.push(line.line);
73097                                 if (line.times && line.times.length) times.push(line.times);
73098                                 if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
73099                             }
73100                         }
73101                         if (track.length === 0) return;
73102                         var properties = getProperties(node);
73103                         extend(properties, getLineStyle(get1(node, 'extensions')));
73104                         if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
73105                         if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
73106                         return {
73107                             type: 'Feature',
73108                             properties: properties,
73109                             geometry: {
73110                                 type: track.length === 1 ? 'LineString' : 'MultiLineString',
73111                                 coordinates: track.length === 1 ? track[0] : track
73112                             }
73113                         };
73114                     }
73115                     function getRoute(node) {
73116                         var line = getPoints(node, 'rtept');
73117                         if (!line.line) return;
73118                         var prop = getProperties(node);
73119                         extend(prop, getLineStyle(get1(node, 'extensions')));
73120                         var routeObj = {
73121                             type: 'Feature',
73122                             properties: prop,
73123                             geometry: {
73124                                 type: 'LineString',
73125                                 coordinates: line.line
73126                             }
73127                         };
73128                         return routeObj;
73129                     }
73130                     function getPoint(node) {
73131                         var prop = getProperties(node);
73132                         extend(prop, getMulti(node, ['sym']));
73133                         return {
73134                             type: 'Feature',
73135                             properties: prop,
73136                             geometry: {
73137                                 type: 'Point',
73138                                 coordinates: coordPair(node).coordinates
73139                             }
73140                         };
73141                     }
73142                     function getLineStyle(extensions) {
73143                         var style = {};
73144                         if (extensions) {
73145                             var lineStyle = get1(extensions, 'line');
73146                             if (lineStyle) {
73147                                 var color = nodeVal(get1(lineStyle, 'color')),
73148                                     opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
73149                                     width = parseFloat(nodeVal(get1(lineStyle, 'width')));
73150                                 if (color) style.stroke = color;
73151                                 if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
73152                                 // GPX width is in mm, convert to px with 96 px per inch
73153                                 if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
73154                             }
73155                         }
73156                         return style;
73157                     }
73158                     function getProperties(node) {
73159                         var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
73160                             links = get(node, 'link');
73161                         if (links.length) prop.links = [];
73162                         for (var i = 0, link; i < links.length; i++) {
73163                             link = { href: attr(links[i], 'href') };
73164                             extend(link, getMulti(links[i], ['text', 'type']));
73165                             prop.links.push(link);
73166                         }
73167                         return prop;
73168                     }
73169                     return gj;
73170                 }
73171             };
73172             return t;
73173         })();
73174
73175         module.exports = toGeoJSON;
73176         });
73177
73178         var _initialized = false;
73179         var _enabled = false;
73180         var _geojson;
73181
73182
73183         function svgData(projection, context, dispatch) {
73184             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73185             var _showLabels = true;
73186             var detected = utilDetect();
73187             var layer = d3_select(null);
73188             var _vtService;
73189             var _fileList;
73190             var _template;
73191             var _src;
73192
73193
73194             function init() {
73195                 if (_initialized) return;  // run once
73196
73197                 _geojson = {};
73198                 _enabled = true;
73199
73200                 function over() {
73201                     event.stopPropagation();
73202                     event.preventDefault();
73203                     event.dataTransfer.dropEffect = 'copy';
73204                 }
73205
73206                 d3_select('body')
73207                     .attr('dropzone', 'copy')
73208                     .on('drop.svgData', function() {
73209                         event.stopPropagation();
73210                         event.preventDefault();
73211                         if (!detected.filedrop) return;
73212                         drawData.fileList(event.dataTransfer.files);
73213                     })
73214                     .on('dragenter.svgData', over)
73215                     .on('dragexit.svgData', over)
73216                     .on('dragover.svgData', over);
73217
73218                 _initialized = true;
73219             }
73220
73221
73222             function getService() {
73223                 if (services$1.vectorTile && !_vtService) {
73224                     _vtService = services$1.vectorTile;
73225                     _vtService.event.on('loadedData', throttledRedraw);
73226                 } else if (!services$1.vectorTile && _vtService) {
73227                     _vtService = null;
73228                 }
73229
73230                 return _vtService;
73231             }
73232
73233
73234             function showLayer() {
73235                 layerOn();
73236
73237                 layer
73238                     .style('opacity', 0)
73239                     .transition()
73240                     .duration(250)
73241                     .style('opacity', 1)
73242                     .on('end', function () { dispatch.call('change'); });
73243             }
73244
73245
73246             function hideLayer() {
73247                 throttledRedraw.cancel();
73248
73249                 layer
73250                     .transition()
73251                     .duration(250)
73252                     .style('opacity', 0)
73253                     .on('end', layerOff);
73254             }
73255
73256
73257             function layerOn() {
73258                 layer.style('display', 'block');
73259             }
73260
73261
73262             function layerOff() {
73263                 layer.selectAll('.viewfield-group').remove();
73264                 layer.style('display', 'none');
73265             }
73266
73267
73268             // ensure that all geojson features in a collection have IDs
73269             function ensureIDs(gj) {
73270                 if (!gj) return null;
73271
73272                 if (gj.type === 'FeatureCollection') {
73273                     for (var i = 0; i < gj.features.length; i++) {
73274                         ensureFeatureID(gj.features[i]);
73275                     }
73276                 } else {
73277                     ensureFeatureID(gj);
73278                 }
73279                 return gj;
73280             }
73281
73282
73283             // ensure that each single Feature object has a unique ID
73284             function ensureFeatureID(feature) {
73285                 if (!feature) return;
73286                 feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
73287                 return feature;
73288             }
73289
73290
73291             // Prefer an array of Features instead of a FeatureCollection
73292             function getFeatures(gj) {
73293                 if (!gj) return [];
73294
73295                 if (gj.type === 'FeatureCollection') {
73296                     return gj.features;
73297                 } else {
73298                     return [gj];
73299                 }
73300             }
73301
73302
73303             function featureKey(d) {
73304                 return d.__featurehash__;
73305             }
73306
73307
73308             function isPolygon(d) {
73309                 return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
73310             }
73311
73312
73313             function clipPathID(d) {
73314                 return 'data-' + d.__featurehash__ + '-clippath';
73315             }
73316
73317
73318             function featureClasses(d) {
73319                 return [
73320                     'data' + d.__featurehash__,
73321                     d.geometry.type,
73322                     isPolygon(d) ? 'area' : '',
73323                     d.__layerID__ || ''
73324                 ].filter(Boolean).join(' ');
73325             }
73326
73327
73328             function drawData(selection) {
73329                 var vtService = getService();
73330                 var getPath = svgPath(projection).geojson;
73331                 var getAreaPath = svgPath(projection, null, true).geojson;
73332                 var hasData = drawData.hasData();
73333
73334                 layer = selection.selectAll('.layer-mapdata')
73335                     .data(_enabled && hasData ? [0] : []);
73336
73337                 layer.exit()
73338                     .remove();
73339
73340                 layer = layer.enter()
73341                     .append('g')
73342                     .attr('class', 'layer-mapdata')
73343                     .merge(layer);
73344
73345                 var surface = context.surface();
73346                 if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
73347
73348
73349                 // Gather data
73350                 var geoData, polygonData;
73351                 if (_template && vtService) {   // fetch data from vector tile service
73352                     var sourceID = _template;
73353                     vtService.loadTiles(sourceID, _template, projection);
73354                     geoData = vtService.data(sourceID, projection);
73355                 } else {
73356                     geoData = getFeatures(_geojson);
73357                 }
73358                 geoData = geoData.filter(getPath);
73359                 polygonData = geoData.filter(isPolygon);
73360
73361
73362                 // Draw clip paths for polygons
73363                 var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
73364                    .data(polygonData, featureKey);
73365
73366                 clipPaths.exit()
73367                    .remove();
73368
73369                 var clipPathsEnter = clipPaths.enter()
73370                    .append('clipPath')
73371                    .attr('class', 'clipPath-data')
73372                    .attr('id', clipPathID);
73373
73374                 clipPathsEnter
73375                    .append('path');
73376
73377                 clipPaths.merge(clipPathsEnter)
73378                    .selectAll('path')
73379                    .attr('d', getAreaPath);
73380
73381
73382                 // Draw fill, shadow, stroke layers
73383                 var datagroups = layer
73384                     .selectAll('g.datagroup')
73385                     .data(['fill', 'shadow', 'stroke']);
73386
73387                 datagroups = datagroups.enter()
73388                     .append('g')
73389                     .attr('class', function(d) { return 'datagroup datagroup-' + d; })
73390                     .merge(datagroups);
73391
73392
73393                 // Draw paths
73394                 var pathData = {
73395                     fill: polygonData,
73396                     shadow: geoData,
73397                     stroke: geoData
73398                 };
73399
73400                 var paths = datagroups
73401                     .selectAll('path')
73402                     .data(function(layer) { return pathData[layer]; }, featureKey);
73403
73404                 // exit
73405                 paths.exit()
73406                     .remove();
73407
73408                 // enter/update
73409                 paths = paths.enter()
73410                     .append('path')
73411                     .attr('class', function(d) {
73412                         var datagroup = this.parentNode.__data__;
73413                         return 'pathdata ' + datagroup + ' ' + featureClasses(d);
73414                     })
73415                     .attr('clip-path', function(d) {
73416                         var datagroup = this.parentNode.__data__;
73417                         return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
73418                     })
73419                     .merge(paths)
73420                     .attr('d', function(d) {
73421                         var datagroup = this.parentNode.__data__;
73422                         return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
73423                     });
73424
73425
73426                 // Draw labels
73427                 layer
73428                     .call(drawLabels, 'label-halo', geoData)
73429                     .call(drawLabels, 'label', geoData);
73430
73431
73432                 function drawLabels(selection, textClass, data) {
73433                     var labelPath = d3_geoPath(projection);
73434                     var labelData = data.filter(function(d) {
73435                         return _showLabels && d.properties && (d.properties.desc || d.properties.name);
73436                     });
73437
73438                     var labels = selection.selectAll('text.' + textClass)
73439                         .data(labelData, featureKey);
73440
73441                     // exit
73442                     labels.exit()
73443                         .remove();
73444
73445                     // enter/update
73446                     labels = labels.enter()
73447                         .append('text')
73448                         .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
73449                         .merge(labels)
73450                         .text(function(d) {
73451                             return d.properties.desc || d.properties.name;
73452                         })
73453                         .attr('x', function(d) {
73454                             var centroid = labelPath.centroid(d);
73455                             return centroid[0] + 11;
73456                         })
73457                         .attr('y', function(d) {
73458                             var centroid = labelPath.centroid(d);
73459                             return centroid[1];
73460                         });
73461                 }
73462             }
73463
73464
73465             function getExtension(fileName) {
73466                 if (!fileName) return;
73467
73468                 var re = /\.(gpx|kml|(geo)?json)$/i;
73469                 var match = fileName.toLowerCase().match(re);
73470                 return match && match.length && match[0];
73471             }
73472
73473
73474             function xmlToDom(textdata) {
73475                 return (new DOMParser()).parseFromString(textdata, 'text/xml');
73476             }
73477
73478
73479             drawData.setFile = function(extension, data) {
73480                 _template = null;
73481                 _fileList = null;
73482                 _geojson = null;
73483                 _src = null;
73484
73485                 var gj;
73486                 switch (extension) {
73487                     case '.gpx':
73488                         gj = togeojson.gpx(xmlToDom(data));
73489                         break;
73490                     case '.kml':
73491                         gj = togeojson.kml(xmlToDom(data));
73492                         break;
73493                     case '.geojson':
73494                     case '.json':
73495                         gj = JSON.parse(data);
73496                         break;
73497                 }
73498
73499                 gj = gj || {};
73500                 if (Object.keys(gj).length) {
73501                     _geojson = ensureIDs(gj);
73502                     _src = extension + ' data file';
73503                     this.fitZoom();
73504                 }
73505
73506                 dispatch.call('change');
73507                 return this;
73508             };
73509
73510
73511             drawData.showLabels = function(val) {
73512                 if (!arguments.length) return _showLabels;
73513
73514                 _showLabels = val;
73515                 return this;
73516             };
73517
73518
73519             drawData.enabled = function(val) {
73520                 if (!arguments.length) return _enabled;
73521
73522                 _enabled = val;
73523                 if (_enabled) {
73524                     showLayer();
73525                 } else {
73526                     hideLayer();
73527                 }
73528
73529                 dispatch.call('change');
73530                 return this;
73531             };
73532
73533
73534             drawData.hasData = function() {
73535                 var gj = _geojson || {};
73536                 return !!(_template || Object.keys(gj).length);
73537             };
73538
73539
73540             drawData.template = function(val, src) {
73541                 if (!arguments.length) return _template;
73542
73543                 // test source against OSM imagery blacklists..
73544                 var osm = context.connection();
73545                 if (osm) {
73546                     var blacklists = osm.imageryBlacklists();
73547                     var fail = false;
73548                     var tested = 0;
73549                     var regex;
73550
73551                     for (var i = 0; i < blacklists.length; i++) {
73552                         try {
73553                             regex = new RegExp(blacklists[i]);
73554                             fail = regex.test(val);
73555                             tested++;
73556                             if (fail) break;
73557                         } catch (e) {
73558                             /* noop */
73559                         }
73560                     }
73561
73562                     // ensure at least one test was run.
73563                     if (!tested) {
73564                         regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
73565                         fail = regex.test(val);
73566                     }
73567                 }
73568
73569                 _template = val;
73570                 _fileList = null;
73571                 _geojson = null;
73572
73573                 // strip off the querystring/hash from the template,
73574                 // it often includes the access token
73575                 _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
73576
73577                 dispatch.call('change');
73578                 return this;
73579             };
73580
73581
73582             drawData.geojson = function(gj, src) {
73583                 if (!arguments.length) return _geojson;
73584
73585                 _template = null;
73586                 _fileList = null;
73587                 _geojson = null;
73588                 _src = null;
73589
73590                 gj = gj || {};
73591                 if (Object.keys(gj).length) {
73592                     _geojson = ensureIDs(gj);
73593                     _src = src || 'unknown.geojson';
73594                 }
73595
73596                 dispatch.call('change');
73597                 return this;
73598             };
73599
73600
73601             drawData.fileList = function(fileList) {
73602                 if (!arguments.length) return _fileList;
73603
73604                 _template = null;
73605                 _fileList = fileList;
73606                 _geojson = null;
73607                 _src = null;
73608
73609                 if (!fileList || !fileList.length) return this;
73610                 var f = fileList[0];
73611                 var extension = getExtension(f.name);
73612                 var reader = new FileReader();
73613                 reader.onload = (function() {
73614                     return function(e) {
73615                         drawData.setFile(extension, e.target.result);
73616                     };
73617                 })(f);
73618
73619                 reader.readAsText(f);
73620
73621                 return this;
73622             };
73623
73624
73625             drawData.url = function(url, defaultExtension) {
73626                 _template = null;
73627                 _fileList = null;
73628                 _geojson = null;
73629                 _src = null;
73630
73631                 // strip off any querystring/hash from the url before checking extension
73632                 var testUrl = url.split(/[?#]/)[0];
73633                 var extension = getExtension(testUrl) || defaultExtension;
73634                 if (extension) {
73635                     _template = null;
73636                     d3_text(url)
73637                         .then(function(data) {
73638                             drawData.setFile(extension, data);
73639                         })
73640                         .catch(function() {
73641                             /* ignore */
73642                         });
73643
73644                 } else {
73645                     drawData.template(url);
73646                 }
73647
73648                 return this;
73649             };
73650
73651
73652             drawData.getSrc = function() {
73653                 return _src || '';
73654             };
73655
73656
73657             drawData.fitZoom = function() {
73658                 var features = getFeatures(_geojson);
73659                 if (!features.length) return;
73660
73661                 var map = context.map();
73662                 var viewport = map.trimmedExtent().polygon();
73663                 var coords = features.reduce(function(coords, feature) {
73664                     var c = feature.geometry.coordinates;
73665
73666                     /* eslint-disable no-fallthrough */
73667                     switch (feature.geometry.type) {
73668                         case 'Point':
73669                             c = [c];
73670                         case 'MultiPoint':
73671                         case 'LineString':
73672                             break;
73673
73674                         case 'MultiPolygon':
73675                             c = utilArrayFlatten(c);
73676                         case 'Polygon':
73677                         case 'MultiLineString':
73678                             c = utilArrayFlatten(c);
73679                             break;
73680                     }
73681                     /* eslint-enable no-fallthrough */
73682
73683                     return utilArrayUnion(coords, c);
73684                 }, []);
73685
73686                 if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
73687                     var extent = geoExtent(d3_geoBounds({ type: 'LineString', coordinates: coords }));
73688                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
73689                 }
73690
73691                 return this;
73692             };
73693
73694
73695             init();
73696             return drawData;
73697         }
73698
73699         function svgDebug(projection, context) {
73700
73701             function drawDebug(selection) {
73702                 var showsTile = context.getDebug('tile');
73703                 var showsCollision = context.getDebug('collision');
73704                 var showsImagery = context.getDebug('imagery');
73705                 var showsCommunity = context.getDebug('community');
73706                 var showsImperial = context.getDebug('imperial');
73707                 var showsDriveLeft = context.getDebug('driveLeft');
73708                 var showsTouchTargets = context.getDebug('target');
73709                 var showsDownloaded = context.getDebug('downloaded');
73710
73711                 var debugData = [];
73712                 if (showsTile) {
73713                     debugData.push({ class: 'red', label: 'tile' });
73714                 }
73715                 if (showsCollision) {
73716                     debugData.push({ class: 'yellow', label: 'collision' });
73717                 }
73718                 if (showsImagery) {
73719                     debugData.push({ class: 'orange', label: 'imagery' });
73720                 }
73721                 if (showsCommunity) {
73722                     debugData.push({ class: 'blue', label: 'community' });
73723                 }
73724                 if (showsImperial) {
73725                     debugData.push({ class: 'cyan', label: 'imperial' });
73726                 }
73727                 if (showsDriveLeft) {
73728                     debugData.push({ class: 'green', label: 'driveLeft' });
73729                 }
73730                 if (showsTouchTargets) {
73731                     debugData.push({ class: 'pink', label: 'touchTargets' });
73732                 }
73733                 if (showsDownloaded) {
73734                     debugData.push({ class: 'purple', label: 'downloaded' });
73735                 }
73736
73737
73738                 var legend = d3_select('#content')
73739                     .selectAll('.debug-legend')
73740                     .data(debugData.length ? [0] : []);
73741
73742                 legend.exit()
73743                     .remove();
73744
73745                 legend = legend.enter()
73746                     .append('div')
73747                     .attr('class', 'fillD debug-legend')
73748                     .merge(legend);
73749
73750
73751                 var legendItems = legend.selectAll('.debug-legend-item')
73752                     .data(debugData, function(d) { return d.label; });
73753
73754                 legendItems.exit()
73755                     .remove();
73756
73757                 legendItems.enter()
73758                     .append('span')
73759                     .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
73760                     .text(function(d) { return d.label; });
73761
73762
73763                 var layer = selection.selectAll('.layer-debug')
73764                     .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft || showsDownloaded ? [0] : []);
73765
73766                 layer.exit()
73767                     .remove();
73768
73769                 layer = layer.enter()
73770                     .append('g')
73771                     .attr('class', 'layer-debug')
73772                     .merge(layer);
73773
73774
73775                 // imagery
73776                 var extent = context.map().extent();
73777                 var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
73778                 var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
73779
73780                 var imagery = layer.selectAll('path.debug-imagery')
73781                     .data(features);
73782
73783                 imagery.exit()
73784                     .remove();
73785
73786                 imagery.enter()
73787                     .append('path')
73788                     .attr('class', 'debug-imagery debug orange');
73789
73790
73791                 // community index
73792                 var community = layer.selectAll('path.debug-community')
73793                     .data(showsCommunity ? Object.values(data.community.features) : []);
73794
73795                 community.exit()
73796                     .remove();
73797
73798                 community.enter()
73799                     .append('path')
73800                     .attr('class', 'debug-community debug blue');
73801
73802
73803                 // imperial
73804                 var imperial = layer
73805                     .selectAll('path.debug-imperial')
73806                     .data(showsImperial ? [dataImperial] : []);
73807
73808                 imperial.exit()
73809                     .remove();
73810
73811                 imperial.enter()
73812                     .append('path')
73813                     .attr('class', 'debug-imperial debug cyan');
73814
73815
73816                 // driveleft
73817                 var driveLeft = layer
73818                     .selectAll('path.debug-drive-left')
73819                     .data(showsDriveLeft ? [dataDriveLeft] : []);
73820
73821                 driveLeft.exit()
73822                     .remove();
73823
73824                 driveLeft.enter()
73825                     .append('path')
73826                     .attr('class', 'debug-drive-left debug green');
73827
73828
73829                 // downloaded
73830                 var osm = context.connection();
73831                 var dataDownloaded = [];
73832
73833                 if (osm) {
73834                     var rtree = osm.caches('get').tile.rtree;
73835                     dataDownloaded = rtree.all().map(function(bbox) {
73836                         return {
73837                             type: 'Feature',
73838                             properties: { id: bbox.id },
73839                             geometry: {
73840                                 type: 'Polygon',
73841                                 coordinates: [[
73842                                     [ bbox.minX, bbox.minY ],
73843                                     [ bbox.minX, bbox.maxY ],
73844                                     [ bbox.maxX, bbox.maxY ],
73845                                     [ bbox.maxX, bbox.minY ],
73846                                     [ bbox.minX, bbox.minY ]
73847                                 ]]
73848                             }
73849                         };
73850                     });
73851                 }
73852
73853
73854                 var downloaded = layer
73855                     .selectAll('path.debug-downloaded')
73856                     .data(showsDownloaded ? dataDownloaded : []);
73857
73858                 downloaded.exit()
73859                     .remove();
73860
73861                 downloaded.enter()
73862                     .append('path')
73863                     .attr('class', 'debug-downloaded debug purple');
73864
73865
73866                 // update
73867                 layer.selectAll('path')
73868                     .attr('d', svgPath(projection).geojson);
73869             }
73870
73871
73872             // This looks strange because `enabled` methods on other layers are
73873             // chainable getter/setters, and this one is just a getter.
73874             drawDebug.enabled = function() {
73875                 if (!arguments.length) {
73876                     return context.getDebug('tile') ||
73877                         context.getDebug('collision') ||
73878                         context.getDebug('imagery') ||
73879                         context.getDebug('imperial') ||
73880                         context.getDebug('driveLeft') ||
73881                         context.getDebug('target') ||
73882                         context.getDebug('downloaded');
73883                 } else {
73884                     return this;
73885                 }
73886             };
73887
73888
73889             return drawDebug;
73890         }
73891
73892         var _keepRightEnabled = false;
73893         var _keepRightService;
73894
73895
73896         function svgKeepRight(projection, context, dispatch) {
73897             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
73898             var minZoom = 12;
73899             var touchLayer = d3_select(null);
73900             var drawLayer = d3_select(null);
73901             var _keepRightVisible = false;
73902
73903
73904             function markerPath(selection, klass) {
73905                 selection
73906                     .attr('class', klass)
73907                     .attr('transform', 'translate(-4, -24)')
73908                     .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');
73909             }
73910
73911
73912             // Loosely-coupled keepRight service for fetching errors.
73913             function getService() {
73914                 if (services$1.keepRight && !_keepRightService) {
73915                     _keepRightService = services$1.keepRight;
73916                     _keepRightService.on('loaded', throttledRedraw);
73917                 } else if (!services$1.keepRight && _keepRightService) {
73918                     _keepRightService = null;
73919                 }
73920
73921                 return _keepRightService;
73922             }
73923
73924
73925             // Show the errors
73926             function editOn() {
73927                 if (!_keepRightVisible) {
73928                     _keepRightVisible = true;
73929                     drawLayer
73930                         .style('display', 'block');
73931                 }
73932             }
73933
73934
73935             // Immediately remove the errors and their touch targets
73936             function editOff() {
73937                 if (_keepRightVisible) {
73938                     _keepRightVisible = false;
73939                     drawLayer
73940                         .style('display', 'none');
73941                     drawLayer.selectAll('.qa_error.keepRight')
73942                         .remove();
73943                     touchLayer.selectAll('.qa_error.keepRight')
73944                         .remove();
73945                 }
73946             }
73947
73948
73949             // Enable the layer.  This shows the errors and transitions them to visible.
73950             function layerOn() {
73951                 editOn();
73952
73953                 drawLayer
73954                     .style('opacity', 0)
73955                     .transition()
73956                     .duration(250)
73957                     .style('opacity', 1)
73958                     .on('end interrupt', function () {
73959                         dispatch.call('change');
73960                     });
73961             }
73962
73963
73964             // Disable the layer.  This transitions the layer invisible and then hides the errors.
73965             function layerOff() {
73966                 throttledRedraw.cancel();
73967                 drawLayer.interrupt();
73968                 touchLayer.selectAll('.qa_error.keepRight')
73969                     .remove();
73970
73971                 drawLayer
73972                     .transition()
73973                     .duration(250)
73974                     .style('opacity', 0)
73975                     .on('end interrupt', function () {
73976                         editOff();
73977                         dispatch.call('change');
73978                     });
73979             }
73980
73981
73982             // Update the error markers
73983             function updateMarkers() {
73984                 if (!_keepRightVisible || !_keepRightEnabled) return;
73985
73986                 var service = getService();
73987                 var selectedID = context.selectedErrorID();
73988                 var data = (service ? service.getErrors(projection) : []);
73989                 var getTransform = svgPointTransform(projection);
73990
73991                 // Draw markers..
73992                 var markers = drawLayer.selectAll('.qa_error.keepRight')
73993                     .data(data, function(d) { return d.id; });
73994
73995                 // exit
73996                 markers.exit()
73997                     .remove();
73998
73999                 // enter
74000                 var markersEnter = markers.enter()
74001                     .append('g')
74002                     .attr('class', function(d) {
74003                         return [
74004                             'qa_error',
74005                             d.service,
74006                             'error_id-' + d.id,
74007                             'error_type-' + d.parent_error_type
74008                         ].join(' ');
74009                     });
74010
74011                 markersEnter
74012                     .append('ellipse')
74013                     .attr('cx', 0.5)
74014                     .attr('cy', 1)
74015                     .attr('rx', 6.5)
74016                     .attr('ry', 3)
74017                     .attr('class', 'stroke');
74018
74019                 markersEnter
74020                     .append('path')
74021                     .call(markerPath, 'shadow');
74022
74023                 markersEnter
74024                     .append('use')
74025                     .attr('class', 'qa_error-fill')
74026                     .attr('width', '20px')
74027                     .attr('height', '20px')
74028                     .attr('x', '-8px')
74029                     .attr('y', '-22px')
74030                     .attr('xlink:href', '#iD-icon-bolt');
74031
74032                 // update
74033                 markers
74034                     .merge(markersEnter)
74035                     .sort(sortY)
74036                     .classed('selected', function(d) { return d.id === selectedID; })
74037                     .attr('transform', getTransform);
74038
74039
74040                 // Draw targets..
74041                 if (touchLayer.empty()) return;
74042                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
74043
74044                 var targets = touchLayer.selectAll('.qa_error.keepRight')
74045                     .data(data, function(d) { return d.id; });
74046
74047                 // exit
74048                 targets.exit()
74049                     .remove();
74050
74051                 // enter/update
74052                 targets.enter()
74053                     .append('rect')
74054                     .attr('width', '20px')
74055                     .attr('height', '20px')
74056                     .attr('x', '-8px')
74057                     .attr('y', '-22px')
74058                     .merge(targets)
74059                     .sort(sortY)
74060                     .attr('class', function(d) {
74061                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
74062                     })
74063                     .attr('transform', getTransform);
74064
74065
74066                 function sortY(a, b) {
74067                     return (a.id === selectedID) ? 1
74068                         : (b.id === selectedID) ? -1
74069                         : (a.severity === 'error' && b.severity !== 'error') ? 1
74070                         : (b.severity === 'error' && a.severity !== 'error') ? -1
74071                         : b.loc[1] - a.loc[1];
74072                 }
74073             }
74074
74075
74076             // Draw the keepRight layer and schedule loading errors and updating markers.
74077             function drawKeepRight(selection) {
74078                 var service = getService();
74079
74080                 var surface = context.surface();
74081                 if (surface && !surface.empty()) {
74082                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
74083                 }
74084
74085                 drawLayer = selection.selectAll('.layer-keepRight')
74086                     .data(service ? [0] : []);
74087
74088                 drawLayer.exit()
74089                     .remove();
74090
74091                 drawLayer = drawLayer.enter()
74092                     .append('g')
74093                     .attr('class', 'layer-keepRight')
74094                     .style('display', _keepRightEnabled ? 'block' : 'none')
74095                     .merge(drawLayer);
74096
74097                 if (_keepRightEnabled) {
74098                     if (service && ~~context.map().zoom() >= minZoom) {
74099                         editOn();
74100                         service.loadErrors(projection);
74101                         updateMarkers();
74102                     } else {
74103                         editOff();
74104                     }
74105                 }
74106             }
74107
74108
74109             // Toggles the layer on and off
74110             drawKeepRight.enabled = function(val) {
74111                 if (!arguments.length) return _keepRightEnabled;
74112
74113                 _keepRightEnabled = val;
74114                 if (_keepRightEnabled) {
74115                     layerOn();
74116                 } else {
74117                     layerOff();
74118                     if (context.selectedErrorID()) {
74119                         context.enter(modeBrowse(context));
74120                     }
74121                 }
74122
74123                 dispatch.call('change');
74124                 return this;
74125             };
74126
74127
74128             drawKeepRight.supported = function() {
74129                 return !!getService();
74130             };
74131
74132
74133             return drawKeepRight;
74134         }
74135
74136         function svgGeolocate(projection) {
74137             var layer = d3_select(null);
74138             var _position;
74139
74140
74141             function init() {
74142                 if (svgGeolocate.initialized) return;  // run once
74143                 svgGeolocate.enabled = false;
74144                 svgGeolocate.initialized = true;
74145             }
74146
74147             function showLayer() {
74148                 layer.style('display', 'block');
74149             }
74150
74151
74152             function hideLayer() {
74153                 layer
74154                     .transition()
74155                     .duration(250)
74156                     .style('opacity', 0);
74157             }
74158
74159             function layerOn() {
74160                 layer
74161                     .style('opacity', 0)
74162                     .transition()
74163                     .duration(250)
74164                     .style('opacity', 1);
74165
74166             }
74167
74168             function layerOff() {
74169                 layer.style('display', 'none');
74170             }
74171
74172             function transform(d) {
74173                 return svgPointTransform(projection)(d);
74174             }
74175
74176             function accuracy(accuracy, loc) { // converts accuracy to pixels...
74177                 var degreesRadius = geoMetersToLat(accuracy),
74178                     tangentLoc = [loc[0], loc[1] + degreesRadius],
74179                     projectedTangent = projection(tangentLoc),
74180                     projectedLoc = projection([loc[0], loc[1]]);
74181
74182                 // southern most point will have higher pixel value...
74183                return Math.round(projectedLoc[1] - projectedTangent[1]).toString();
74184             }
74185
74186             function update() {
74187                 var geolocation = { loc: [_position.coords.longitude, _position.coords.latitude] };
74188
74189                 var groups = layer.selectAll('.geolocations').selectAll('.geolocation')
74190                     .data([geolocation]);
74191
74192                 groups.exit()
74193                     .remove();
74194
74195                 var pointsEnter = groups.enter()
74196                     .append('g')
74197                     .attr('class', 'geolocation');
74198
74199                 pointsEnter
74200                     .append('circle')
74201                     .attr('id', 'geolocate-radius')
74202                     .attr('dx', '0')
74203                     .attr('dy', '0')
74204                     .attr('fill', 'rgb(15,128,225)')
74205                     .attr('fill-opacity', '0.3')
74206                     .attr('r', '0');
74207
74208                 pointsEnter
74209                     .append('circle')
74210                     .attr('dx', '0')
74211                     .attr('dy', '0')
74212                     .attr('fill', 'rgb(15,128,225)')
74213                     .attr('stroke', 'white')
74214                     .attr('stroke-width', '1.5')
74215                     .attr('r', '6');
74216
74217                 groups.merge(pointsEnter)
74218                     .attr('transform', transform);
74219
74220                 d3_select('#geolocate-radius').attr('r', accuracy(_position.coords.accuracy, geolocation.loc));
74221             }
74222
74223             function drawLocation(selection) {
74224                 var enabled = svgGeolocate.enabled;
74225
74226                 layer = selection.selectAll('.layer-geolocate')
74227                     .data([0]);
74228
74229                 layer.exit()
74230                     .remove();
74231
74232                 var layerEnter = layer.enter()
74233                     .append('g')
74234                     .attr('class', 'layer-geolocate')
74235                     .style('display', enabled ? 'block' : 'none');
74236
74237                 layerEnter
74238                     .append('g')
74239                     .attr('class', 'geolocations');
74240
74241                 layer = layerEnter
74242                     .merge(layer);
74243
74244                 if (enabled) {
74245                     update();
74246                 } else {
74247                     layerOff();
74248                 }
74249             }
74250
74251             drawLocation.enabled = function (position, enabled) {
74252                 if (!arguments.length) return svgGeolocate.enabled;
74253                 _position = position;
74254                 svgGeolocate.enabled = enabled;
74255                 if (svgGeolocate.enabled) {
74256                     showLayer();
74257                     layerOn();
74258                 } else {
74259                     hideLayer();
74260                 }
74261                 return this;
74262             };
74263
74264             init();
74265             return drawLocation;
74266         }
74267
74268         function svgLabels(projection, context) {
74269             var path = d3_geoPath(projection);
74270             var detected = utilDetect();
74271             var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
74272             var _rdrawn = rbush_1();
74273             var _rskipped = rbush_1();
74274             var _textWidthCache = {};
74275             var _entitybboxes = {};
74276
74277             // Listed from highest to lowest priority
74278             var labelStack = [
74279                 ['line', 'aeroway', '*', 12],
74280                 ['line', 'highway', 'motorway', 12],
74281                 ['line', 'highway', 'trunk', 12],
74282                 ['line', 'highway', 'primary', 12],
74283                 ['line', 'highway', 'secondary', 12],
74284                 ['line', 'highway', 'tertiary', 12],
74285                 ['line', 'highway', '*', 12],
74286                 ['line', 'railway', '*', 12],
74287                 ['line', 'waterway', '*', 12],
74288                 ['area', 'aeroway', '*', 12],
74289                 ['area', 'amenity', '*', 12],
74290                 ['area', 'building', '*', 12],
74291                 ['area', 'historic', '*', 12],
74292                 ['area', 'leisure', '*', 12],
74293                 ['area', 'man_made', '*', 12],
74294                 ['area', 'natural', '*', 12],
74295                 ['area', 'shop', '*', 12],
74296                 ['area', 'tourism', '*', 12],
74297                 ['area', 'camp_site', '*', 12],
74298                 ['point', 'aeroway', '*', 10],
74299                 ['point', 'amenity', '*', 10],
74300                 ['point', 'building', '*', 10],
74301                 ['point', 'historic', '*', 10],
74302                 ['point', 'leisure', '*', 10],
74303                 ['point', 'man_made', '*', 10],
74304                 ['point', 'natural', '*', 10],
74305                 ['point', 'shop', '*', 10],
74306                 ['point', 'tourism', '*', 10],
74307                 ['point', 'camp_site', '*', 10],
74308                 ['line', 'name', '*', 12],
74309                 ['area', 'name', '*', 12],
74310                 ['point', 'name', '*', 10]
74311             ];
74312
74313
74314             function blacklisted(preset) {
74315                 var noIcons = ['building', 'landuse', 'natural'];
74316                 return noIcons.some(function(s) {
74317                     return preset.id.indexOf(s) >= 0;
74318                 });
74319             }
74320
74321
74322             function get(array, prop) {
74323                 return function(d, i) { return array[i][prop]; };
74324             }
74325
74326
74327             function textWidth(text, size, elem) {
74328                 var c = _textWidthCache[size];
74329                 if (!c) c = _textWidthCache[size] = {};
74330
74331                 if (c[text]) {
74332                     return c[text];
74333
74334                 } else if (elem) {
74335                     c[text] = elem.getComputedTextLength();
74336                     return c[text];
74337
74338                 } else {
74339                     var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
74340                     if (str === null) {
74341                         return size / 3 * 2 * text.length;
74342                     } else {
74343                         return size / 3 * (2 * text.length + str.length);
74344                     }
74345                 }
74346             }
74347
74348
74349             function drawLinePaths(selection, entities, filter, classes, labels) {
74350                 var paths = selection.selectAll('path')
74351                     .filter(filter)
74352                     .data(entities, osmEntity.key);
74353
74354                 // exit
74355                 paths.exit()
74356                     .remove();
74357
74358                 // enter/update
74359                 paths.enter()
74360                     .append('path')
74361                     .style('stroke-width', get(labels, 'font-size'))
74362                     .attr('id', function(d) { return 'labelpath-' + d.id; })
74363                     .attr('class', classes)
74364                     .merge(paths)
74365                     .attr('d', get(labels, 'lineString'));
74366             }
74367
74368
74369             function drawLineLabels(selection, entities, filter, classes, labels) {
74370                 var texts = selection.selectAll('text.' + classes)
74371                     .filter(filter)
74372                     .data(entities, osmEntity.key);
74373
74374                 // exit
74375                 texts.exit()
74376                     .remove();
74377
74378                 // enter
74379                 texts.enter()
74380                     .append('text')
74381                     .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
74382                     .attr('dy', baselineHack ? '0.35em' : null)
74383                     .append('textPath')
74384                     .attr('class', 'textpath');
74385
74386                 // update
74387                 selection.selectAll('text.' + classes).selectAll('.textpath')
74388                     .filter(filter)
74389                     .data(entities, osmEntity.key)
74390                     .attr('startOffset', '50%')
74391                     .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
74392                     .text(utilDisplayNameForPath);
74393             }
74394
74395
74396             function drawPointLabels(selection, entities, filter, classes, labels) {
74397                 var texts = selection.selectAll('text.' + classes)
74398                     .filter(filter)
74399                     .data(entities, osmEntity.key);
74400
74401                 // exit
74402                 texts.exit()
74403                     .remove();
74404
74405                 // enter/update
74406                 texts.enter()
74407                     .append('text')
74408                     .attr('class', function(d, i) {
74409                         return classes + ' ' + labels[i].classes + ' ' + d.id;
74410                     })
74411                     .merge(texts)
74412                     .attr('x', get(labels, 'x'))
74413                     .attr('y', get(labels, 'y'))
74414                     .style('text-anchor', get(labels, 'textAnchor'))
74415                     .text(utilDisplayName)
74416                     .each(function(d, i) {
74417                         textWidth(utilDisplayName(d), labels[i].height, this);
74418                     });
74419             }
74420
74421
74422             function drawAreaLabels(selection, entities, filter, classes, labels) {
74423                 entities = entities.filter(hasText);
74424                 labels = labels.filter(hasText);
74425                 drawPointLabels(selection, entities, filter, classes, labels);
74426
74427                 function hasText(d, i) {
74428                     return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
74429                 }
74430             }
74431
74432
74433             function drawAreaIcons(selection, entities, filter, classes, labels) {
74434                 var icons = selection.selectAll('use.' + classes)
74435                     .filter(filter)
74436                     .data(entities, osmEntity.key);
74437
74438                 // exit
74439                 icons.exit()
74440                     .remove();
74441
74442                 // enter/update
74443                 icons.enter()
74444                     .append('use')
74445                     .attr('class', 'icon ' + classes)
74446                     .attr('width', '17px')
74447                     .attr('height', '17px')
74448                     .merge(icons)
74449                     .attr('transform', get(labels, 'transform'))
74450                     .attr('xlink:href', function(d) {
74451                         var preset = context.presets().match(d, context.graph());
74452                         var picon = preset && preset.icon;
74453
74454                         if (!picon) {
74455                             return '';
74456                         } else {
74457                             var isMaki = /^maki-/.test(picon);
74458                             return '#' + picon + (isMaki ? '-15' : '');
74459                         }
74460                     });
74461             }
74462
74463
74464             function drawCollisionBoxes(selection, rtree, which) {
74465                 var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
74466
74467                 var gj = [];
74468                 if (context.getDebug('collision')) {
74469                     gj = rtree.all().map(function(d) {
74470                         return { type: 'Polygon', coordinates: [[
74471                             [d.minX, d.minY],
74472                             [d.maxX, d.minY],
74473                             [d.maxX, d.maxY],
74474                             [d.minX, d.maxY],
74475                             [d.minX, d.minY]
74476                         ]]};
74477                     });
74478                 }
74479
74480                 var boxes = selection.selectAll('.' + which)
74481                     .data(gj);
74482
74483                 // exit
74484                 boxes.exit()
74485                     .remove();
74486
74487                 // enter/update
74488                 boxes.enter()
74489                     .append('path')
74490                     .attr('class', classes)
74491                     .merge(boxes)
74492                     .attr('d', d3_geoPath());
74493             }
74494
74495
74496             function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
74497                 var wireframe = context.surface().classed('fill-wireframe');
74498                 var zoom = geoScaleToZoom(projection.scale());
74499
74500                 var labelable = [];
74501                 var renderNodeAs = {};
74502                 var i, j, k, entity, geometry;
74503
74504                 for (i = 0; i < labelStack.length; i++) {
74505                     labelable.push([]);
74506                 }
74507
74508                 if (fullRedraw) {
74509                     _rdrawn.clear();
74510                     _rskipped.clear();
74511                     _entitybboxes = {};
74512
74513                 } else {
74514                     for (i = 0; i < entities.length; i++) {
74515                         entity = entities[i];
74516                         var toRemove = []
74517                             .concat(_entitybboxes[entity.id] || [])
74518                             .concat(_entitybboxes[entity.id + 'I'] || []);
74519
74520                         for (j = 0; j < toRemove.length; j++) {
74521                             _rdrawn.remove(toRemove[j]);
74522                             _rskipped.remove(toRemove[j]);
74523                         }
74524                     }
74525                 }
74526
74527                 // Loop through all the entities to do some preprocessing
74528                 for (i = 0; i < entities.length; i++) {
74529                     entity = entities[i];
74530                     geometry = entity.geometry(graph);
74531
74532                     // Insert collision boxes around interesting points/vertices
74533                     if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
74534                         var hasDirections = entity.directions(graph, projection).length;
74535                         var markerPadding;
74536
74537                         if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
74538                             renderNodeAs[entity.id] = 'point';
74539                             markerPadding = 20;   // extra y for marker height
74540                         } else {
74541                             renderNodeAs[entity.id] = 'vertex';
74542                             markerPadding = 0;
74543                         }
74544
74545                         var coord = projection(entity.loc);
74546                         var nodePadding = 10;
74547                         var bbox = {
74548                             minX: coord[0] - nodePadding,
74549                             minY: coord[1] - nodePadding - markerPadding,
74550                             maxX: coord[0] + nodePadding,
74551                             maxY: coord[1] + nodePadding
74552                         };
74553
74554                         doInsert(bbox, entity.id + 'P');
74555                     }
74556
74557                     // From here on, treat vertices like points
74558                     if (geometry === 'vertex') {
74559                         geometry = 'point';
74560                     }
74561
74562                     // Determine which entities are label-able
74563                     var preset = geometry === 'area' && context.presets().match(entity, graph);
74564                     var icon = preset && !blacklisted(preset) && preset.icon;
74565
74566                     if (!icon && !utilDisplayName(entity))
74567                         continue;
74568
74569                     for (k = 0; k < labelStack.length; k++) {
74570                         var matchGeom = labelStack[k][0];
74571                         var matchKey = labelStack[k][1];
74572                         var matchVal = labelStack[k][2];
74573                         var hasVal = entity.tags[matchKey];
74574
74575                         if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
74576                             labelable[k].push(entity);
74577                             break;
74578                         }
74579                     }
74580                 }
74581
74582                 var positions = {
74583                     point: [],
74584                     line: [],
74585                     area: []
74586                 };
74587
74588                 var labelled = {
74589                     point: [],
74590                     line: [],
74591                     area: []
74592                 };
74593
74594                 // Try and find a valid label for labellable entities
74595                 for (k = 0; k < labelable.length; k++) {
74596                     var fontSize = labelStack[k][3];
74597
74598                     for (i = 0; i < labelable[k].length; i++) {
74599                         entity = labelable[k][i];
74600                         geometry = entity.geometry(graph);
74601
74602                         var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
74603                         var name = getName(entity);
74604                         var width = name && textWidth(name, fontSize);
74605                         var p = null;
74606
74607                         if (geometry === 'point' || geometry === 'vertex') {
74608                             // no point or vertex labels in wireframe mode
74609                             // no vertex labels at low zooms (vertices have no icons)
74610                             if (wireframe) continue;
74611                             var renderAs = renderNodeAs[entity.id];
74612                             if (renderAs === 'vertex' && zoom < 17) continue;
74613
74614                             p = getPointLabel(entity, width, fontSize, renderAs);
74615
74616                         } else if (geometry === 'line') {
74617                             p = getLineLabel(entity, width, fontSize);
74618
74619                         } else if (geometry === 'area') {
74620                             p = getAreaLabel(entity, width, fontSize);
74621                         }
74622
74623                         if (p) {
74624                             if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
74625                             p.classes = geometry + ' tag-' + labelStack[k][1];
74626                             positions[geometry].push(p);
74627                             labelled[geometry].push(entity);
74628                         }
74629                     }
74630                 }
74631
74632
74633                 function isInterestingVertex(entity) {
74634                     var selectedIDs = context.selectedIDs();
74635
74636                     return entity.hasInterestingTags() ||
74637                         entity.isEndpoint(graph) ||
74638                         entity.isConnected(graph) ||
74639                         selectedIDs.indexOf(entity.id) !== -1 ||
74640                         graph.parentWays(entity).some(function(parent) {
74641                             return selectedIDs.indexOf(parent.id) !== -1;
74642                         });
74643                 }
74644
74645
74646                 function getPointLabel(entity, width, height, geometry) {
74647                     var y = (geometry === 'point' ? -12 : 0);
74648                     var pointOffsets = {
74649                         ltr: [15, y, 'start'],
74650                         rtl: [-15, y, 'end']
74651                     };
74652
74653                     var coord = projection(entity.loc);
74654                     var textPadding = 2;
74655                     var offset = pointOffsets[textDirection];
74656                     var p = {
74657                         height: height,
74658                         width: width,
74659                         x: coord[0] + offset[0],
74660                         y: coord[1] + offset[1],
74661                         textAnchor: offset[2]
74662                     };
74663
74664                     // insert a collision box for the text label..
74665                     var bbox;
74666                     if (textDirection === 'rtl') {
74667                         bbox = {
74668                             minX: p.x - width - textPadding,
74669                             minY: p.y - (height / 2) - textPadding,
74670                             maxX: p.x + textPadding,
74671                             maxY: p.y + (height / 2) + textPadding
74672                         };
74673                     } else {
74674                         bbox = {
74675                             minX: p.x - textPadding,
74676                             minY: p.y - (height / 2) - textPadding,
74677                             maxX: p.x + width + textPadding,
74678                             maxY: p.y + (height / 2) + textPadding
74679                         };
74680                     }
74681
74682                     if (tryInsert([bbox], entity.id, true)) {
74683                         return p;
74684                     }
74685                 }
74686
74687
74688                 function getLineLabel(entity, width, height) {
74689                     var viewport = geoExtent(context.projection.clipExtent()).polygon();
74690                     var points = graph.childNodes(entity)
74691                         .map(function(node) { return projection(node.loc); });
74692                     var length = geoPathLength(points);
74693
74694                     if (length < width + 20) return;
74695
74696                     // todo: properly clip points to viewport
74697
74698                     // % along the line to attempt to place the label
74699                     var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
74700                                        25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
74701                     var padding = 3;
74702
74703                     for (var i = 0; i < lineOffsets.length; i++) {
74704                         var offset = lineOffsets[i];
74705                         var middle = offset / 100 * length;
74706                         var start = middle - width / 2;
74707
74708                         if (start < 0 || start + width > length) continue;
74709
74710                         // generate subpath and ignore paths that are invalid or don't cross viewport.
74711                         var sub = subpath(points, start, start + width);
74712                         if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
74713                             continue;
74714                         }
74715
74716                         var isReverse = reverse(sub);
74717                         if (isReverse) {
74718                             sub = sub.reverse();
74719                         }
74720
74721                         var bboxes = [];
74722                         var boxsize = (height + 2) / 2;
74723
74724                         for (var j = 0; j < sub.length - 1; j++) {
74725                             var a = sub[j];
74726                             var b = sub[j + 1];
74727
74728                             // split up the text into small collision boxes
74729                             var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
74730
74731                             for (var box = 0; box < num; box++) {
74732                                 var p = geoVecInterp(a, b, box / num);
74733                                 var x0 = p[0] - boxsize - padding;
74734                                 var y0 = p[1] - boxsize - padding;
74735                                 var x1 = p[0] + boxsize + padding;
74736                                 var y1 = p[1] + boxsize + padding;
74737
74738                                 bboxes.push({
74739                                     minX: Math.min(x0, x1),
74740                                     minY: Math.min(y0, y1),
74741                                     maxX: Math.max(x0, x1),
74742                                     maxY: Math.max(y0, y1)
74743                                 });
74744                             }
74745                         }
74746
74747                         if (tryInsert(bboxes, entity.id, false)) {   // accept this one
74748                             return {
74749                                 'font-size': height + 2,
74750                                 lineString: lineString(sub),
74751                                 startOffset: offset + '%'
74752                             };
74753                         }
74754                     }
74755
74756                     function reverse(p) {
74757                         var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
74758                         return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
74759                     }
74760
74761                     function lineString(points) {
74762                         return 'M' + points.join('L');
74763                     }
74764
74765                     function subpath(points, from, to) {
74766                         var sofar = 0;
74767                         var start, end, i0, i1;
74768
74769                         for (var i = 0; i < points.length - 1; i++) {
74770                             var a = points[i];
74771                             var b = points[i + 1];
74772                             var current = geoVecLength(a, b);
74773                             var portion;
74774                             if (!start && sofar + current >= from) {
74775                                 portion = (from - sofar) / current;
74776                                 start = [
74777                                     a[0] + portion * (b[0] - a[0]),
74778                                     a[1] + portion * (b[1] - a[1])
74779                                 ];
74780                                 i0 = i + 1;
74781                             }
74782                             if (!end && sofar + current >= to) {
74783                                 portion = (to - sofar) / current;
74784                                 end = [
74785                                     a[0] + portion * (b[0] - a[0]),
74786                                     a[1] + portion * (b[1] - a[1])
74787                                 ];
74788                                 i1 = i + 1;
74789                             }
74790                             sofar += current;
74791                         }
74792
74793                         var result = points.slice(i0, i1);
74794                         result.unshift(start);
74795                         result.push(end);
74796                         return result;
74797                     }
74798                 }
74799
74800
74801                 function getAreaLabel(entity, width, height) {
74802                     var centroid = path.centroid(entity.asGeoJSON(graph, true));
74803                     var extent = entity.extent(graph);
74804                     var areaWidth = projection(extent[1])[0] - projection(extent[0])[0];
74805
74806                     if (isNaN(centroid[0]) || areaWidth < 20) return;
74807
74808                     var preset = context.presets().match(entity, context.graph());
74809                     var picon = preset && preset.icon;
74810                     var iconSize = 17;
74811                     var padding = 2;
74812                     var p = {};
74813
74814                     if (picon) {  // icon and label..
74815                         if (addIcon()) {
74816                             addLabel(iconSize + padding);
74817                             return p;
74818                         }
74819                     } else {   // label only..
74820                         if (addLabel(0)) {
74821                             return p;
74822                         }
74823                     }
74824
74825
74826                     function addIcon() {
74827                         var iconX = centroid[0] - (iconSize / 2);
74828                         var iconY = centroid[1] - (iconSize / 2);
74829                         var bbox = {
74830                             minX: iconX,
74831                             minY: iconY,
74832                             maxX: iconX + iconSize,
74833                             maxY: iconY + iconSize
74834                         };
74835
74836                         if (tryInsert([bbox], entity.id + 'I', true)) {
74837                             p.transform = 'translate(' + iconX + ',' + iconY + ')';
74838                             return true;
74839                         }
74840                         return false;
74841                     }
74842
74843                     function addLabel(yOffset) {
74844                         if (width && areaWidth >= width + 20) {
74845                             var labelX = centroid[0];
74846                             var labelY = centroid[1] + yOffset;
74847                             var bbox = {
74848                                 minX: labelX - (width / 2) - padding,
74849                                 minY: labelY - (height / 2) - padding,
74850                                 maxX: labelX + (width / 2) + padding,
74851                                 maxY: labelY + (height / 2) + padding
74852                             };
74853
74854                             if (tryInsert([bbox], entity.id, true)) {
74855                                 p.x = labelX;
74856                                 p.y = labelY;
74857                                 p.textAnchor = 'middle';
74858                                 p.height = height;
74859                                 return true;
74860                             }
74861                         }
74862                         return false;
74863                     }
74864                 }
74865
74866
74867                 // force insert a singular bounding box
74868                 // singular box only, no array, id better be unique
74869                 function doInsert(bbox, id) {
74870                     bbox.id = id;
74871
74872                     var oldbox = _entitybboxes[id];
74873                     if (oldbox) {
74874                         _rdrawn.remove(oldbox);
74875                     }
74876                     _entitybboxes[id] = bbox;
74877                     _rdrawn.insert(bbox);
74878                 }
74879
74880
74881                 function tryInsert(bboxes, id, saveSkipped) {
74882                     var skipped = false;
74883
74884                     for (var i = 0; i < bboxes.length; i++) {
74885                         var bbox = bboxes[i];
74886                         bbox.id = id;
74887
74888                         // Check that label is visible
74889                         if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
74890                             skipped = true;
74891                             break;
74892                         }
74893                         if (_rdrawn.collides(bbox)) {
74894                             skipped = true;
74895                             break;
74896                         }
74897                     }
74898
74899                     _entitybboxes[id] = bboxes;
74900
74901                     if (skipped) {
74902                         if (saveSkipped) {
74903                             _rskipped.load(bboxes);
74904                         }
74905                     } else {
74906                         _rdrawn.load(bboxes);
74907                     }
74908
74909                     return !skipped;
74910                 }
74911
74912
74913                 var layer = selection.selectAll('.layer-osm.labels');
74914                 layer.selectAll('.labels-group')
74915                     .data(['halo', 'label', 'debug'])
74916                     .enter()
74917                     .append('g')
74918                     .attr('class', function(d) { return 'labels-group ' + d; });
74919
74920                 var halo = layer.selectAll('.labels-group.halo');
74921                 var label = layer.selectAll('.labels-group.label');
74922                 var debug = layer.selectAll('.labels-group.debug');
74923
74924                 // points
74925                 drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
74926                 drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
74927
74928                 // lines
74929                 drawLinePaths(layer, labelled.line, filter, '', positions.line);
74930                 drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
74931                 drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
74932
74933                 // areas
74934                 drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
74935                 drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
74936                 drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
74937                 drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
74938
74939                 // debug
74940                 drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
74941                 drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
74942
74943                 layer.call(filterLabels);
74944             }
74945
74946
74947             function filterLabels(selection) {
74948                 var drawLayer = selection.selectAll('.layer-osm.labels');
74949                 var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
74950
74951                 layers.selectAll('.nolabel')
74952                     .classed('nolabel', false);
74953
74954                 var mouse = context.mouse();
74955                 var graph = context.graph();
74956                 var selectedIDs = context.selectedIDs();
74957                 var ids = [];
74958                 var pad, bbox;
74959
74960                 // hide labels near the mouse
74961                 if (mouse) {
74962                     pad = 20;
74963                     bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
74964                     var nearMouse = _rdrawn.search(bbox).map(function(entity) { return entity.id; });
74965                     ids.push.apply(ids, nearMouse);
74966                 }
74967
74968                 // hide labels on selected nodes (they look weird when dragging / haloed)
74969                 for (var i = 0; i < selectedIDs.length; i++) {
74970                     var entity = graph.hasEntity(selectedIDs[i]);
74971                     if (entity && entity.type === 'node') {
74972                         ids.push(selectedIDs[i]);
74973                     }
74974                 }
74975
74976                 layers.selectAll(utilEntitySelector(ids))
74977                     .classed('nolabel', true);
74978
74979
74980                 // draw the mouse bbox if debugging is on..
74981                 var debug = selection.selectAll('.labels-group.debug');
74982                 var gj = [];
74983                 if (context.getDebug('collision')) {
74984                     gj = bbox ? [{
74985                         type: 'Polygon',
74986                         coordinates: [[
74987                             [bbox.minX, bbox.minY],
74988                             [bbox.maxX, bbox.minY],
74989                             [bbox.maxX, bbox.maxY],
74990                             [bbox.minX, bbox.maxY],
74991                             [bbox.minX, bbox.minY]
74992                         ]]
74993                     }] : [];
74994                 }
74995
74996                 var box = debug.selectAll('.debug-mouse')
74997                     .data(gj);
74998
74999                 // exit
75000                 box.exit()
75001                     .remove();
75002
75003                 // enter/update
75004                 box.enter()
75005                     .append('path')
75006                     .attr('class', 'debug debug-mouse yellow')
75007                     .merge(box)
75008                     .attr('d', d3_geoPath());
75009             }
75010
75011
75012             var throttleFilterLabels = throttle(filterLabels, 100);
75013
75014
75015             drawLabels.observe = function(selection) {
75016                 var listener = function() { throttleFilterLabels(selection); };
75017                 selection.on('mousemove.hidelabels', listener);
75018                 context.on('enter.hidelabels', listener);
75019             };
75020
75021
75022             drawLabels.off = function(selection) {
75023                 throttleFilterLabels.cancel();
75024                 selection.on('mousemove.hidelabels', null);
75025                 context.on('enter.hidelabels', null);
75026             };
75027
75028
75029             return drawLabels;
75030         }
75031
75032         var _improveOsmEnabled = false;
75033         var _errorService;
75034
75035
75036         function svgImproveOSM(projection, context, dispatch) {
75037             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75038             var minZoom = 12;
75039             var touchLayer = d3_select(null);
75040             var drawLayer = d3_select(null);
75041             var _improveOsmVisible = false;
75042
75043             function markerPath(selection, klass) {
75044                 selection
75045                     .attr('class', klass)
75046                     .attr('transform', 'translate(-10, -28)')
75047                     .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');
75048             }
75049
75050
75051             // Loosely-coupled improveOSM service for fetching errors.
75052             function getService() {
75053                 if (services$1.improveOSM && !_errorService) {
75054                     _errorService = services$1.improveOSM;
75055                     _errorService.on('loaded', throttledRedraw);
75056                 } else if (!services$1.improveOSM && _errorService) {
75057                     _errorService = null;
75058                 }
75059
75060                 return _errorService;
75061             }
75062
75063
75064             // Show the errors
75065             function editOn() {
75066                 if (!_improveOsmVisible) {
75067                     _improveOsmVisible = true;
75068                     drawLayer
75069                         .style('display', 'block');
75070                 }
75071             }
75072
75073
75074             // Immediately remove the errors and their touch targets
75075             function editOff() {
75076                 if (_improveOsmVisible) {
75077                     _improveOsmVisible = false;
75078                     drawLayer
75079                         .style('display', 'none');
75080                     drawLayer.selectAll('.qa_error.improveOSM')
75081                         .remove();
75082                     touchLayer.selectAll('.qa_error.improveOSM')
75083                         .remove();
75084                 }
75085             }
75086
75087
75088             // Enable the layer.  This shows the errors and transitions them to visible.
75089             function layerOn() {
75090                 editOn();
75091
75092                 drawLayer
75093                     .style('opacity', 0)
75094                     .transition()
75095                     .duration(250)
75096                     .style('opacity', 1)
75097                     .on('end interrupt', function () {
75098                         dispatch.call('change');
75099                     });
75100             }
75101
75102
75103             // Disable the layer.  This transitions the layer invisible and then hides the errors.
75104             function layerOff() {
75105                 throttledRedraw.cancel();
75106                 drawLayer.interrupt();
75107                 touchLayer.selectAll('.qa_error.improveOSM')
75108                     .remove();
75109
75110                 drawLayer
75111                     .transition()
75112                     .duration(250)
75113                     .style('opacity', 0)
75114                     .on('end interrupt', function () {
75115                         editOff();
75116                         dispatch.call('change');
75117                     });
75118             }
75119
75120
75121             // Update the error markers
75122             function updateMarkers() {
75123                 if (!_improveOsmVisible || !_improveOsmEnabled) return;
75124
75125                 var service = getService();
75126                 var selectedID = context.selectedErrorID();
75127                 var data = (service ? service.getErrors(projection) : []);
75128                 var getTransform = svgPointTransform(projection);
75129
75130                 // Draw markers..
75131                 var markers = drawLayer.selectAll('.qa_error.improveOSM')
75132                     .data(data, function(d) { return d.id; });
75133
75134                 // exit
75135                 markers.exit()
75136                     .remove();
75137
75138                 // enter
75139                 var markersEnter = markers.enter()
75140                     .append('g')
75141                     .attr('class', function(d) {
75142                         return [
75143                             'qa_error',
75144                             d.service,
75145                             'error_id-' + d.id,
75146                             'error_type-' + d.error_type,
75147                             'category-' + d.category
75148                         ].join(' ');
75149                     });
75150
75151                 markersEnter
75152                     .append('polygon')
75153                     .call(markerPath, 'shadow');
75154
75155                 markersEnter
75156                     .append('ellipse')
75157                     .attr('cx', 0)
75158                     .attr('cy', 0)
75159                     .attr('rx', 4.5)
75160                     .attr('ry', 2)
75161                     .attr('class', 'stroke');
75162
75163                 markersEnter
75164                     .append('polygon')
75165                     .attr('fill', 'currentColor')
75166                     .call(markerPath, 'qa_error-fill');
75167
75168                 markersEnter
75169                     .append('use')
75170                     .attr('transform', 'translate(-5.5, -21)')
75171                     .attr('class', 'icon-annotation')
75172                     .attr('width', '11px')
75173                     .attr('height', '11px')
75174                     .attr('xlink:href', function(d) {
75175                         var picon = d.icon;
75176
75177                         if (!picon) {
75178                             return '';
75179                         } else {
75180                             var isMaki = /^maki-/.test(picon);
75181                             return '#' + picon + (isMaki ? '-11' : '');
75182                         }
75183                     });
75184
75185                 // update
75186                 markers
75187                     .merge(markersEnter)
75188                     .sort(sortY)
75189                     .classed('selected', function(d) { return d.id === selectedID; })
75190                     .attr('transform', getTransform);
75191
75192
75193                 // Draw targets..
75194                 if (touchLayer.empty()) return;
75195                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
75196
75197                 var targets = touchLayer.selectAll('.qa_error.improveOSM')
75198                     .data(data, function(d) { return d.id; });
75199
75200                 // exit
75201                 targets.exit()
75202                     .remove();
75203
75204                 // enter/update
75205                 targets.enter()
75206                     .append('rect')
75207                     .attr('width', '20px')
75208                     .attr('height', '30px')
75209                     .attr('x', '-10px')
75210                     .attr('y', '-28px')
75211                     .merge(targets)
75212                     .sort(sortY)
75213                     .attr('class', function(d) {
75214                         return 'qa_error ' + d.service + ' target error_id-' + d.id + ' ' + fillClass;
75215                     })
75216                     .attr('transform', getTransform);
75217
75218
75219                 function sortY(a, b) {
75220                     return (a.id === selectedID) ? 1
75221                         : (b.id === selectedID) ? -1
75222                         : b.loc[1] - a.loc[1];
75223                 }
75224             }
75225
75226
75227             // Draw the ImproveOSM layer and schedule loading errors and updating markers.
75228             function drawImproveOSM(selection) {
75229                 var service = getService();
75230
75231                 var surface = context.surface();
75232                 if (surface && !surface.empty()) {
75233                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
75234                 }
75235
75236                 drawLayer = selection.selectAll('.layer-improveOSM')
75237                     .data(service ? [0] : []);
75238
75239                 drawLayer.exit()
75240                     .remove();
75241
75242                 drawLayer = drawLayer.enter()
75243                     .append('g')
75244                     .attr('class', 'layer-improveOSM')
75245                     .style('display', _improveOsmEnabled ? 'block' : 'none')
75246                     .merge(drawLayer);
75247
75248                 if (_improveOsmEnabled) {
75249                     if (service && ~~context.map().zoom() >= minZoom) {
75250                         editOn();
75251                         service.loadErrors(projection);
75252                         updateMarkers();
75253                     } else {
75254                         editOff();
75255                     }
75256                 }
75257             }
75258
75259
75260             // Toggles the layer on and off
75261             drawImproveOSM.enabled = function(val) {
75262                 if (!arguments.length) return _improveOsmEnabled;
75263
75264                 _improveOsmEnabled = val;
75265                 if (_improveOsmEnabled) {
75266                     layerOn();
75267                 } else {
75268                     layerOff();
75269                     if (context.selectedErrorID()) {
75270                         context.enter(modeBrowse(context));
75271                     }
75272                 }
75273
75274                 dispatch.call('change');
75275                 return this;
75276             };
75277
75278
75279             drawImproveOSM.supported = function() {
75280                 return !!getService();
75281             };
75282
75283
75284             return drawImproveOSM;
75285         }
75286
75287         function svgStreetside(projection, context, dispatch) {
75288             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75289             var minZoom = 14;
75290             var minMarkerZoom = 16;
75291             var minViewfieldZoom = 18;
75292             var layer = d3_select(null);
75293             var _viewerYaw = 0;
75294             var _selectedSequence = null;
75295             var _streetside;
75296
75297             /**
75298              * init().
75299              */
75300             function init() {
75301                 if (svgStreetside.initialized) return;  // run once
75302                 svgStreetside.enabled = false;
75303                 svgStreetside.initialized = true;
75304             }
75305
75306             /**
75307              * getService().
75308              */
75309             function getService() {
75310                 if (services$1.streetside && !_streetside) {
75311                     _streetside = services$1.streetside;
75312                     _streetside.event
75313                         .on('viewerChanged', viewerChanged)
75314                         .on('loadedBubbles', throttledRedraw);
75315                 } else if (!services$1.streetside && _streetside) {
75316                     _streetside = null;
75317                 }
75318
75319                 return _streetside;
75320             }
75321
75322             /**
75323              * showLayer().
75324              */
75325             function showLayer() {
75326                 var service = getService();
75327                 if (!service) return;
75328
75329                 editOn();
75330
75331                 layer
75332                     .style('opacity', 0)
75333                     .transition()
75334                     .duration(250)
75335                     .style('opacity', 1)
75336                     .on('end', function () { dispatch.call('change'); });
75337             }
75338
75339             /**
75340              * hideLayer().
75341              */
75342             function hideLayer() {
75343                 throttledRedraw.cancel();
75344
75345                 layer
75346                     .transition()
75347                     .duration(250)
75348                     .style('opacity', 0)
75349                     .on('end', editOff);
75350             }
75351
75352             /**
75353              * editOn().
75354              */
75355             function editOn() {
75356                 layer.style('display', 'block');
75357             }
75358
75359             /**
75360              * editOff().
75361              */
75362             function editOff() {
75363                 layer.selectAll('.viewfield-group').remove();
75364                 layer.style('display', 'none');
75365             }
75366
75367             /**
75368              * click() Handles 'bubble' point click event.
75369              */
75370             function click(d) {
75371                 var service = getService();
75372                 if (!service) return;
75373
75374                 // try to preserve the viewer rotation when staying on the same sequence
75375                 if (d.sequenceKey !== _selectedSequence) {
75376                     _viewerYaw = 0;  // reset
75377                 }
75378                 _selectedSequence = d.sequenceKey;
75379
75380                 service
75381                     .selectImage(d)
75382                     .then(function(r) {
75383                         if (r.status === 'ok'){
75384                             service.showViewer(_viewerYaw);
75385                         }
75386                     });
75387
75388
75389                 context.map().centerEase(d.loc);
75390             }
75391
75392             /**
75393              * mouseover().
75394              */
75395             function mouseover(d) {
75396                 var service = getService();
75397                 if (service) service.setStyles(d);
75398             }
75399
75400             /**
75401              * mouseout().
75402              */
75403             function mouseout() {
75404                 var service = getService();
75405                 if (service) service.setStyles(null);
75406             }
75407
75408             /**
75409              * transform().
75410              */
75411             function transform(d) {
75412                 var t = svgPointTransform(projection)(d);
75413                 var rot = d.ca + _viewerYaw;
75414                 if (rot) {
75415                     t += ' rotate(' + Math.floor(rot) + ',0,0)';
75416                 }
75417                 return t;
75418             }
75419
75420
75421             function viewerChanged() {
75422                 var service = getService();
75423                 if (!service) return;
75424
75425                 var viewer = service.viewer();
75426                 if (!viewer) return;
75427
75428                 // update viewfield rotation
75429                 _viewerYaw = viewer.getYaw();
75430
75431                 // avoid updating if the map is currently transformed
75432                 // e.g. during drags or easing.
75433                 if (context.map().isTransformed()) return;
75434
75435                 layer.selectAll('.viewfield-group.currentView')
75436                     .attr('transform', transform);
75437             }
75438
75439
75440             context.photos().on('change.streetside', update);
75441
75442             /**
75443              * update().
75444              */
75445             function update() {
75446                 var viewer = d3_select('#photoviewer');
75447                 var selected = viewer.empty() ? undefined : viewer.datum();
75448                 var z = ~~context.map().zoom();
75449                 var showMarkers = (z >= minMarkerZoom);
75450                 var showViewfields = (z >= minViewfieldZoom);
75451                 var service = getService();
75452
75453                 var sequences = [];
75454                 var bubbles = [];
75455
75456                 if (context.photos().showsPanoramic()) {
75457                     sequences = (service ? service.sequences(projection) : []);
75458                     bubbles = (service && showMarkers ? service.bubbles(projection) : []);
75459                 }
75460
75461                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75462                     .data(sequences, function(d) { return d.properties.key; });
75463
75464                 // exit
75465                 traces.exit()
75466                     .remove();
75467
75468                 // enter/update
75469                 traces = traces.enter()
75470                     .append('path')
75471                     .attr('class', 'sequence')
75472                     .merge(traces)
75473                     .attr('d', svgPath(projection).geojson);
75474
75475
75476                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75477                     .data(bubbles, function(d) {
75478                         // force reenter once bubbles are attached to a sequence
75479                         return d.key + (d.sequenceKey ? 'v1' : 'v0');
75480                     });
75481
75482                 // exit
75483                 groups.exit()
75484                     .remove();
75485
75486                 // enter
75487                 var groupsEnter = groups.enter()
75488                     .append('g')
75489                     .attr('class', 'viewfield-group')
75490                     .on('mouseenter', mouseover)
75491                     .on('mouseleave', mouseout)
75492                     .on('click', click);
75493
75494                 groupsEnter
75495                     .append('g')
75496                     .attr('class', 'viewfield-scale');
75497
75498                 // update
75499                 var markers = groups
75500                     .merge(groupsEnter)
75501                     .sort(function(a, b) {
75502                         return (a === selected) ? 1
75503                             : (b === selected) ? -1
75504                             : b.loc[1] - a.loc[1];
75505                     })
75506                     .attr('transform', transform)
75507                     .select('.viewfield-scale');
75508
75509
75510                 markers.selectAll('circle')
75511                     .data([0])
75512                     .enter()
75513                     .append('circle')
75514                     .attr('dx', '0')
75515                     .attr('dy', '0')
75516                     .attr('r', '6');
75517
75518                 var viewfields = markers.selectAll('.viewfield')
75519                     .data(showViewfields ? [0] : []);
75520
75521                 viewfields.exit()
75522                     .remove();
75523
75524                 // viewfields may or may not be drawn...
75525                 // but if they are, draw below the circles
75526                 viewfields.enter()
75527                     .insert('path', 'circle')
75528                     .attr('class', 'viewfield')
75529                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75530                     .attr('d', viewfieldPath);
75531
75532                 function viewfieldPath() {
75533                     var d = this.parentNode.__data__;
75534                     if (d.pano) {
75535                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75536                     } else {
75537                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75538                     }
75539                 }
75540
75541             }
75542
75543             /**
75544              * drawImages()
75545              * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
75546              * 'svgStreetside()' is called from index.js
75547              */
75548             function drawImages(selection) {
75549                 var enabled = svgStreetside.enabled;
75550                 var service = getService();
75551
75552                 layer = selection.selectAll('.layer-streetside-images')
75553                     .data(service ? [0] : []);
75554
75555                 layer.exit()
75556                     .remove();
75557
75558                 var layerEnter = layer.enter()
75559                     .append('g')
75560                     .attr('class', 'layer-streetside-images')
75561                     .style('display', enabled ? 'block' : 'none');
75562
75563                 layerEnter
75564                     .append('g')
75565                     .attr('class', 'sequences');
75566
75567                 layerEnter
75568                     .append('g')
75569                     .attr('class', 'markers');
75570
75571                 layer = layerEnter
75572                     .merge(layer);
75573
75574                 if (enabled) {
75575                     if (service && ~~context.map().zoom() >= minZoom) {
75576                         editOn();
75577                         update();
75578                         service.loadBubbles(projection);
75579                     } else {
75580                         editOff();
75581                     }
75582                 }
75583             }
75584
75585
75586             /**
75587              * drawImages.enabled().
75588              */
75589             drawImages.enabled = function(_) {
75590                 if (!arguments.length) return svgStreetside.enabled;
75591                 svgStreetside.enabled = _;
75592                 if (svgStreetside.enabled) {
75593                     showLayer();
75594                 } else {
75595                     hideLayer();
75596                 }
75597                 dispatch.call('change');
75598                 return this;
75599             };
75600
75601             /**
75602              * drawImages.supported().
75603              */
75604             drawImages.supported = function() {
75605                 return !!getService();
75606             };
75607
75608             init();
75609
75610             return drawImages;
75611         }
75612
75613         function svgMapillaryImages(projection, context, dispatch) {
75614             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75615             var minZoom = 12;
75616             var minMarkerZoom = 16;
75617             var minViewfieldZoom = 18;
75618             var layer = d3_select(null);
75619             var _mapillary;
75620             var viewerCompassAngle;
75621
75622
75623             function init() {
75624                 if (svgMapillaryImages.initialized) return;  // run once
75625                 svgMapillaryImages.enabled = false;
75626                 svgMapillaryImages.initialized = true;
75627             }
75628
75629
75630             function getService() {
75631                 if (services$1.mapillary && !_mapillary) {
75632                     _mapillary = services$1.mapillary;
75633                     _mapillary.event.on('loadedImages', throttledRedraw);
75634                     _mapillary.event.on('bearingChanged', function(e) {
75635                         viewerCompassAngle = e;
75636
75637                         // avoid updating if the map is currently transformed
75638                         // e.g. during drags or easing.
75639                         if (context.map().isTransformed()) return;
75640
75641                         layer.selectAll('.viewfield-group.currentView')
75642                             .filter(function(d) {
75643                                 return d.pano;
75644                             })
75645                             .attr('transform', transform);
75646                     });
75647                 } else if (!services$1.mapillary && _mapillary) {
75648                     _mapillary = null;
75649                 }
75650
75651                 return _mapillary;
75652             }
75653
75654
75655             function showLayer() {
75656                 var service = getService();
75657                 if (!service) return;
75658
75659                 editOn();
75660
75661                 layer
75662                     .style('opacity', 0)
75663                     .transition()
75664                     .duration(250)
75665                     .style('opacity', 1)
75666                     .on('end', function () { dispatch.call('change'); });
75667             }
75668
75669
75670             function hideLayer() {
75671                 throttledRedraw.cancel();
75672
75673                 layer
75674                     .transition()
75675                     .duration(250)
75676                     .style('opacity', 0)
75677                     .on('end', editOff);
75678             }
75679
75680
75681             function editOn() {
75682                 layer.style('display', 'block');
75683             }
75684
75685
75686             function editOff() {
75687                 layer.selectAll('.viewfield-group').remove();
75688                 layer.style('display', 'none');
75689             }
75690
75691
75692             function click(d) {
75693                 var service = getService();
75694                 if (!service) return;
75695
75696                 service
75697                     .selectImage(d)
75698                     .updateViewer(d.key, context)
75699                     .showViewer();
75700
75701                 context.map().centerEase(d.loc);
75702             }
75703
75704
75705             function mouseover(d) {
75706                 var service = getService();
75707                 if (service) service.setStyles(d);
75708             }
75709
75710
75711             function mouseout() {
75712                 var service = getService();
75713                 if (service) service.setStyles(null);
75714             }
75715
75716
75717             function transform(d) {
75718                 var t = svgPointTransform(projection)(d);
75719                 if (d.pano && viewerCompassAngle !== null && isFinite(viewerCompassAngle)) {
75720                     t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
75721                 } else if (d.ca) {
75722                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
75723                 }
75724                 return t;
75725             }
75726
75727             context.photos().on('change.mapillary_images', update);
75728
75729             function filterImages(images) {
75730                 var showsPano = context.photos().showsPanoramic();
75731                 var showsFlat = context.photos().showsFlat();
75732                 if (!showsPano || !showsFlat) {
75733                     images = images.filter(function(image) {
75734                         if (image.pano) return showsPano;
75735                         return showsFlat;
75736                     });
75737                 }
75738                 return images;
75739             }
75740
75741             function filterSequences(sequences, service) {
75742                 var showsPano = context.photos().showsPanoramic();
75743                 var showsFlat = context.photos().showsFlat();
75744                 if (!showsPano || !showsFlat) {
75745                     sequences = sequences.filter(function(sequence) {
75746                         if (sequence.properties.hasOwnProperty('pano')) {
75747                             if (sequence.properties.pano) return showsPano;
75748                             return showsFlat;
75749                         } else {
75750                             // if the sequence doesn't specify pano or not, search its images
75751                             var cProps = sequence.properties.coordinateProperties;
75752                             if (cProps && cProps.image_keys && cProps.image_keys.length > 0) {
75753                                 for (var index in cProps.image_keys) {
75754                                     var imageKey = cProps.image_keys[index];
75755                                     var image = service.cachedImage(imageKey);
75756                                     if (image && image.hasOwnProperty('pano')) {
75757                                         if (image.pano) return showsPano;
75758                                         return showsFlat;
75759                                     }
75760                                 }
75761                             }
75762                         }
75763                     });
75764                 }
75765                 return sequences;
75766             }
75767
75768             function update() {
75769                 var viewer = d3_select('#photoviewer');
75770                 var selected = viewer.empty() ? undefined : viewer.datum();
75771
75772                 var z = ~~context.map().zoom();
75773                 var showMarkers = (z >= minMarkerZoom);
75774                 var showViewfields = (z >= minViewfieldZoom);
75775
75776                 var service = getService();
75777                 var sequences = (service ? service.sequences(projection) : []);
75778                 var images = (service && showMarkers ? service.images(projection) : []);
75779
75780                 images = filterImages(images);
75781                 sequences = filterSequences(sequences, service);
75782
75783                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
75784                     .data(sequences, function(d) { return d.properties.key; });
75785
75786                 // exit
75787                 traces.exit()
75788                     .remove();
75789
75790                 // enter/update
75791                 traces = traces.enter()
75792                     .append('path')
75793                     .attr('class', 'sequence')
75794                     .merge(traces)
75795                     .attr('d', svgPath(projection).geojson);
75796
75797
75798                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
75799                     .data(images, function(d) { return d.key; });
75800
75801                 // exit
75802                 groups.exit()
75803                     .remove();
75804
75805                 // enter
75806                 var groupsEnter = groups.enter()
75807                     .append('g')
75808                     .attr('class', 'viewfield-group')
75809                     .on('mouseenter', mouseover)
75810                     .on('mouseleave', mouseout)
75811                     .on('click', click);
75812
75813                 groupsEnter
75814                     .append('g')
75815                     .attr('class', 'viewfield-scale');
75816
75817                 // update
75818                 var markers = groups
75819                     .merge(groupsEnter)
75820                     .sort(function(a, b) {
75821                         return (a === selected) ? 1
75822                             : (b === selected) ? -1
75823                             : b.loc[1] - a.loc[1];  // sort Y
75824                     })
75825                     .attr('transform', transform)
75826                     .select('.viewfield-scale');
75827
75828
75829                 markers.selectAll('circle')
75830                     .data([0])
75831                     .enter()
75832                     .append('circle')
75833                     .attr('dx', '0')
75834                     .attr('dy', '0')
75835                     .attr('r', '6');
75836
75837                 var viewfields = markers.selectAll('.viewfield')
75838                     .data(showViewfields ? [0] : []);
75839
75840                 viewfields.exit()
75841                     .remove();
75842
75843                 viewfields.enter()               // viewfields may or may not be drawn...
75844                     .insert('path', 'circle')    // but if they are, draw below the circles
75845                     .attr('class', 'viewfield')
75846                     .classed('pano', function() { return this.parentNode.__data__.pano; })
75847                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
75848                     .attr('d', viewfieldPath);
75849
75850                 function viewfieldPath() {
75851                     var d = this.parentNode.__data__;
75852                     if (d.pano) {
75853                         return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
75854                     } else {
75855                         return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
75856                     }
75857                 }
75858             }
75859
75860
75861             function drawImages(selection) {
75862                 var enabled = svgMapillaryImages.enabled;
75863                 var service = getService();
75864
75865                 layer = selection.selectAll('.layer-mapillary')
75866                     .data(service ? [0] : []);
75867
75868                 layer.exit()
75869                     .remove();
75870
75871                 var layerEnter = layer.enter()
75872                     .append('g')
75873                     .attr('class', 'layer-mapillary')
75874                     .style('display', enabled ? 'block' : 'none');
75875
75876                 layerEnter
75877                     .append('g')
75878                     .attr('class', 'sequences');
75879
75880                 layerEnter
75881                     .append('g')
75882                     .attr('class', 'markers');
75883
75884                 layer = layerEnter
75885                     .merge(layer);
75886
75887                 if (enabled) {
75888                     if (service && ~~context.map().zoom() >= minZoom) {
75889                         editOn();
75890                         update();
75891                         service.loadImages(projection);
75892                     } else {
75893                         editOff();
75894                     }
75895                 }
75896             }
75897
75898
75899             drawImages.enabled = function(_) {
75900                 if (!arguments.length) return svgMapillaryImages.enabled;
75901                 svgMapillaryImages.enabled = _;
75902                 if (svgMapillaryImages.enabled) {
75903                     showLayer();
75904                 } else {
75905                     hideLayer();
75906                 }
75907                 dispatch.call('change');
75908                 return this;
75909             };
75910
75911
75912             drawImages.supported = function() {
75913                 return !!getService();
75914             };
75915
75916
75917             init();
75918             return drawImages;
75919         }
75920
75921         function svgMapillarySigns(projection, context, dispatch) {
75922             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
75923             var minZoom = 12;
75924             var layer = d3_select(null);
75925             var _mapillary;
75926
75927
75928             function init() {
75929                 if (svgMapillarySigns.initialized) return;  // run once
75930                 svgMapillarySigns.enabled = false;
75931                 svgMapillarySigns.initialized = true;
75932             }
75933
75934
75935             function getService() {
75936                 if (services$1.mapillary && !_mapillary) {
75937                     _mapillary = services$1.mapillary;
75938                     _mapillary.event.on('loadedSigns', throttledRedraw);
75939                 } else if (!services$1.mapillary && _mapillary) {
75940                     _mapillary = null;
75941                 }
75942                 return _mapillary;
75943             }
75944
75945
75946             function showLayer() {
75947                 var service = getService();
75948                 if (!service) return;
75949
75950                 editOn();
75951             }
75952
75953
75954             function hideLayer() {
75955                 throttledRedraw.cancel();
75956                 editOff();
75957             }
75958
75959
75960             function editOn() {
75961                 layer.style('display', 'block');
75962             }
75963
75964
75965             function editOff() {
75966                 layer.selectAll('.icon-sign').remove();
75967                 layer.style('display', 'none');
75968             }
75969
75970
75971             function click(d) {
75972                 var service = getService();
75973                 if (!service) return;
75974
75975                 context.map().centerEase(d.loc);
75976
75977                 var selected = service.getSelectedImage();
75978                 var selectedImageKey = selected && selected.key;
75979                 var imageKey;
75980
75981                 // Pick one of the images the sign was detected in,
75982                 // preference given to an image already selected.
75983                 d.detections.forEach(function(detection) {
75984                     if (!imageKey || selectedImageKey === detection.image_key) {
75985                         imageKey = detection.image_key;
75986                     }
75987                 });
75988
75989                 service
75990                     .selectImage(null, imageKey)
75991                     .updateViewer(imageKey, context)
75992                     .showViewer();
75993             }
75994
75995
75996             function update() {
75997                 var service = getService();
75998                 var data = (service ? service.signs(projection) : []);
75999                 var viewer = d3_select('#photoviewer');
76000                 var selected = viewer.empty() ? undefined : viewer.datum();
76001                 var selectedImageKey = selected && selected.key;
76002                 var transform = svgPointTransform(projection);
76003
76004                 var signs = layer.selectAll('.icon-sign')
76005                     .data(data, function(d) { return d.key; });
76006
76007                 // exit
76008                 signs.exit()
76009                     .remove();
76010
76011                 // enter
76012                 var enter = signs.enter()
76013                     .append('use')
76014                     .attr('class', 'icon-sign')
76015                     .attr('width', '24px')
76016                     .attr('height', '24px')
76017                     .attr('x', '-12px')
76018                     .attr('y', '-12px')
76019                     .attr('xlink:href', function(d) { return '#' + d.value; })
76020                     .classed('currentView', function(d) {
76021                         return d.detections.some(function(detection) {
76022                             return detection.image_key === selectedImageKey;
76023                         });
76024                     })
76025                     .on('click', click);
76026
76027                 // update
76028                 signs
76029                     .merge(enter)
76030                     .sort(function(a, b) {
76031                         return (a === selected) ? 1
76032                             : (b === selected) ? -1
76033                             : b.loc[1] - a.loc[1];  // sort Y
76034                     })
76035                     .attr('transform', transform);
76036             }
76037
76038
76039             function drawSigns(selection) {
76040                 var enabled = svgMapillarySigns.enabled;
76041                 var service = getService();
76042
76043                 layer = selection.selectAll('.layer-mapillary-signs')
76044                     .data(service ? [0] : []);
76045
76046                 layer.exit()
76047                     .remove();
76048
76049                 layer = layer.enter()
76050                     .append('g')
76051                     .attr('class', 'layer-mapillary-signs')
76052                     .style('display', enabled ? 'block' : 'none')
76053                     .merge(layer);
76054
76055                 if (enabled) {
76056                     if (service && ~~context.map().zoom() >= minZoom) {
76057                         editOn();
76058                         update();
76059                         service.loadSigns(projection);
76060                     } else {
76061                         editOff();
76062                     }
76063                 }
76064             }
76065
76066
76067             drawSigns.enabled = function(_) {
76068                 if (!arguments.length) return svgMapillarySigns.enabled;
76069                 svgMapillarySigns.enabled = _;
76070                 if (svgMapillarySigns.enabled) {
76071                     showLayer();
76072                 } else {
76073                     hideLayer();
76074                 }
76075                 dispatch.call('change');
76076                 return this;
76077             };
76078
76079
76080             drawSigns.supported = function() {
76081                 return !!getService();
76082             };
76083
76084
76085             init();
76086             return drawSigns;
76087         }
76088
76089         function svgOpenstreetcamImages(projection, context, dispatch) {
76090             var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
76091             var minZoom = 12;
76092             var minMarkerZoom = 16;
76093             var minViewfieldZoom = 18;
76094             var layer = d3_select(null);
76095             var _openstreetcam;
76096
76097
76098             function init() {
76099                 if (svgOpenstreetcamImages.initialized) return;  // run once
76100                 svgOpenstreetcamImages.enabled = false;
76101                 svgOpenstreetcamImages.initialized = true;
76102             }
76103
76104
76105             function getService() {
76106                 if (services$1.openstreetcam && !_openstreetcam) {
76107                     _openstreetcam = services$1.openstreetcam;
76108                     _openstreetcam.event.on('loadedImages', throttledRedraw);
76109                 } else if (!services$1.openstreetcam && _openstreetcam) {
76110                     _openstreetcam = null;
76111                 }
76112
76113                 return _openstreetcam;
76114             }
76115
76116
76117             function showLayer() {
76118                 var service = getService();
76119                 if (!service) return;
76120
76121                 editOn();
76122
76123                 layer
76124                     .style('opacity', 0)
76125                     .transition()
76126                     .duration(250)
76127                     .style('opacity', 1)
76128                     .on('end', function () { dispatch.call('change'); });
76129             }
76130
76131
76132             function hideLayer() {
76133                 throttledRedraw.cancel();
76134
76135                 layer
76136                     .transition()
76137                     .duration(250)
76138                     .style('opacity', 0)
76139                     .on('end', editOff);
76140             }
76141
76142
76143             function editOn() {
76144                 layer.style('display', 'block');
76145             }
76146
76147
76148             function editOff() {
76149                 layer.selectAll('.viewfield-group').remove();
76150                 layer.style('display', 'none');
76151             }
76152
76153
76154             function click(d) {
76155                 var service = getService();
76156                 if (!service) return;
76157
76158                 service
76159                     .selectImage(d)
76160                     .updateViewer(d)
76161                     .showViewer();
76162
76163                 context.map().centerEase(d.loc);
76164             }
76165
76166
76167             function mouseover(d) {
76168                 var service = getService();
76169                 if (service) service.setStyles(d);
76170             }
76171
76172
76173             function mouseout() {
76174                 var service = getService();
76175                 if (service) service.setStyles(null);
76176             }
76177
76178
76179             function transform(d) {
76180                 var t = svgPointTransform(projection)(d);
76181                 if (d.ca) {
76182                     t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
76183                 }
76184                 return t;
76185             }
76186
76187
76188             context.photos().on('change.openstreetcam_images', update);
76189
76190             function update() {
76191                 var viewer = d3_select('#photoviewer');
76192                 var selected = viewer.empty() ? undefined : viewer.datum();
76193
76194                 var z = ~~context.map().zoom();
76195                 var showMarkers = (z >= minMarkerZoom);
76196                 var showViewfields = (z >= minViewfieldZoom);
76197
76198                 var service = getService();
76199                 var sequences = [];
76200                 var images = [];
76201
76202                 if (context.photos().showsFlat()) {
76203                     sequences = (service ? service.sequences(projection) : []);
76204                     images = (service && showMarkers ? service.images(projection) : []);
76205                 }
76206
76207                 var traces = layer.selectAll('.sequences').selectAll('.sequence')
76208                     .data(sequences, function(d) { return d.properties.key; });
76209
76210                 // exit
76211                 traces.exit()
76212                     .remove();
76213
76214                 // enter/update
76215                 traces = traces.enter()
76216                     .append('path')
76217                     .attr('class', 'sequence')
76218                     .merge(traces)
76219                     .attr('d', svgPath(projection).geojson);
76220
76221
76222                 var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
76223                     .data(images, function(d) { return d.key; });
76224
76225                 // exit
76226                 groups.exit()
76227                     .remove();
76228
76229                 // enter
76230                 var groupsEnter = groups.enter()
76231                     .append('g')
76232                     .attr('class', 'viewfield-group')
76233                     .on('mouseenter', mouseover)
76234                     .on('mouseleave', mouseout)
76235                     .on('click', click);
76236
76237                 groupsEnter
76238                     .append('g')
76239                     .attr('class', 'viewfield-scale');
76240
76241                 // update
76242                 var markers = groups
76243                     .merge(groupsEnter)
76244                     .sort(function(a, b) {
76245                         return (a === selected) ? 1
76246                             : (b === selected) ? -1
76247                             : b.loc[1] - a.loc[1];  // sort Y
76248                     })
76249                     .attr('transform', transform)
76250                     .select('.viewfield-scale');
76251
76252
76253                 markers.selectAll('circle')
76254                     .data([0])
76255                     .enter()
76256                     .append('circle')
76257                     .attr('dx', '0')
76258                     .attr('dy', '0')
76259                     .attr('r', '6');
76260
76261                 var viewfields = markers.selectAll('.viewfield')
76262                     .data(showViewfields ? [0] : []);
76263
76264                 viewfields.exit()
76265                     .remove();
76266
76267                 viewfields.enter()               // viewfields may or may not be drawn...
76268                     .insert('path', 'circle')    // but if they are, draw below the circles
76269                     .attr('class', 'viewfield')
76270                     .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
76271                     .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');
76272             }
76273
76274
76275             function drawImages(selection) {
76276                 var enabled = svgOpenstreetcamImages.enabled,
76277                     service = getService();
76278
76279                 layer = selection.selectAll('.layer-openstreetcam')
76280                     .data(service ? [0] : []);
76281
76282                 layer.exit()
76283                     .remove();
76284
76285                 var layerEnter = layer.enter()
76286                     .append('g')
76287                     .attr('class', 'layer-openstreetcam')
76288                     .style('display', enabled ? 'block' : 'none');
76289
76290                 layerEnter
76291                     .append('g')
76292                     .attr('class', 'sequences');
76293
76294                 layerEnter
76295                     .append('g')
76296                     .attr('class', 'markers');
76297
76298                 layer = layerEnter
76299                     .merge(layer);
76300
76301                 if (enabled) {
76302                     if (service && ~~context.map().zoom() >= minZoom) {
76303                         editOn();
76304                         update();
76305                         service.loadImages(projection);
76306                     } else {
76307                         editOff();
76308                     }
76309                 }
76310             }
76311
76312
76313             drawImages.enabled = function(_) {
76314                 if (!arguments.length) return svgOpenstreetcamImages.enabled;
76315                 svgOpenstreetcamImages.enabled = _;
76316                 if (svgOpenstreetcamImages.enabled) {
76317                     showLayer();
76318                 } else {
76319                     hideLayer();
76320                 }
76321                 dispatch.call('change');
76322                 return this;
76323             };
76324
76325
76326             drawImages.supported = function() {
76327                 return !!getService();
76328             };
76329
76330
76331             init();
76332             return drawImages;
76333         }
76334
76335         function svgOsm(projection, context, dispatch) {
76336             var enabled = true;
76337
76338
76339             function drawOsm(selection) {
76340                 selection.selectAll('.layer-osm')
76341                     .data(['covered', 'areas', 'lines', 'points', 'labels'])
76342                     .enter()
76343                     .append('g')
76344                     .attr('class', function(d) { return 'layer-osm ' + d; });
76345
76346                 selection.selectAll('.layer-osm.points').selectAll('.points-group')
76347                     .data(['points', 'midpoints', 'vertices', 'turns'])
76348                     .enter()
76349                     .append('g')
76350                     .attr('class', function(d) { return 'points-group ' + d; });
76351             }
76352
76353
76354             function showLayer() {
76355                 var layer = context.surface().selectAll('.data-layer.osm');
76356                 layer.interrupt();
76357
76358                 layer
76359                     .classed('disabled', false)
76360                     .style('opacity', 0)
76361                     .transition()
76362                     .duration(250)
76363                     .style('opacity', 1)
76364                     .on('end interrupt', function () {
76365                         dispatch.call('change');
76366                     });
76367             }
76368
76369
76370             function hideLayer() {
76371                 var layer = context.surface().selectAll('.data-layer.osm');
76372                 layer.interrupt();
76373
76374                 layer
76375                     .transition()
76376                     .duration(250)
76377                     .style('opacity', 0)
76378                     .on('end interrupt', function () {
76379                         layer.classed('disabled', true);
76380                         dispatch.call('change');
76381                     });
76382             }
76383
76384
76385             drawOsm.enabled = function(val) {
76386                 if (!arguments.length) return enabled;
76387                 enabled = val;
76388
76389                 if (enabled) {
76390                     showLayer();
76391                 } else {
76392                     hideLayer();
76393                 }
76394
76395                 dispatch.call('change');
76396                 return this;
76397             };
76398
76399
76400             return drawOsm;
76401         }
76402
76403         var _notesEnabled = false;
76404         var _osmService;
76405
76406
76407         function svgNotes(projection, context, dispatch$1) {
76408             if (!dispatch$1) { dispatch$1 = dispatch('change'); }
76409             var throttledRedraw = throttle(function () { dispatch$1.call('change'); }, 1000);
76410             var minZoom = 12;
76411             var touchLayer = d3_select(null);
76412             var drawLayer = d3_select(null);
76413             var _notesVisible = false;
76414
76415
76416             function markerPath(selection, klass) {
76417                 selection
76418                     .attr('class', klass)
76419                     .attr('transform', 'translate(-8, -22)')
76420                     .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');
76421             }
76422
76423
76424             // Loosely-coupled osm service for fetching notes.
76425             function getService() {
76426                 if (services$1.osm && !_osmService) {
76427                     _osmService = services$1.osm;
76428                     _osmService.on('loadedNotes', throttledRedraw);
76429                 } else if (!services$1.osm && _osmService) {
76430                     _osmService = null;
76431                 }
76432
76433                 return _osmService;
76434             }
76435
76436
76437             // Show the notes
76438             function editOn() {
76439                 if (!_notesVisible) {
76440                     _notesVisible = true;
76441                     drawLayer
76442                         .style('display', 'block');
76443                 }
76444             }
76445
76446
76447             // Immediately remove the notes and their touch targets
76448             function editOff() {
76449                 if (_notesVisible) {
76450                     _notesVisible = false;
76451                     drawLayer
76452                         .style('display', 'none');
76453                     drawLayer.selectAll('.note')
76454                         .remove();
76455                     touchLayer.selectAll('.note')
76456                         .remove();
76457                 }
76458             }
76459
76460
76461             // Enable the layer.  This shows the notes and transitions them to visible.
76462             function layerOn() {
76463                 editOn();
76464
76465                 drawLayer
76466                     .style('opacity', 0)
76467                     .transition()
76468                     .duration(250)
76469                     .style('opacity', 1)
76470                     .on('end interrupt', function () {
76471                         dispatch$1.call('change');
76472                     });
76473             }
76474
76475
76476             // Disable the layer.  This transitions the layer invisible and then hides the notes.
76477             function layerOff() {
76478                 throttledRedraw.cancel();
76479                 drawLayer.interrupt();
76480                 touchLayer.selectAll('.note')
76481                     .remove();
76482
76483                 drawLayer
76484                     .transition()
76485                     .duration(250)
76486                     .style('opacity', 0)
76487                     .on('end interrupt', function () {
76488                         editOff();
76489                         dispatch$1.call('change');
76490                     });
76491             }
76492
76493
76494             // Update the note markers
76495             function updateMarkers() {
76496                 if (!_notesVisible || !_notesEnabled) return;
76497
76498                 var service = getService();
76499                 var selectedID = context.selectedNoteID();
76500                 var data = (service ? service.notes(projection) : []);
76501                 var getTransform = svgPointTransform(projection);
76502
76503                 // Draw markers..
76504                 var notes = drawLayer.selectAll('.note')
76505                     .data(data, function(d) { return d.status + d.id; });
76506
76507                 // exit
76508                 notes.exit()
76509                     .remove();
76510
76511                 // enter
76512                 var notesEnter = notes.enter()
76513                     .append('g')
76514                     .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
76515                     .classed('new', function(d) { return d.id < 0; });
76516
76517                 notesEnter
76518                     .append('ellipse')
76519                     .attr('cx', 0.5)
76520                     .attr('cy', 1)
76521                     .attr('rx', 6.5)
76522                     .attr('ry', 3)
76523                     .attr('class', 'stroke');
76524
76525                 notesEnter
76526                     .append('path')
76527                     .call(markerPath, 'shadow');
76528
76529                 notesEnter
76530                     .append('use')
76531                     .attr('class', 'note-fill')
76532                     .attr('width', '20px')
76533                     .attr('height', '20px')
76534                     .attr('x', '-8px')
76535                     .attr('y', '-22px')
76536                     .attr('xlink:href', '#iD-icon-note');
76537
76538                 notesEnter.selectAll('.icon-annotation')
76539                     .data(function(d) { return [d]; })
76540                     .enter()
76541                     .append('use')
76542                     .attr('class', 'icon-annotation')
76543                     .attr('width', '10px')
76544                     .attr('height', '10px')
76545                     .attr('x', '-3px')
76546                     .attr('y', '-19px')
76547                     .attr('xlink:href', function(d) {
76548                         return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
76549                     });
76550
76551                 // update
76552                 notes
76553                     .merge(notesEnter)
76554                     .sort(sortY)
76555                     .classed('selected', function(d) {
76556                         var mode = context.mode();
76557                         var isMoving = mode && mode.id === 'drag-note';  // no shadows when dragging
76558                         return !isMoving && d.id === selectedID;
76559                     })
76560                     .attr('transform', getTransform);
76561
76562
76563                 // Draw targets..
76564                 if (touchLayer.empty()) return;
76565                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76566
76567                 var targets = touchLayer.selectAll('.note')
76568                     .data(data, function(d) { return d.id; });
76569
76570                 // exit
76571                 targets.exit()
76572                     .remove();
76573
76574                 // enter/update
76575                 targets.enter()
76576                     .append('rect')
76577                     .attr('width', '20px')
76578                     .attr('height', '20px')
76579                     .attr('x', '-8px')
76580                     .attr('y', '-22px')
76581                     .merge(targets)
76582                     .sort(sortY)
76583                     .attr('class', function(d) {
76584                         var newClass = (d.id < 0 ? 'new' : '');
76585                         return 'note target note-' + d.id + ' ' + fillClass + newClass;
76586                     })
76587                     .attr('transform', getTransform);
76588
76589
76590                 function sortY(a, b) {
76591                     return (a.id === selectedID) ? 1 : (b.id === selectedID) ? -1 : b.loc[1] - a.loc[1];
76592                 }
76593             }
76594
76595
76596             // Draw the notes layer and schedule loading notes and updating markers.
76597             function drawNotes(selection) {
76598                 var service = getService();
76599
76600                 var surface = context.surface();
76601                 if (surface && !surface.empty()) {
76602                     touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers');
76603                 }
76604
76605                 drawLayer = selection.selectAll('.layer-notes')
76606                     .data(service ? [0] : []);
76607
76608                 drawLayer.exit()
76609                     .remove();
76610
76611                 drawLayer = drawLayer.enter()
76612                     .append('g')
76613                     .attr('class', 'layer-notes')
76614                     .style('display', _notesEnabled ? 'block' : 'none')
76615                     .merge(drawLayer);
76616
76617                 if (_notesEnabled) {
76618                     if (service && ~~context.map().zoom() >= minZoom) {
76619                         editOn();
76620                         service.loadNotes(projection);
76621                         updateMarkers();
76622                     } else {
76623                         editOff();
76624                     }
76625                 }
76626             }
76627
76628
76629             // Toggles the layer on and off
76630             drawNotes.enabled = function(val) {
76631                 if (!arguments.length) return _notesEnabled;
76632
76633                 _notesEnabled = val;
76634                 if (_notesEnabled) {
76635                     layerOn();
76636                 } else {
76637                     layerOff();
76638                     if (context.selectedNoteID()) {
76639                         context.enter(modeBrowse(context));
76640                     }
76641                 }
76642
76643                 dispatch$1.call('change');
76644                 return this;
76645             };
76646
76647
76648             return drawNotes;
76649         }
76650
76651         function svgTouch() {
76652
76653             function drawTouch(selection) {
76654                 selection.selectAll('.layer-touch')
76655                     .data(['areas', 'lines', 'points', 'turns', 'markers'])
76656                     .enter()
76657                     .append('g')
76658                     .attr('class', function(d) { return 'layer-touch ' + d; });
76659             }
76660
76661             return drawTouch;
76662         }
76663
76664         function svgLayers(projection, context) {
76665             var dispatch$1 = dispatch('change');
76666             var svg = d3_select(null);
76667             var _layers = [
76668                 { id: 'osm', layer: svgOsm(projection, context, dispatch$1) },
76669                 { id: 'notes', layer: svgNotes(projection, context, dispatch$1) },
76670                 { id: 'data', layer: svgData(projection, context, dispatch$1) },
76671                 { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch$1) },
76672                 { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch$1) },
76673                 { id: 'streetside', layer: svgStreetside(projection, context, dispatch$1)},
76674                 { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch$1) },
76675                 { id: 'mapillary-signs',  layer: svgMapillarySigns(projection, context, dispatch$1) },
76676                 { id: 'openstreetcam', layer: svgOpenstreetcamImages(projection, context, dispatch$1) },
76677                 { id: 'debug', layer: svgDebug(projection, context, dispatch$1) },
76678                 { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch$1) },
76679                 { id: 'touch', layer: svgTouch(projection, context, dispatch$1) }
76680             ];
76681
76682
76683             function drawLayers(selection) {
76684                 svg = selection.selectAll('.surface')
76685                     .data([0]);
76686
76687                 svg = svg.enter()
76688                     .append('svg')
76689                     .attr('class', 'surface')
76690                     .merge(svg);
76691
76692                 var defs = svg.selectAll('.surface-defs')
76693                     .data([0]);
76694
76695                 defs.enter()
76696                     .append('defs')
76697                     .attr('class', 'surface-defs');
76698
76699                 var groups = svg.selectAll('.data-layer')
76700                     .data(_layers);
76701
76702                 groups.exit()
76703                     .remove();
76704
76705                 groups.enter()
76706                     .append('g')
76707                     .attr('class', function(d) { return 'data-layer ' + d.id; })
76708                     .merge(groups)
76709                     .each(function(d) { d3_select(this).call(d.layer); });
76710             }
76711
76712
76713             drawLayers.all = function() {
76714                 return _layers;
76715             };
76716
76717
76718             drawLayers.layer = function(id) {
76719                 var obj = _layers.find(function(o) { return o.id === id; });
76720                 return obj && obj.layer;
76721             };
76722
76723
76724             drawLayers.only = function(what) {
76725                 var arr = [].concat(what);
76726                 var all = _layers.map(function(layer) { return layer.id; });
76727                 return drawLayers.remove(utilArrayDifference(all, arr));
76728             };
76729
76730
76731             drawLayers.remove = function(what) {
76732                 var arr = [].concat(what);
76733                 arr.forEach(function(id) {
76734                     _layers = _layers.filter(function(o) { return o.id !== id; });
76735                 });
76736                 dispatch$1.call('change');
76737                 return this;
76738             };
76739
76740
76741             drawLayers.add = function(what) {
76742                 var arr = [].concat(what);
76743                 arr.forEach(function(obj) {
76744                     if ('id' in obj && 'layer' in obj) {
76745                         _layers.push(obj);
76746                     }
76747                 });
76748                 dispatch$1.call('change');
76749                 return this;
76750             };
76751
76752
76753             drawLayers.dimensions = function(val) {
76754                 if (!arguments.length) return utilGetDimensions(svg);
76755                 utilSetDimensions(svg, val);
76756                 return this;
76757             };
76758
76759
76760             return utilRebind(drawLayers, dispatch$1, 'on');
76761         }
76762
76763         function svgLines(projection, context) {
76764             var detected = utilDetect();
76765
76766             var highway_stack = {
76767                 motorway: 0,
76768                 motorway_link: 1,
76769                 trunk: 2,
76770                 trunk_link: 3,
76771                 primary: 4,
76772                 primary_link: 5,
76773                 secondary: 6,
76774                 tertiary: 7,
76775                 unclassified: 8,
76776                 residential: 9,
76777                 service: 10,
76778                 footway: 11
76779             };
76780
76781
76782             function drawTargets(selection, graph, entities, filter) {
76783                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
76784                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
76785                 var getPath = svgPath(projection).geojson;
76786                 var activeID = context.activeID();
76787
76788                 // The targets and nopes will be MultiLineString sub-segments of the ways
76789                 var data = { targets: [], nopes: [] };
76790
76791                 entities.forEach(function(way) {
76792                     var features = svgSegmentWay(way, graph, activeID);
76793                     data.targets.push.apply(data.targets, features.passive);
76794                     data.nopes.push.apply(data.nopes, features.active);
76795                 });
76796
76797
76798                 // Targets allow hover and vertex snapping
76799                 var targetData = data.targets.filter(getPath);
76800                 var targets = selection.selectAll('.line.target-allowed')
76801                     .filter(function(d) { return filter(d.properties.entity); })
76802                     .data(targetData, function key(d) { return d.id; });
76803
76804                 // exit
76805                 targets.exit()
76806                     .remove();
76807
76808                 // enter/update
76809                 targets.enter()
76810                     .append('path')
76811                     .merge(targets)
76812                     .attr('d', getPath)
76813                     .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
76814
76815
76816                 // NOPE
76817                 var nopeData = data.nopes.filter(getPath);
76818                 var nopes = selection.selectAll('.line.target-nope')
76819                     .filter(function(d) { return filter(d.properties.entity); })
76820                     .data(nopeData, function key(d) { return d.id; });
76821
76822                 // exit
76823                 nopes.exit()
76824                     .remove();
76825
76826                 // enter/update
76827                 nopes.enter()
76828                     .append('path')
76829                     .merge(nopes)
76830                     .attr('d', getPath)
76831                     .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
76832             }
76833
76834
76835             function drawLines(selection, graph, entities, filter) {
76836
76837                 function waystack(a, b) {
76838                     var selected = context.selectedIDs();
76839                     var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
76840                     var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
76841
76842                     if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
76843                     if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
76844                     return scoreA - scoreB;
76845                 }
76846
76847
76848                 function drawLineGroup(selection, klass, isSelected) {
76849                     // Note: Don't add `.selected` class in draw modes
76850                     var mode = context.mode();
76851                     var isDrawing = mode && /^draw/.test(mode.id);
76852                     var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
76853
76854                     var lines = selection
76855                         .selectAll('path')
76856                         .filter(filter)
76857                         .data(getPathData(isSelected), osmEntity.key);
76858
76859                     lines.exit()
76860                         .remove();
76861
76862                     // Optimization: Call expensive TagClasses only on enter selection. This
76863                     // works because osmEntity.key is defined to include the entity v attribute.
76864                     lines.enter()
76865                         .append('path')
76866                         .attr('class', function(d) {
76867
76868                             var prefix = 'way line';
76869                             if (!d.hasInterestingTags() && graph.parentMultipolygons(d).length > 0) {
76870                                 // fudge the classes to style multipolygon member lines as area edges
76871                                 prefix = 'relation area';
76872                             }
76873
76874                             var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
76875                             return prefix + ' ' + klass + ' ' + selectedClass + oldMPClass + d.id;
76876                         })
76877                         .call(svgTagClasses())
76878                         .merge(lines)
76879                         .sort(waystack)
76880                         .attr('d', getPath)
76881                         .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
76882
76883                     return selection;
76884                 }
76885
76886
76887                 function getPathData(isSelected) {
76888                     return function() {
76889                         var layer = this.parentNode.__data__;
76890                         var data = pathdata[layer] || [];
76891                         return data.filter(function(d) {
76892                             if (isSelected)
76893                                 return context.selectedIDs().indexOf(d.id) !== -1;
76894                             else
76895                                 return context.selectedIDs().indexOf(d.id) === -1;
76896                         });
76897                     };
76898                 }
76899
76900                 function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
76901                     var markergroup = layergroup
76902                         .selectAll('g.' + groupclass)
76903                         .data([pathclass]);
76904
76905                     markergroup = markergroup.enter()
76906                         .append('g')
76907                         .attr('class', groupclass)
76908                         .merge(markergroup);
76909
76910                     var markers = markergroup
76911                         .selectAll('path')
76912                         .filter(filter)
76913                         .data(
76914                             function data() { return groupdata[this.parentNode.__data__] || []; },
76915                             function key(d) { return [d.id, d.index]; }
76916                         );
76917
76918                     markers.exit()
76919                         .remove();
76920
76921                     markers = markers.enter()
76922                         .append('path')
76923                         .attr('class', pathclass)
76924                         .attr('marker-mid', marker)
76925                         .merge(markers)
76926                         .attr('d', function(d) { return d.d; });
76927
76928                     if (detected.ie) {
76929                         markers.each(function() { this.parentNode.insertBefore(this, this); });
76930                     }
76931                 }
76932
76933
76934                 var getPath = svgPath(projection, graph);
76935                 var ways = [];
76936                 var onewaydata = {};
76937                 var sideddata = {};
76938                 var oldMultiPolygonOuters = {};
76939
76940                 for (var i = 0; i < entities.length; i++) {
76941                     var entity = entities[i];
76942                     var outer = osmOldMultipolygonOuterMember(entity, graph);
76943                     if (outer) {
76944                         ways.push(entity.mergeTags(outer.tags));
76945                         oldMultiPolygonOuters[outer.id] = true;
76946                     } else if (entity.geometry(graph) === 'line') {
76947                         ways.push(entity);
76948                     }
76949                 }
76950
76951                 ways = ways.filter(getPath);
76952                 var pathdata = utilArrayGroupBy(ways, function(way) { return way.layer(); });
76953
76954                 Object.keys(pathdata).forEach(function(k) {
76955                     var v = pathdata[k];
76956                     var onewayArr = v.filter(function(d) { return d.isOneWay(); });
76957                     var onewaySegments = svgMarkerSegments(
76958                         projection, graph, 35,
76959                         function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
76960                         function bothDirections(entity) {
76961                             return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
76962                         }
76963                     );
76964                     onewaydata[k] = utilArrayFlatten(onewayArr.map(onewaySegments));
76965
76966                     var sidedArr = v.filter(function(d) { return d.isSided(); });
76967                     var sidedSegments = svgMarkerSegments(
76968                         projection, graph, 30,
76969                         function shouldReverse() { return false; },
76970                         function bothDirections() { return false; }
76971                     );
76972                     sideddata[k] = utilArrayFlatten(sidedArr.map(sidedSegments));
76973                 });
76974
76975
76976                 var covered = selection.selectAll('.layer-osm.covered');     // under areas
76977                 var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
76978                 var touchLayer = selection.selectAll('.layer-touch.lines');
76979
76980                 // Draw lines..
76981                 [covered, uncovered].forEach(function(selection) {
76982                     var range = (selection === covered ? d3_range(-10,0) : d3_range(0,11));
76983                     var layergroup = selection
76984                         .selectAll('g.layergroup')
76985                         .data(range);
76986
76987                     layergroup = layergroup.enter()
76988                         .append('g')
76989                         .attr('class', function(d) { return 'layergroup layer' + String(d); })
76990                         .merge(layergroup);
76991
76992                     layergroup
76993                         .selectAll('g.linegroup')
76994                         .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
76995                         .enter()
76996                         .append('g')
76997                         .attr('class', function(d) { return 'linegroup line-' + d; });
76998
76999                     layergroup.selectAll('g.line-shadow')
77000                         .call(drawLineGroup, 'shadow', false);
77001                     layergroup.selectAll('g.line-casing')
77002                         .call(drawLineGroup, 'casing', false);
77003                     layergroup.selectAll('g.line-stroke')
77004                         .call(drawLineGroup, 'stroke', false);
77005
77006                     layergroup.selectAll('g.line-shadow-highlighted')
77007                         .call(drawLineGroup, 'shadow', true);
77008                     layergroup.selectAll('g.line-casing-highlighted')
77009                         .call(drawLineGroup, 'casing', true);
77010                     layergroup.selectAll('g.line-stroke-highlighted')
77011                         .call(drawLineGroup, 'stroke', true);
77012
77013                     addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
77014                     addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
77015                         function marker(d) {
77016                             var category = graph.entity(d.id).sidednessIdentifier();
77017                             return 'url(#sided-marker-' + category + ')';
77018                         }
77019                     );
77020                 });
77021
77022                 // Draw touch targets..
77023                 touchLayer
77024                     .call(drawTargets, graph, ways, filter);
77025             }
77026
77027
77028             return drawLines;
77029         }
77030
77031         function svgMidpoints(projection, context) {
77032             var targetRadius = 8;
77033
77034             function drawTargets(selection, graph, entities, filter) {
77035                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77036                 var getTransform = svgPointTransform(projection).geojson;
77037
77038                 var data = entities.map(function(midpoint) {
77039                     return {
77040                         type: 'Feature',
77041                         id: midpoint.id,
77042                         properties: {
77043                             target: true,
77044                             entity: midpoint
77045                         },
77046                         geometry: {
77047                             type: 'Point',
77048                             coordinates: midpoint.loc
77049                         }
77050                     };
77051                 });
77052
77053                 var targets = selection.selectAll('.midpoint.target')
77054                     .filter(function(d) { return filter(d.properties.entity); })
77055                     .data(data, function key(d) { return d.id; });
77056
77057                 // exit
77058                 targets.exit()
77059                     .remove();
77060
77061                 // enter/update
77062                 targets.enter()
77063                     .append('circle')
77064                     .attr('r', targetRadius)
77065                     .merge(targets)
77066                     .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
77067                     .attr('transform', getTransform);
77068             }
77069
77070
77071             function drawMidpoints(selection, graph, entities, filter, extent) {
77072                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
77073                 var touchLayer = selection.selectAll('.layer-touch.points');
77074
77075                 var mode = context.mode();
77076                 if (mode && mode.id !== 'select') {
77077                     drawLayer.selectAll('.midpoint').remove();
77078                     touchLayer.selectAll('.midpoint.target').remove();
77079                     return;
77080                 }
77081
77082                 var poly = extent.polygon();
77083                 var midpoints = {};
77084
77085                 for (var i = 0; i < entities.length; i++) {
77086                     var entity = entities[i];
77087
77088                     if (entity.type !== 'way') continue;
77089                     if (!filter(entity)) continue;
77090                     if (context.selectedIDs().indexOf(entity.id) < 0) continue;
77091
77092                     var nodes = graph.childNodes(entity);
77093                     for (var j = 0; j < nodes.length - 1; j++) {
77094                         var a = nodes[j];
77095                         var b = nodes[j + 1];
77096                         var id = [a.id, b.id].sort().join('-');
77097
77098                         if (midpoints[id]) {
77099                             midpoints[id].parents.push(entity);
77100                         } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
77101                             var point = geoVecInterp(a.loc, b.loc, 0.5);
77102                             var loc = null;
77103
77104                             if (extent.intersects(point)) {
77105                                 loc = point;
77106                             } else {
77107                                 for (var k = 0; k < 4; k++) {
77108                                     point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
77109                                     if (point &&
77110                                         geoVecLength(projection(a.loc), projection(point)) > 20 &&
77111                                         geoVecLength(projection(b.loc), projection(point)) > 20)
77112                                     {
77113                                         loc = point;
77114                                         break;
77115                                     }
77116                                 }
77117                             }
77118
77119                             if (loc) {
77120                                 midpoints[id] = {
77121                                     type: 'midpoint',
77122                                     id: id,
77123                                     loc: loc,
77124                                     edge: [a.id, b.id],
77125                                     parents: [entity]
77126                                 };
77127                             }
77128                         }
77129                     }
77130                 }
77131
77132
77133                 function midpointFilter(d) {
77134                     if (midpoints[d.id])
77135                         return true;
77136
77137                     for (var i = 0; i < d.parents.length; i++) {
77138                         if (filter(d.parents[i])) {
77139                             return true;
77140                         }
77141                     }
77142
77143                     return false;
77144                 }
77145
77146
77147                 var groups = drawLayer.selectAll('.midpoint')
77148                     .filter(midpointFilter)
77149                     .data(Object.values(midpoints), function(d) { return d.id; });
77150
77151                 groups.exit()
77152                     .remove();
77153
77154                 var enter = groups.enter()
77155                     .insert('g', ':first-child')
77156                     .attr('class', 'midpoint');
77157
77158                 enter
77159                     .append('polygon')
77160                     .attr('points', '-6,8 10,0 -6,-8')
77161                     .attr('class', 'shadow');
77162
77163                 enter
77164                     .append('polygon')
77165                     .attr('points', '-3,4 5,0 -3,-4')
77166                     .attr('class', 'fill');
77167
77168                 groups = groups
77169                     .merge(enter)
77170                     .attr('transform', function(d) {
77171                         var translate = svgPointTransform(projection);
77172                         var a = graph.entity(d.edge[0]);
77173                         var b = graph.entity(d.edge[1]);
77174                         var angle = geoAngle(a, b, projection) * (180 / Math.PI);
77175                         return translate(d) + ' rotate(' + angle + ')';
77176                     })
77177                     .call(svgTagClasses().tags(
77178                         function(d) { return d.parents[0].tags; }
77179                     ));
77180
77181                 // Propagate data bindings.
77182                 groups.select('polygon.shadow');
77183                 groups.select('polygon.fill');
77184
77185
77186                 // Draw touch targets..
77187                 touchLayer
77188                     .call(drawTargets, graph, Object.values(midpoints), midpointFilter);
77189             }
77190
77191             return drawMidpoints;
77192         }
77193
77194         function svgPoints(projection, context) {
77195
77196             function markerPath(selection, klass) {
77197                 selection
77198                     .attr('class', klass)
77199                     .attr('transform', 'translate(-8, -23)')
77200                     .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');
77201             }
77202
77203             function sortY(a, b) {
77204                 return b.loc[1] - a.loc[1];
77205             }
77206
77207
77208             // Avoid exit/enter if we're just moving stuff around.
77209             // The node will get a new version but we only need to run the update selection.
77210             function fastEntityKey(d) {
77211                 var mode = context.mode();
77212                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77213                 return isMoving ? d.id : osmEntity.key(d);
77214             }
77215
77216
77217             function drawTargets(selection, graph, entities, filter) {
77218                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77219                 var getTransform = svgPointTransform(projection).geojson;
77220                 var activeID = context.activeID();
77221                 var data = [];
77222
77223                 entities.forEach(function(node) {
77224                     if (activeID === node.id) return;   // draw no target on the activeID
77225
77226                     data.push({
77227                         type: 'Feature',
77228                         id: node.id,
77229                         properties: {
77230                             target: true,
77231                             entity: node
77232                         },
77233                         geometry: node.asGeoJSON()
77234                     });
77235                 });
77236
77237                 var targets = selection.selectAll('.point.target')
77238                     .filter(function(d) { return filter(d.properties.entity); })
77239                     .data(data, function key(d) { return d.id; });
77240
77241                 // exit
77242                 targets.exit()
77243                     .remove();
77244
77245                 // enter/update
77246                 targets.enter()
77247                     .append('rect')
77248                     .attr('x', -10)
77249                     .attr('y', -26)
77250                     .attr('width', 20)
77251                     .attr('height', 30)
77252                     .merge(targets)
77253                     .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
77254                     .attr('transform', getTransform);
77255             }
77256
77257
77258             function drawPoints(selection, graph, entities, filter) {
77259                 var wireframe = context.surface().classed('fill-wireframe');
77260                 var zoom = geoScaleToZoom(projection.scale());
77261
77262                 // Points with a direction will render as vertices at higher zooms..
77263                 function renderAsPoint(entity) {
77264                     return entity.geometry(graph) === 'point' &&
77265                         !(zoom >= 18 && entity.directions(graph, projection).length);
77266                 }
77267
77268                 // All points will render as vertices in wireframe mode too..
77269                 var points = wireframe ? [] : entities.filter(renderAsPoint);
77270                 points.sort(sortY);
77271
77272
77273                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
77274                 var touchLayer = selection.selectAll('.layer-touch.points');
77275
77276                 // Draw points..
77277                 var groups = drawLayer.selectAll('g.point')
77278                     .filter(filter)
77279                     .data(points, fastEntityKey);
77280
77281                 groups.exit()
77282                     .remove();
77283
77284                 var enter = groups.enter()
77285                     .append('g')
77286                     .attr('class', function(d) { return 'node point ' + d.id; })
77287                     .order();
77288
77289                 enter
77290                     .append('path')
77291                     .call(markerPath, 'shadow');
77292
77293                 enter
77294                     .append('ellipse')
77295                     .attr('cx', 0.5)
77296                     .attr('cy', 1)
77297                     .attr('rx', 6.5)
77298                     .attr('ry', 3)
77299                     .attr('class', 'stroke');
77300
77301                 enter
77302                     .append('path')
77303                     .call(markerPath, 'stroke');
77304
77305                 enter
77306                     .append('use')
77307                     .attr('transform', 'translate(-5, -19)')
77308                     .attr('class', 'icon')
77309                     .attr('width', '11px')
77310                     .attr('height', '11px');
77311
77312                 groups = groups
77313                     .merge(enter)
77314                     .attr('transform', svgPointTransform(projection))
77315                     .call(svgTagClasses());
77316
77317                 groups.select('.shadow');   // propagate bound data
77318                 groups.select('.stroke');   // propagate bound data
77319                 groups.select('.icon')      // propagate bound data
77320                     .attr('xlink:href', function(entity) {
77321                         var preset = context.presets().match(entity, graph);
77322                         var picon = preset && preset.icon;
77323
77324                         if (!picon) {
77325                             return '';
77326                         } else {
77327                             var isMaki = /^maki-/.test(picon);
77328                             return '#' + picon + (isMaki ? '-11' : '');
77329                         }
77330                     });
77331
77332
77333                 // Draw touch targets..
77334                 touchLayer
77335                     .call(drawTargets, graph, points, filter);
77336             }
77337
77338
77339             return drawPoints;
77340         }
77341
77342         function svgTurns(projection, context) {
77343
77344             function icon(turn) {
77345                 var u = turn.u ? '-u' : '';
77346                 if (turn.no) return '#iD-turn-no' + u;
77347                 if (turn.only) return '#iD-turn-only' + u;
77348                 return '#iD-turn-yes' + u;
77349             }
77350
77351             function drawTurns(selection, graph, turns) {
77352
77353                 function turnTransform(d) {
77354                     var pxRadius = 50;
77355                     var toWay = graph.entity(d.to.way);
77356                     var toPoints = graph.childNodes(toWay)
77357                         .map(function (n) { return n.loc; })
77358                         .map(projection);
77359                     var toLength = geoPathLength(toPoints);
77360                     var mid = toLength / 2;    // midpoint of destination way
77361
77362                     var toNode = graph.entity(d.to.node);
77363                     var toVertex = graph.entity(d.to.vertex);
77364                     var a = geoAngle(toVertex, toNode, projection);
77365                     var o = projection(toVertex.loc);
77366                     var r = d.u ? 0                  // u-turn: no radius
77367                         : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
77368                         : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
77369
77370                     return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
77371                         'rotate(' + a * 180 / Math.PI + ')';
77372                 }
77373
77374
77375                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
77376                 var touchLayer = selection.selectAll('.layer-touch.turns');
77377
77378                 // Draw turns..
77379                 var groups = drawLayer.selectAll('g.turn')
77380                     .data(turns, function(d) { return d.key; });
77381
77382                 // exit
77383                 groups.exit()
77384                     .remove();
77385
77386                 // enter
77387                 var groupsEnter = groups.enter()
77388                     .append('g')
77389                     .attr('class', function(d) { return 'turn ' + d.key; });
77390
77391                 var turnsEnter = groupsEnter
77392                     .filter(function(d) { return !d.u; });
77393
77394                 turnsEnter.append('rect')
77395                     .attr('transform', 'translate(-22, -12)')
77396                     .attr('width', '44')
77397                     .attr('height', '24');
77398
77399                 turnsEnter.append('use')
77400                     .attr('transform', 'translate(-22, -12)')
77401                     .attr('width', '44')
77402                     .attr('height', '24');
77403
77404                 var uEnter = groupsEnter
77405                     .filter(function(d) { return d.u; });
77406
77407                 uEnter.append('circle')
77408                     .attr('r', '16');
77409
77410                 uEnter.append('use')
77411                     .attr('transform', 'translate(-16, -16)')
77412                     .attr('width', '32')
77413                     .attr('height', '32');
77414
77415                 // update
77416                 groups = groups
77417                     .merge(groupsEnter)
77418                     .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
77419                     .attr('transform', turnTransform);
77420
77421                 groups.select('use')
77422                     .attr('xlink:href', icon);
77423
77424                 groups.select('rect');      // propagate bound data
77425                 groups.select('circle');    // propagate bound data
77426
77427
77428                 // Draw touch targets..
77429                 var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77430                 groups = touchLayer.selectAll('g.turn')
77431                     .data(turns, function(d) { return d.key; });
77432
77433                 // exit
77434                 groups.exit()
77435                     .remove();
77436
77437                 // enter
77438                 groupsEnter = groups.enter()
77439                     .append('g')
77440                     .attr('class', function(d) { return 'turn ' + d.key; });
77441
77442                 turnsEnter = groupsEnter
77443                     .filter(function(d) { return !d.u; });
77444
77445                 turnsEnter.append('rect')
77446                     .attr('class', 'target ' + fillClass)
77447                     .attr('transform', 'translate(-22, -12)')
77448                     .attr('width', '44')
77449                     .attr('height', '24');
77450
77451                 uEnter = groupsEnter
77452                     .filter(function(d) { return d.u; });
77453
77454                 uEnter.append('circle')
77455                     .attr('class', 'target ' + fillClass)
77456                     .attr('r', '16');
77457
77458                 // update
77459                 groups = groups
77460                     .merge(groupsEnter)
77461                     .attr('transform', turnTransform);
77462
77463                 groups.select('rect');      // propagate bound data
77464                 groups.select('circle');    // propagate bound data
77465
77466
77467                 return this;
77468             }
77469
77470             return drawTurns;
77471         }
77472
77473         function svgVertices(projection, context) {
77474             var radiuses = {
77475                 //       z16-, z17,   z18+,  w/icon
77476                 shadow: [6,    7.5,   7.5,   12],
77477                 stroke: [2.5,  3.5,   3.5,   8],
77478                 fill:   [1,    1.5,   1.5,   1.5]
77479             };
77480
77481             var _currHoverTarget;
77482             var _currPersistent = {};
77483             var _currHover = {};
77484             var _prevHover = {};
77485             var _currSelected = {};
77486             var _prevSelected = {};
77487             var _radii = {};
77488
77489
77490             function sortY(a, b) {
77491                 return b.loc[1] - a.loc[1];
77492             }
77493
77494             // Avoid exit/enter if we're just moving stuff around.
77495             // The node will get a new version but we only need to run the update selection.
77496             function fastEntityKey(d) {
77497                 var mode = context.mode();
77498                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77499                 return isMoving ? d.id : osmEntity.key(d);
77500             }
77501
77502
77503             function draw(selection, graph, vertices, sets, filter) {
77504                 sets = sets || { selected: {}, important: {}, hovered: {} };
77505
77506                 var icons = {};
77507                 var directions = {};
77508                 var wireframe = context.surface().classed('fill-wireframe');
77509                 var zoom = geoScaleToZoom(projection.scale());
77510                 var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
77511                 var activeID = context.activeID();
77512
77513
77514                 function getIcon(d) {
77515                     // always check latest entity, as fastEntityKey avoids enter/exit now
77516                     var entity = graph.entity(d.id);
77517                     if (entity.id in icons) return icons[entity.id];
77518
77519                     icons[entity.id] =
77520                         entity.hasInterestingTags() &&
77521                         context.presets().match(entity, graph).icon;
77522
77523                     return icons[entity.id];
77524                 }
77525
77526
77527                 // memoize directions results, return false for empty arrays (for use in filter)
77528                 function getDirections(entity) {
77529                     if (entity.id in directions) return directions[entity.id];
77530
77531                     var angles = entity.directions(graph, projection);
77532                     directions[entity.id] = angles.length ? angles : false;
77533                     return angles;
77534                 }
77535
77536
77537                 function updateAttributes(selection) {
77538                     ['shadow', 'stroke', 'fill'].forEach(function(klass) {
77539                         var rads = radiuses[klass];
77540                         selection.selectAll('.' + klass)
77541                             .each(function(entity) {
77542                                 var i = z && getIcon(entity);
77543                                 var r = rads[i ? 3 : z];
77544
77545                                 // slightly increase the size of unconnected endpoints #3775
77546                                 if (entity.id !== activeID && entity.isEndpoint(graph) && !entity.isConnected(graph)) {
77547                                     r += 1.5;
77548                                 }
77549
77550                                 if (klass === 'shadow') {   // remember this value, so we don't need to
77551                                     _radii[entity.id] = r;  // recompute it when we draw the touch targets
77552                                 }
77553
77554                                 d3_select(this)
77555                                     .attr('r', r)
77556                                     .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
77557                             });
77558                     });
77559                 }
77560
77561                 vertices.sort(sortY);
77562
77563                 var groups = selection.selectAll('g.vertex')
77564                     .filter(filter)
77565                     .data(vertices, fastEntityKey);
77566
77567                 // exit
77568                 groups.exit()
77569                     .remove();
77570
77571                 // enter
77572                 var enter = groups.enter()
77573                     .append('g')
77574                     .attr('class', function(d) { return 'node vertex ' + d.id; })
77575                     .order();
77576
77577                 enter
77578                     .append('circle')
77579                     .attr('class', 'shadow');
77580
77581                 enter
77582                     .append('circle')
77583                     .attr('class', 'stroke');
77584
77585                 // Vertices with tags get a fill.
77586                 enter.filter(function(d) { return d.hasInterestingTags(); })
77587                     .append('circle')
77588                     .attr('class', 'fill');
77589
77590                 // update
77591                 groups = groups
77592                     .merge(enter)
77593                     .attr('transform', svgPointTransform(projection))
77594                     .classed('sibling', function(d) { return d.id in sets.selected; })
77595                     .classed('shared', function(d) { return graph.isShared(d); })
77596                     .classed('endpoint', function(d) { return d.isEndpoint(graph); })
77597                     .call(updateAttributes);
77598
77599
77600                 // Vertices with icons get a `use`.
77601                 var iconUse = groups
77602                     .selectAll('.icon')
77603                     .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
77604
77605                 // exit
77606                 iconUse.exit()
77607                     .remove();
77608
77609                 // enter
77610                 iconUse.enter()
77611                     .append('use')
77612                     .attr('class', 'icon')
77613                     .attr('width', '11px')
77614                     .attr('height', '11px')
77615                     .attr('transform', 'translate(-5.5, -5.5)')
77616                     .attr('xlink:href', function(d) {
77617                         var picon = getIcon(d);
77618                         var isMaki = /^maki-/.test(picon);
77619                         return '#' + picon + (isMaki ? '-11' : '');
77620                     });
77621
77622
77623                 // Vertices with directions get viewfields
77624                 var dgroups = groups
77625                     .selectAll('.viewfieldgroup')
77626                     .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
77627
77628                 // exit
77629                 dgroups.exit()
77630                     .remove();
77631
77632                 // enter/update
77633                 dgroups = dgroups.enter()
77634                     .insert('g', '.shadow')
77635                     .attr('class', 'viewfieldgroup')
77636                     .merge(dgroups);
77637
77638                 var viewfields = dgroups.selectAll('.viewfield')
77639                     .data(getDirections, function key(d) { return osmEntity.key(d); });
77640
77641                 // exit
77642                 viewfields.exit()
77643                     .remove();
77644
77645                 // enter/update
77646                 viewfields.enter()
77647                     .append('path')
77648                     .attr('class', 'viewfield')
77649                     .attr('d', 'M0,0H0')
77650                     .merge(viewfields)
77651                     .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
77652                     .attr('transform', function(d) { return 'rotate(' + d + ')'; });
77653             }
77654
77655
77656             function drawTargets(selection, graph, entities, filter) {
77657                 var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
77658                 var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
77659                 var getTransform = svgPointTransform(projection).geojson;
77660                 var activeID = context.activeID();
77661                 var data = { targets: [], nopes: [] };
77662
77663                 entities.forEach(function(node) {
77664                     if (activeID === node.id) return;   // draw no target on the activeID
77665
77666                     var vertexType = svgPassiveVertex(node, graph, activeID);
77667                     if (vertexType !== 0) {     // passive or adjacent - allow to connect
77668                         data.targets.push({
77669                             type: 'Feature',
77670                             id: node.id,
77671                             properties: {
77672                                 target: true,
77673                                 entity: node
77674                             },
77675                             geometry: node.asGeoJSON()
77676                         });
77677                     } else {
77678                         data.nopes.push({
77679                             type: 'Feature',
77680                             id: node.id + '-nope',
77681                             properties: {
77682                                 nope: true,
77683                                 target: true,
77684                                 entity: node
77685                             },
77686                             geometry: node.asGeoJSON()
77687                         });
77688                     }
77689                 });
77690
77691
77692                 // Targets allow hover and vertex snapping
77693                 var targets = selection.selectAll('.vertex.target-allowed')
77694                     .filter(function(d) { return filter(d.properties.entity); })
77695                     .data(data.targets, function key(d) { return d.id; });
77696
77697                 // exit
77698                 targets.exit()
77699                     .remove();
77700
77701                 // enter/update
77702                 targets.enter()
77703                     .append('circle')
77704                     .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
77705                     .merge(targets)
77706                     .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
77707                     .attr('transform', getTransform);
77708
77709
77710                 // NOPE
77711                 var nopes = selection.selectAll('.vertex.target-nope')
77712                     .filter(function(d) { return filter(d.properties.entity); })
77713                     .data(data.nopes, function key(d) { return d.id; });
77714
77715                 // exit
77716                 nopes.exit()
77717                     .remove();
77718
77719                 // enter/update
77720                 nopes.enter()
77721                     .append('circle')
77722                     .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
77723                     .merge(nopes)
77724                     .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
77725                     .attr('transform', getTransform);
77726             }
77727
77728
77729             // Points can also render as vertices:
77730             // 1. in wireframe mode or
77731             // 2. at higher zooms if they have a direction
77732             function renderAsVertex(entity, graph, wireframe, zoom) {
77733                 var geometry = entity.geometry(graph);
77734                 return geometry === 'vertex' || (geometry === 'point' && (
77735                     wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
77736                 ));
77737             }
77738
77739
77740             function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
77741                 var results = {};
77742
77743                 function addChildVertices(entity) {
77744                     var geometry = entity.geometry(graph);
77745                     if (!context.features().isHiddenFeature(entity, graph, geometry)) {
77746                         var i;
77747                         if (entity.type === 'way') {
77748                             for (i = 0; i < entity.nodes.length; i++) {
77749                                 var child = graph.hasEntity(entity.nodes[i]);
77750                                 if (child) {
77751                                     addChildVertices(child);
77752                                 }
77753                             }
77754                         } else if (entity.type === 'relation') {
77755                             for (i = 0; i < entity.members.length; i++) {
77756                                 var member = graph.hasEntity(entity.members[i].id);
77757                                 if (member) {
77758                                     addChildVertices(member);
77759                                 }
77760                             }
77761                         } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
77762                             results[entity.id] = entity;
77763                         }
77764                     }
77765                 }
77766
77767                 ids.forEach(function(id) {
77768                     var entity = graph.hasEntity(id);
77769                     if (!entity) return;
77770
77771                     if (entity.type === 'node') {
77772                         if (renderAsVertex(entity, graph, wireframe, zoom)) {
77773                             results[entity.id] = entity;
77774                             graph.parentWays(entity).forEach(function(entity) {
77775                                 addChildVertices(entity);
77776                             });
77777                         }
77778                     } else {  // way, relation
77779                         addChildVertices(entity);
77780                     }
77781                 });
77782
77783                 return results;
77784             }
77785
77786
77787             function drawVertices(selection, graph, entities, filter, extent, fullRedraw) {
77788                 var wireframe = context.surface().classed('fill-wireframe');
77789                 var zoom = geoScaleToZoom(projection.scale());
77790                 var mode = context.mode();
77791                 var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
77792
77793                 var drawLayer = selection.selectAll('.layer-osm.points .points-group.vertices');
77794                 var touchLayer = selection.selectAll('.layer-touch.points');
77795
77796                 if (fullRedraw) {
77797                     _currPersistent = {};
77798                     _radii = {};
77799                 }
77800
77801                 // Collect important vertices from the `entities` list..
77802                 // (during a paritial redraw, it will not contain everything)
77803                 for (var i = 0; i < entities.length; i++) {
77804                     var entity = entities[i];
77805                     var geometry = entity.geometry(graph);
77806                     var keep = false;
77807
77808                     // a point that looks like a vertex..
77809                     if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
77810                         _currPersistent[entity.id] = entity;
77811                         keep = true;
77812
77813                     // a vertex of some importance..
77814                     } else if (geometry === 'vertex' &&
77815                         (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
77816                         _currPersistent[entity.id] = entity;
77817                         keep = true;
77818                     }
77819
77820                     // whatever this is, it's not a persistent vertex..
77821                     if (!keep && !fullRedraw) {
77822                         delete _currPersistent[entity.id];
77823                     }
77824                 }
77825
77826                 // 3 sets of vertices to consider:
77827                 var sets = {
77828                     persistent: _currPersistent,  // persistent = important vertices (render always)
77829                     selected: _currSelected,      // selected + siblings of selected (render always)
77830                     hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
77831                 };
77832
77833                 var all = Object.assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
77834
77835                 // Draw the vertices..
77836                 // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
77837                 // Adjust the filter function to expand the scope beyond whatever entities were passed in.
77838                 var filterRendered = function(d) {
77839                     return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
77840                 };
77841                 drawLayer
77842                     .call(draw, graph, currentVisible(all), sets, filterRendered);
77843
77844                 // Draw touch targets..
77845                 // When drawing, render all targets (not just those affected by a partial redraw)
77846                 var filterTouch = function(d) {
77847                     return isMoving ? true : filterRendered(d);
77848                 };
77849                 touchLayer
77850                     .call(drawTargets, graph, currentVisible(all), filterTouch);
77851
77852
77853                 function currentVisible(which) {
77854                     return Object.keys(which)
77855                         .map(graph.hasEntity, graph)     // the current version of this entity
77856                         .filter(function (entity) { return entity && entity.intersects(extent, graph); });
77857                 }
77858             }
77859
77860
77861             // partial redraw - only update the selected items..
77862             drawVertices.drawSelected = function(selection, graph, extent) {
77863                 var wireframe = context.surface().classed('fill-wireframe');
77864                 var zoom = geoScaleToZoom(projection.scale());
77865
77866                 _prevSelected = _currSelected || {};
77867                 _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
77868
77869                 // note that drawVertices will add `_currSelected` automatically if needed..
77870                 var filter = function(d) { return d.id in _prevSelected; };
77871                 drawVertices(selection, graph, Object.values(_prevSelected), filter, extent, false);
77872             };
77873
77874
77875             // partial redraw - only update the hovered items..
77876             drawVertices.drawHover = function(selection, graph, target, extent) {
77877                 if (target === _currHoverTarget) return;  // continue only if something changed
77878
77879                 var wireframe = context.surface().classed('fill-wireframe');
77880                 var zoom = geoScaleToZoom(projection.scale());
77881
77882                 _prevHover = _currHover || {};
77883                 _currHoverTarget = target;
77884                 var entity = target && target.properties && target.properties.entity;
77885
77886                 if (entity) {
77887                     _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
77888                 } else {
77889                     _currHover = {};
77890                 }
77891
77892                 // note that drawVertices will add `_currHover` automatically if needed..
77893                 var filter = function(d) { return d.id in _prevHover; };
77894                 drawVertices(selection, graph, Object.values(_prevHover), filter, extent, false);
77895             };
77896
77897             return drawVertices;
77898         }
77899
77900         function utilBindOnce(target, type, listener, capture) {
77901             var typeOnce = type + '.once';
77902             function one() {
77903                 target.on(typeOnce, null);
77904                 listener.apply(this, arguments);
77905             }
77906             target.on(typeOnce, one, capture);
77907             return this;
77908         }
77909
77910         // constants
77911         var TILESIZE = 256;
77912         var kMin = geoZoomToScale(2, TILESIZE);
77913         var kMax = geoZoomToScale(24, TILESIZE);
77914
77915         function clamp(num, min, max) {
77916             return Math.max(min, Math.min(num, max));
77917         }
77918
77919
77920         function rendererMap(context) {
77921             var dispatch$1 = dispatch('move', 'drawn');
77922             var projection = context.projection;
77923             var curtainProjection = context.curtainProjection;
77924             var drawLayers = svgLayers(projection, context);
77925             var drawPoints = svgPoints(projection, context);
77926             var drawVertices = svgVertices(projection, context);
77927             var drawLines = svgLines(projection, context);
77928             var drawAreas = svgAreas(projection, context);
77929             var drawMidpoints = svgMidpoints(projection, context);
77930             var drawLabels = svgLabels(projection, context);
77931
77932             var _selection = d3_select(null);
77933             var supersurface = d3_select(null);
77934             var wrapper = d3_select(null);
77935             var surface = d3_select(null);
77936
77937             var _dimensions = [1, 1];
77938             var _dblClickEnabled = true;
77939             var _redrawEnabled = true;
77940             var _gestureTransformStart;
77941             var _transformStart = projection.transform();
77942             var _transformLast;
77943             var _isTransformed = false;
77944             var _minzoom = 0;
77945             var _getMouseCoords;
77946             var _mouseEvent;
77947
77948             var zoom = d3_zoom()
77949                 .scaleExtent([kMin, kMax])
77950                 .interpolate(d3_interpolate)
77951                 .filter(zoomEventFilter)
77952                 .on('zoom', zoomPan);
77953
77954             var scheduleRedraw = throttle(redraw, 750);
77955             // var isRedrawScheduled = false;
77956             // var pendingRedrawCall;
77957             // function scheduleRedraw() {
77958             //     // Only schedule the redraw if one has not already been set.
77959             //     if (isRedrawScheduled) return;
77960             //     isRedrawScheduled = true;
77961             //     var that = this;
77962             //     var args = arguments;
77963             //     pendingRedrawCall = window.requestIdleCallback(function () {
77964             //         // Reset the boolean so future redraws can be set.
77965             //         isRedrawScheduled = false;
77966             //         redraw.apply(that, args);
77967             //     }, { timeout: 1400 });
77968             // }
77969
77970             function cancelPendingRedraw() {
77971                 scheduleRedraw.cancel();
77972                 // isRedrawScheduled = false;
77973                 // window.cancelIdleCallback(pendingRedrawCall);
77974             }
77975
77976
77977             function map(selection) {
77978                 _selection = selection;
77979
77980                 context
77981                     .on('change.map', immediateRedraw);
77982
77983                 var osm = context.connection();
77984                 if (osm) {
77985                     osm.on('change.map', immediateRedraw);
77986                 }
77987
77988                 function didUndoOrRedo(targetTransform) {
77989                     var mode = context.mode().id;
77990                     if (mode !== 'browse' && mode !== 'select') return;
77991                     if (targetTransform) {
77992                         map.transformEase(targetTransform);
77993                     }
77994                 }
77995
77996                 context.history()
77997                     .on('merge.map', function() { scheduleRedraw(); })
77998                     .on('change.map', immediateRedraw)
77999                     .on('undone.map', function(stack, fromStack) {
78000                         didUndoOrRedo(fromStack.transform);
78001                     })
78002                     .on('redone.map', function(stack) {
78003                         didUndoOrRedo(stack.transform);
78004                     });
78005
78006                 context.background()
78007                     .on('change.map', immediateRedraw);
78008
78009                 context.features()
78010                     .on('redraw.map', immediateRedraw);
78011
78012                 drawLayers
78013                     .on('change.map', function() {
78014                         context.background().updateImagery();
78015                         immediateRedraw();
78016                     });
78017
78018                 selection
78019                     .on('dblclick.map', dblClick)
78020                     .call(zoom)
78021                     .call(zoom.transform, projection.transform());
78022
78023                 supersurface = selection.append('div')
78024                     .attr('id', 'supersurface')
78025                     .call(utilSetTransform, 0, 0);
78026
78027                 // Need a wrapper div because Opera can't cope with an absolutely positioned
78028                 // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
78029                 wrapper = supersurface
78030                     .append('div')
78031                     .attr('class', 'layer layer-data');
78032
78033                 map.surface = surface = wrapper
78034                     .call(drawLayers)
78035                     .selectAll('.surface')
78036                     .attr('id', 'surface');
78037
78038                 surface
78039                     .call(drawLabels.observe)
78040                     .on('gesturestart.surface', function() {
78041                         _gestureTransformStart = projection.transform();
78042                     })
78043                     .on('gesturechange.surface', gestureChange)
78044                     .on('mousedown.zoom', function() {
78045                         if (event.button === 2) {
78046                             event.stopPropagation();
78047                         }
78048                     }, true)
78049                     .on('mouseup.zoom', function() {
78050                         if (resetTransform()) {
78051                             immediateRedraw();
78052                         }
78053                     })
78054                     .on('mousemove.map', function() {
78055                         _mouseEvent = event;
78056                     })
78057                     .on('mouseover.vertices', function() {
78058                         if (map.editable() && !_isTransformed) {
78059                             var hover = event.target.__data__;
78060                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78061                             dispatch$1.call('drawn', this, { full: false });
78062                         }
78063                     })
78064                     .on('mouseout.vertices', function() {
78065                         if (map.editable() && !_isTransformed) {
78066                             var hover = event.relatedTarget && event.relatedTarget.__data__;
78067                             surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
78068                             dispatch$1.call('drawn', this, { full: false });
78069                         }
78070                     });
78071
78072                 context.on('enter.map',  function() {
78073                     if (map.editable() && !_isTransformed) {
78074                         // redraw immediately any objects affected by a change in selectedIDs.
78075                         var graph = context.graph();
78076                         var selectedAndParents = {};
78077                         context.selectedIDs().forEach(function(id) {
78078                             var entity = graph.hasEntity(id);
78079                             if (entity) {
78080                                 selectedAndParents[entity.id] = entity;
78081                                 if (entity.type === 'node') {
78082                                     graph.parentWays(entity).forEach(function(parent) {
78083                                         selectedAndParents[parent.id] = parent;
78084                                     });
78085                                 }
78086                             }
78087                         });
78088                         var data = Object.values(selectedAndParents);
78089                         var filter = function(d) { return d.id in selectedAndParents; };
78090
78091                         data = context.features().filter(data, graph);
78092
78093                         surface
78094                             .call(drawVertices.drawSelected, graph, map.extent())
78095                             .call(drawLines, graph, data, filter)
78096                             .call(drawAreas, graph, data, filter)
78097                             .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
78098
78099                         dispatch$1.call('drawn', this, { full: false });
78100
78101                         // redraw everything else later
78102                         scheduleRedraw();
78103                     }
78104                 });
78105
78106                 map.dimensions(utilGetDimensions(selection));
78107             }
78108
78109
78110             function zoomEventFilter() {
78111                 // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
78112                 // Intercept `mousedown` and check if there is an orphaned zoom gesture.
78113                 // This can happen if a previous `mousedown` occurred without a `mouseup`.
78114                 // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
78115                 // so that d3-zoom won't stop propagation of new `mousedown` events.
78116                 if (event.type === 'mousedown') {
78117                     var hasOrphan = false;
78118                     var listeners = window.__on;
78119                     for (var i = 0; i < listeners.length; i++) {
78120                         var listener = listeners[i];
78121                         if (listener.name === 'zoom' && listener.type === 'mouseup') {
78122                             hasOrphan = true;
78123                             break;
78124                         }
78125                     }
78126                     if (hasOrphan) {
78127                         var event$1 = window.CustomEvent;
78128                         if (event$1) {
78129                             event$1 = new event$1('mouseup');
78130                         } else {
78131                             event$1 = window.document.createEvent('Event');
78132                             event$1.initEvent('mouseup', false, false);
78133                         }
78134                         // Event needs to be dispatched with an event.view property.
78135                         event$1.view = window;
78136                         window.dispatchEvent(event$1);
78137                     }
78138                 }
78139
78140                 return event.button !== 2;   // ignore right clicks
78141             }
78142
78143
78144             function pxCenter() {
78145                 return [_dimensions[0] / 2, _dimensions[1] / 2];
78146             }
78147
78148
78149             function drawEditable(difference, extent) {
78150                 var mode = context.mode();
78151                 var graph = context.graph();
78152                 var features = context.features();
78153                 var all = context.intersects(map.extent());
78154                 var fullRedraw = false;
78155                 var data;
78156                 var set;
78157                 var filter;
78158
78159                 if (difference) {
78160                     var complete = difference.complete(map.extent());
78161                     data = Object.values(complete).filter(Boolean);
78162                     set = new Set(data.map(function(entity) { return entity.id; }));
78163                     filter = function(d) { return set.has(d.id); };
78164                     features.clear(data);
78165
78166                 } else {
78167                     // force a full redraw if gatherStats detects that a feature
78168                     // should be auto-hidden (e.g. points or buildings)..
78169                     if (features.gatherStats(all, graph, _dimensions)) {
78170                         extent = undefined;
78171                     }
78172
78173                     if (extent) {
78174                         data = context.intersects(map.extent().intersection(extent));
78175                         set = new Set(data.map(function(entity) { return entity.id; }));
78176                         filter = function(d) { return set.has(d.id); };
78177
78178                     } else {
78179                         data = all;
78180                         fullRedraw = true;
78181                         filter = utilFunctor(true);
78182                     }
78183                 }
78184
78185                 data = features.filter(data, graph);
78186
78187                 if (mode && mode.id === 'select') {
78188                     // update selected vertices - the user might have just double-clicked a way,
78189                     // creating a new vertex, triggering a partial redraw without a mode change
78190                     surface.call(drawVertices.drawSelected, graph, map.extent());
78191                 }
78192
78193                 surface
78194                     .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
78195                     .call(drawLines, graph, data, filter)
78196                     .call(drawAreas, graph, data, filter)
78197                     .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
78198                     .call(drawLabels, graph, data, filter, _dimensions, fullRedraw)
78199                     .call(drawPoints, graph, data, filter);
78200
78201                 dispatch$1.call('drawn', this, {full: true});
78202             }
78203
78204
78205             function editOff() {
78206                 context.features().resetStats();
78207                 surface.selectAll('.layer-osm *').remove();
78208                 surface.selectAll('.layer-touch:not(.markers) *').remove();
78209
78210                 var allowed = {
78211                     'browse': true,
78212                     'save': true,
78213                     'select-note': true,
78214                     'select-data': true,
78215                     'select-error': true
78216                 };
78217
78218                 var mode = context.mode();
78219                 if (mode && !allowed[mode.id]) {
78220                     context.enter(modeBrowse(context));
78221                 }
78222
78223                 dispatch$1.call('drawn', this, {full: true});
78224             }
78225
78226
78227             function dblClick() {
78228                 if (!_dblClickEnabled) {
78229                     event.preventDefault();
78230                     event.stopImmediatePropagation();
78231                 }
78232             }
78233
78234
78235             function gestureChange() {
78236                 // Remap Safari gesture events to wheel events - #5492
78237                 // We want these disabled most places, but enabled for zoom/unzoom on map surface
78238                 // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
78239                 var e = event;
78240                 e.preventDefault();
78241
78242                 var props = {
78243                     deltaMode: 0,    // dummy values to ignore in zoomPan
78244                     deltaY: 1,       // dummy values to ignore in zoomPan
78245                     clientX: e.clientX,
78246                     clientY: e.clientY,
78247                     screenX: e.screenX,
78248                     screenY: e.screenY,
78249                     x: e.x,
78250                     y: e.y
78251                 };
78252
78253                 var e2 = new WheelEvent('wheel', props);
78254                 e2._scale = e.scale;         // preserve the original scale
78255                 e2._rotation = e.rotation;   // preserve the original rotation
78256
78257                 _selection.node().dispatchEvent(e2);
78258             }
78259
78260
78261             function zoomPan(manualEvent) {
78262                 var event$1 = (manualEvent || event);
78263                 var source = event$1.sourceEvent;
78264                 var eventTransform = event$1.transform;
78265                 var x = eventTransform.x;
78266                 var y = eventTransform.y;
78267                 var k = eventTransform.k;
78268
78269                 if (_transformStart.x === x &&
78270                     _transformStart.y === y &&
78271                     _transformStart.k === k) {
78272                     return;  // no change
78273                 }
78274
78275                 // Special handling of 'wheel' events:
78276                 // They might be triggered by the user scrolling the mouse wheel,
78277                 // or 2-finger pinch/zoom gestures, the transform may need adjustment.
78278                 if (source && source.type === 'wheel') {
78279                     var detected = utilDetect();
78280                     var dX = source.deltaX;
78281                     var dY = source.deltaY;
78282                     var x2 = x;
78283                     var y2 = y;
78284                     var k2 = k;
78285                     var t0, p0, p1;
78286
78287                     // Normalize mousewheel scroll speed (Firefox) - #3029
78288                     // If wheel delta is provided in LINE units, recalculate it in PIXEL units
78289                     // We are essentially redoing the calculations that occur here:
78290                     //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
78291                     // See this for more info:
78292                     //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
78293                     if (source.deltaMode === 1 /* LINE */) {
78294                         // Convert from lines to pixels, more if the user is scrolling fast.
78295                         // (I made up the exp function to roughly match Firefox to what Chrome does)
78296                         // These numbers should be floats, because integers are treated as pan gesture below.
78297                         var lines = Math.abs(source.deltaY);
78298                         var sign = (source.deltaY > 0) ? 1 : -1;
78299                         dY = sign * clamp(
78300                             Math.exp((lines - 1) * 0.75) * 4.000244140625,
78301                             4.000244140625,    // min
78302                             350.000244140625   // max
78303                         );
78304
78305                         // On Firefox Windows and Linux we always get +/- the scroll line amount (default 3)
78306                         // There doesn't seem to be any scroll accelleration.
78307                         // This multiplier increases the speed a little bit - #5512
78308                         if (detected.os !== 'mac') {
78309                             dY *= 5;
78310                         }
78311
78312                         // recalculate x2,y2,k2
78313                         t0 = _isTransformed ? _transformLast : _transformStart;
78314                         p0 = _getMouseCoords(source);
78315                         p1 = t0.invert(p0);
78316                         k2 = t0.k * Math.pow(2, -dY / 500);
78317                         x2 = p0[0] - p1[0] * k2;
78318                         y2 = p0[1] - p1[1] * k2;
78319
78320                     // 2 finger map pinch zooming (Safari) - #5492
78321                     // These are fake `wheel` events we made from Safari `gesturechange` events..
78322                     } else if (source._scale) {
78323                         // recalculate x2,y2,k2
78324                         t0 = _gestureTransformStart;
78325                         p0 = _getMouseCoords(source);
78326                         p1 = t0.invert(p0);
78327                         k2 = t0.k * source._scale;
78328                         x2 = p0[0] - p1[0] * k2;
78329                         y2 = p0[1] - p1[1] * k2;
78330
78331                     // 2 finger map pinch zooming (all browsers except Safari) - #5492
78332                     // Pinch zooming via the `wheel` event will always have:
78333                     // - `ctrlKey = true`
78334                     // - `deltaY` is not round integer pixels (ignore `deltaX`)
78335                     } else if (source.ctrlKey && !isInteger(dY)) {
78336                         dY *= 6;   // slightly scale up whatever the browser gave us
78337
78338                         // recalculate x2,y2,k2
78339                         t0 = _isTransformed ? _transformLast : _transformStart;
78340                         p0 = _getMouseCoords(source);
78341                         p1 = t0.invert(p0);
78342                         k2 = t0.k * Math.pow(2, -dY / 500);
78343                         x2 = p0[0] - p1[0] * k2;
78344                         y2 = p0[1] - p1[1] * k2;
78345
78346                     // Trackpad scroll zooming with shift or alt/option key down
78347                     } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
78348                         // recalculate x2,y2,k2
78349                         t0 = _isTransformed ? _transformLast : _transformStart;
78350                         p0 = _getMouseCoords(source);
78351                         p1 = t0.invert(p0);
78352                         k2 = t0.k * Math.pow(2, -dY / 500);
78353                         x2 = p0[0] - p1[0] * k2;
78354                         y2 = p0[1] - p1[1] * k2;
78355
78356                     // 2 finger map panning (Mac only, all browsers) - #5492, #5512
78357                     // Panning via the `wheel` event will always have:
78358                     // - `ctrlKey = false`
78359                     // - `deltaX`,`deltaY` are round integer pixels
78360                     } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
78361                         p1 = projection.translate();
78362                         x2 = p1[0] - dX;
78363                         y2 = p1[1] - dY;
78364                         k2 = projection.scale();
78365                     }
78366
78367                     // something changed - replace the event transform
78368                     if (x2 !== x || y2 !== y || k2 !== k) {
78369                         x = x2;
78370                         y = y2;
78371                         k = k2;
78372                         eventTransform = identity$8.translate(x2, y2).scale(k2);
78373                         _selection.node().__zoom = eventTransform;
78374                     }
78375
78376                 }
78377
78378                 if (geoScaleToZoom(k, TILESIZE) < _minzoom) {
78379                     surface.interrupt();
78380                     uiFlash().text(t('cannot_zoom'))();
78381                     setCenterZoom(map.center(), context.minEditableZoom(), 0, true);
78382                     scheduleRedraw();
78383                     dispatch$1.call('move', this, map);
78384                     return;
78385                 }
78386
78387                 projection.transform(eventTransform);
78388
78389                 var scale = k / _transformStart.k;
78390                 var tX = (x / scale - _transformStart.x) * scale;
78391                 var tY = (y / scale - _transformStart.y) * scale;
78392
78393                 if (context.inIntro()) {
78394                     curtainProjection.transform({
78395                         x: x - tX,
78396                         y: y - tY,
78397                         k: k
78398                     });
78399                 }
78400
78401                 if (source) {
78402                     _mouseEvent = event$1;
78403                 }
78404                 _isTransformed = true;
78405                 _transformLast = eventTransform;
78406                 utilSetTransform(supersurface, tX, tY, scale);
78407                 scheduleRedraw();
78408
78409                 dispatch$1.call('move', this, map);
78410
78411
78412                 function isInteger(val) {
78413                     return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
78414                 }
78415             }
78416
78417
78418             function resetTransform() {
78419                 if (!_isTransformed) return false;
78420
78421                 // deprecation warning - Radial Menu to be removed in iD v3
78422                 surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
78423                 utilSetTransform(supersurface, 0, 0);
78424                 _isTransformed = false;
78425                 if (context.inIntro()) {
78426                     curtainProjection.transform(projection.transform());
78427                 }
78428                 return true;
78429             }
78430
78431
78432             function redraw(difference, extent) {
78433                 if (surface.empty() || !_redrawEnabled) return;
78434
78435                 // If we are in the middle of a zoom/pan, we can't do differenced redraws.
78436                 // It would result in artifacts where differenced entities are redrawn with
78437                 // one transform and unchanged entities with another.
78438                 if (resetTransform()) {
78439                     difference = extent = undefined;
78440                 }
78441
78442                 var zoom = map.zoom();
78443                 var z = String(~~zoom);
78444
78445                 if (surface.attr('data-zoom') !== z) {
78446                     surface.attr('data-zoom', z);
78447                 }
78448
78449                 // class surface as `lowzoom` around z17-z18.5 (based on latitude)
78450                 var lat = map.center()[1];
78451                 var lowzoom = linear$2()
78452                     .domain([-60, 0, 60])
78453                     .range([17, 18.5, 17])
78454                     .clamp(true);
78455
78456                 surface
78457                     .classed('low-zoom', zoom <= lowzoom(lat));
78458
78459
78460                 if (!difference) {
78461                     supersurface.call(context.background());
78462                     wrapper.call(drawLayers);
78463                 }
78464
78465                 // OSM
78466                 if (map.editable()) {
78467                     context.loadTiles(projection);
78468                     drawEditable(difference, extent);
78469                 } else {
78470                     editOff();
78471                 }
78472
78473                 _transformStart = projection.transform();
78474
78475                 return map;
78476             }
78477
78478
78479
78480             var immediateRedraw = function(difference, extent) {
78481                 if (!difference && !extent) cancelPendingRedraw();
78482                 redraw(difference, extent);
78483             };
78484
78485
78486             map.mouse = function() {
78487                 var event$1 = _mouseEvent || event;
78488                 if (event$1) {
78489                     var s;
78490                     while ((s = event$1.sourceEvent)) { event$1 = s; }
78491                     return _getMouseCoords(event$1);
78492                 }
78493                 return null;
78494             };
78495
78496
78497             // returns Lng/Lat
78498             map.mouseCoordinates = function() {
78499                 var coord = map.mouse() || pxCenter();
78500                 return projection.invert(coord);
78501             };
78502
78503
78504             map.dblclickEnable = function(val) {
78505                 if (!arguments.length) return _dblClickEnabled;
78506                 _dblClickEnabled = val;
78507                 return map;
78508             };
78509
78510
78511             map.redrawEnable = function(val) {
78512                 if (!arguments.length) return _redrawEnabled;
78513                 _redrawEnabled = val;
78514                 return map;
78515             };
78516
78517
78518             map.isTransformed = function() {
78519                 return _isTransformed;
78520             };
78521
78522
78523             function setTransform(t2, duration, force) {
78524                 var t = projection.transform();
78525                 if (!force && t2.k === t.k && t2.x === t.x && t2.y === t.y) return false;
78526
78527                 if (duration) {
78528                     _selection
78529                         .transition()
78530                         .duration(duration)
78531                         .on('start', function() { map.startEase(); })
78532                         .call(zoom.transform, identity$8.translate(t2.x, t2.y).scale(t2.k));
78533                 } else {
78534                     projection.transform(t2);
78535                     _transformStart = t2;
78536                     _selection.call(zoom.transform, _transformStart);
78537                 }
78538
78539                 return true;
78540             }
78541
78542
78543             function setCenterZoom(loc2, z2, duration, force) {
78544                 var c = map.center();
78545                 var z = map.zoom();
78546                 if (loc2[0] === c[0] && loc2[1] === c[1] && z2 === z && !force) return false;
78547
78548                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78549
78550                 var k2 = clamp(geoZoomToScale(z2, TILESIZE), kMin, kMax);
78551                 proj.scale(k2);
78552
78553                 var t = proj.translate();
78554                 var point = proj(loc2);
78555
78556                 var center = pxCenter();
78557                 t[0] += center[0] - point[0];
78558                 t[1] += center[1] - point[1];
78559
78560                 return setTransform(identity$8.translate(t[0], t[1]).scale(k2), duration, force);
78561             }
78562
78563
78564             map.pan = function(delta, duration) {
78565                 var t = projection.translate();
78566                 var k = projection.scale();
78567
78568                 t[0] += delta[0];
78569                 t[1] += delta[1];
78570
78571                 if (duration) {
78572                     _selection
78573                         .transition()
78574                         .duration(duration)
78575                         .on('start', function() { map.startEase(); })
78576                         .call(zoom.transform, identity$8.translate(t[0], t[1]).scale(k));
78577                 } else {
78578                     projection.translate(t);
78579                     _transformStart = projection.transform();
78580                     _selection.call(zoom.transform, _transformStart);
78581                     dispatch$1.call('move', this, map);
78582                     immediateRedraw();
78583                 }
78584
78585                 return map;
78586             };
78587
78588
78589             map.dimensions = function(val) {
78590                 if (!arguments.length) return _dimensions;
78591
78592                 _dimensions = val;
78593                 drawLayers.dimensions(_dimensions);
78594                 context.background().dimensions(_dimensions);
78595                 projection.clipExtent([[0, 0], _dimensions]);
78596                 _getMouseCoords = utilFastMouse(supersurface.node());
78597
78598                 scheduleRedraw();
78599                 return map;
78600             };
78601
78602
78603             function zoomIn(delta) {
78604                 setCenterZoom(map.center(), ~~map.zoom() + delta, 250, true);
78605             }
78606
78607             function zoomOut(delta) {
78608                 setCenterZoom(map.center(), ~~map.zoom() - delta, 250, true);
78609             }
78610
78611             map.zoomIn = function() { zoomIn(1); };
78612             map.zoomInFurther = function() { zoomIn(4); };
78613
78614             map.zoomOut = function() { zoomOut(1); };
78615             map.zoomOutFurther = function() { zoomOut(4); };
78616
78617
78618             map.center = function(loc2) {
78619                 if (!arguments.length) {
78620                     return projection.invert(pxCenter());
78621                 }
78622
78623                 if (setCenterZoom(loc2, map.zoom())) {
78624                     dispatch$1.call('move', this, map);
78625                 }
78626
78627                 scheduleRedraw();
78628                 return map;
78629             };
78630
78631             map.unobscuredCenterZoomEase = function(loc, zoom) {
78632                 var offset = map.unobscuredOffsetPx();
78633
78634                 var proj = geoRawMercator().transform(projection.transform());  // copy projection
78635                 // use the target zoom to calculate the offset center
78636                 proj.scale(geoZoomToScale(zoom, TILESIZE));
78637                 
78638                 var locPx = proj(loc);
78639                 var offsetLocPx = [locPx[0] + offset[0], locPx[1] + offset[1]];
78640                 var offsetLoc = proj.invert(offsetLocPx);
78641
78642                 map.centerZoomEase(offsetLoc, zoom);
78643             };
78644
78645             map.unobscuredOffsetPx = function() {
78646                 var openPane = d3_select('.map-panes .map-pane.shown');
78647                 if (!openPane.empty()) {
78648                     return [openPane.node().offsetWidth/2, 0];
78649                 }
78650                 return [0, 0];
78651             };
78652
78653             map.zoom = function(z2) {
78654                 if (!arguments.length) {
78655                     return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
78656                 }
78657
78658                 if (z2 < _minzoom) {
78659                     surface.interrupt();
78660                     uiFlash().text(t('cannot_zoom'))();
78661                     z2 = context.minEditableZoom();
78662                 }
78663
78664                 if (setCenterZoom(map.center(), z2)) {
78665                     dispatch$1.call('move', this, map);
78666                 }
78667
78668                 scheduleRedraw();
78669                 return map;
78670             };
78671
78672
78673             map.centerZoom = function(loc2, z2) {
78674                 if (setCenterZoom(loc2, z2)) {
78675                     dispatch$1.call('move', this, map);
78676                 }
78677
78678                 scheduleRedraw();
78679                 return map;
78680             };
78681
78682
78683             map.zoomTo = function(entity) {
78684                 var extent = entity.extent(context.graph());
78685                 if (!isFinite(extent.area())) return map;
78686
78687                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78688                 return map.centerZoom(extent.center(), z2);
78689             };
78690
78691
78692             map.centerEase = function(loc2, duration) {
78693                 duration = duration || 250;
78694                 setCenterZoom(loc2, map.zoom(), duration);
78695                 return map;
78696             };
78697
78698
78699             map.zoomEase = function(z2, duration) {
78700                 duration = duration || 250;
78701                 setCenterZoom(map.center(), z2, duration, false);
78702                 return map;
78703             };
78704
78705
78706             map.centerZoomEase = function(loc2, z2, duration) {
78707                 duration = duration || 250;
78708                 setCenterZoom(loc2, z2, duration, false);
78709                 return map;
78710             };
78711
78712
78713             map.transformEase = function(t2, duration) {
78714                 duration = duration || 250;
78715                 setTransform(t2, duration, false);
78716                 return map;
78717             };
78718
78719
78720             map.zoomToEase = function(entity, duration) {
78721                 var extent = entity.extent(context.graph());
78722                 if (!isFinite(extent.area())) return map;
78723
78724                 var z2 = clamp(map.trimmedExtentZoom(extent), context.minEditableZoom(), 20);
78725                 return map.centerZoomEase(extent.center(), z2, duration);
78726             };
78727
78728
78729             map.startEase = function() {
78730                 utilBindOnce(surface, 'mousedown.ease', function() {
78731                     map.cancelEase();
78732                 });
78733                 return map;
78734             };
78735
78736
78737             map.cancelEase = function() {
78738                 _selection.interrupt();
78739                 return map;
78740             };
78741
78742
78743             map.extent = function(val) {
78744                 if (!arguments.length) {
78745                     return new geoExtent(
78746                         projection.invert([0, _dimensions[1]]),
78747                         projection.invert([_dimensions[0], 0])
78748                     );
78749                 } else {
78750                     var extent = geoExtent(val);
78751                     map.centerZoom(extent.center(), map.extentZoom(extent));
78752                 }
78753             };
78754
78755
78756             map.trimmedExtent = function(val) {
78757                 if (!arguments.length) {
78758                     var headerY = 60;
78759                     var footerY = 30;
78760                     var pad = 10;
78761                     return new geoExtent(
78762                         projection.invert([pad, _dimensions[1] - footerY - pad]),
78763                         projection.invert([_dimensions[0] - pad, headerY + pad])
78764                     );
78765                 } else {
78766                     var extent = geoExtent(val);
78767                     map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
78768                 }
78769             };
78770
78771
78772             function calcExtentZoom(extent, dim) {
78773                 var tl = projection([extent[0][0], extent[1][1]]);
78774                 var br = projection([extent[1][0], extent[0][1]]);
78775
78776                 // Calculate maximum zoom that fits extent
78777                 var hFactor = (br[0] - tl[0]) / dim[0];
78778                 var vFactor = (br[1] - tl[1]) / dim[1];
78779                 var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
78780                 var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
78781                 var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
78782
78783                 return newZoom;
78784             }
78785
78786
78787             map.extentZoom = function(val) {
78788                 return calcExtentZoom(geoExtent(val), _dimensions);
78789             };
78790
78791
78792             map.trimmedExtentZoom = function(val) {
78793                 var trimY = 120;
78794                 var trimX = 40;
78795                 var trimmed = [_dimensions[0] - trimX, _dimensions[1] - trimY];
78796                 return calcExtentZoom(geoExtent(val), trimmed);
78797             };
78798
78799
78800             map.editable = function() {
78801                 var layer = context.layers().layer('osm');
78802                 if (!layer || !layer.enabled()) return false;
78803
78804                 return map.zoom() >= context.minEditableZoom();
78805             };
78806
78807
78808             map.notesEditable = function() {
78809                 var layer = context.layers().layer('notes');
78810                 if (!layer || !layer.enabled()) return false;
78811
78812                 return map.zoom() >= context.minEditableZoom();
78813             };
78814
78815
78816             map.minzoom = function(val) {
78817                 if (!arguments.length) return _minzoom;
78818                 _minzoom = val;
78819                 return map;
78820             };
78821
78822
78823             map.layers = drawLayers;
78824
78825
78826             return utilRebind(map, dispatch$1, 'on');
78827         }
78828
78829         function rendererPhotos(context) {
78830             var dispatch$1 = dispatch('change');
78831             var _layerIDs = ['streetside', 'mapillary', 'mapillary-signs', 'openstreetcam'];
78832             var _allPhotoTypes = ['flat', 'panoramic'];
78833             var _shownPhotoTypes = _allPhotoTypes.slice();   // shallow copy
78834
78835             function photos() {}
78836
78837             function updateStorage() {
78838                 if (window.mocha) return;
78839
78840                 var q = utilStringQs(window.location.hash.substring(1));
78841                 var enabled = context.layers().all().filter(function(d) {
78842                     return _layerIDs.indexOf(d.id) !== -1 && d.layer && d.layer.supported() && d.layer.enabled();
78843                 }).map(function(d) {
78844                     return d.id;
78845                 });
78846                 if (enabled.length) {
78847                     q.photo_overlay = enabled.join(',');
78848                 } else {
78849                     delete q.photo_overlay;
78850                 }
78851                 window.location.replace('#' + utilQsString(q, true));
78852             }
78853
78854             photos.overlayLayerIDs = function() {
78855                 return _layerIDs;
78856             };
78857
78858             photos.allPhotoTypes = function() {
78859                 return _allPhotoTypes;
78860             };
78861
78862             function showsLayer(id) {
78863                 var layer = context.layers().layer(id);
78864                 return layer && layer.supported() && layer.enabled();
78865             }
78866
78867             photos.shouldFilterByPhotoType = function() {
78868                 return showsLayer('mapillary') ||
78869                     (showsLayer('streetside') && showsLayer('openstreetcam'));
78870             };
78871
78872             photos.showsPhotoType = function(val) {
78873                 if (!photos.shouldFilterByPhotoType()) return true;
78874
78875                 return _shownPhotoTypes.indexOf(val) !== -1;
78876             };
78877
78878             photos.showsFlat = function() {
78879                 return photos.showsPhotoType('flat');
78880             };
78881
78882             photos.showsPanoramic = function() {
78883                 return photos.showsPhotoType('panoramic');
78884             };
78885
78886             photos.togglePhotoType = function(val) {
78887                 var index = _shownPhotoTypes.indexOf(val);
78888                 if (index !== -1) {
78889                     _shownPhotoTypes.splice(index, 1);
78890                 } else {
78891                     _shownPhotoTypes.push(val);
78892                 }
78893                 dispatch$1.call('change', this);
78894                 return photos;
78895             };
78896
78897             photos.init = function() {
78898                 var q = utilStringQs(window.location.hash.substring(1));
78899                 if (q.photo_overlay) {
78900                     var hashOverlayIDs = q.photo_overlay.replace(/;/g, ',').split(',');
78901                     hashOverlayIDs.forEach(function(id) {
78902                         var layer = context.layers().layer(id);
78903                         if (layer) layer.enabled(true);
78904                     });
78905                 }
78906
78907                 context.layers().on('change.rendererPhotos', updateStorage);
78908             };
78909
78910             return utilRebind(photos, dispatch$1, 'on');
78911         }
78912
78913         function uiAccount(context) {
78914             var osm = context.connection();
78915
78916
78917             function update(selection) {
78918                 if (!osm) return;
78919
78920                 if (!osm.authenticated()) {
78921                     selection.selectAll('#userLink, #logoutLink')
78922                         .classed('hide', true);
78923                     return;
78924                 }
78925
78926                 osm.userDetails(function(err, details) {
78927                     var userLink = selection.select('#userLink'),
78928                         logoutLink = selection.select('#logoutLink');
78929
78930                     userLink.html('');
78931                     logoutLink.html('');
78932
78933                     if (err) return;
78934
78935                     selection.selectAll('#userLink, #logoutLink')
78936                         .classed('hide', false);
78937
78938                     // Link
78939                     userLink.append('a')
78940                         .attr('href', osm.userURL(details.display_name))
78941                         .attr('target', '_blank');
78942
78943                     // Add thumbnail or dont
78944                     if (details.image_url) {
78945                         userLink.append('img')
78946                             .attr('class', 'icon pre-text user-icon')
78947                             .attr('src', details.image_url);
78948                     } else {
78949                         userLink
78950                             .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
78951                     }
78952
78953                     // Add user name
78954                     userLink.append('span')
78955                         .attr('class', 'label')
78956                         .text(details.display_name);
78957
78958                     logoutLink.append('a')
78959                         .attr('class', 'logout')
78960                         .attr('href', '#')
78961                         .text(t('logout'))
78962                         .on('click.logout', function() {
78963                             event.preventDefault();
78964                             osm.logout();
78965                         });
78966                 });
78967             }
78968
78969
78970             return function(selection) {
78971                 selection.append('li')
78972                     .attr('id', 'logoutLink')
78973                     .classed('hide', true);
78974
78975                 selection.append('li')
78976                     .attr('id', 'userLink')
78977                     .classed('hide', true);
78978
78979                 if (osm) {
78980                     osm.on('change.account', function() { update(selection); });
78981                     update(selection);
78982                 }
78983             };
78984         }
78985
78986         function uiAttribution(context) {
78987             var selection;
78988
78989
78990             function attribution(data, klass) {
78991                 var div = selection.selectAll('.' + klass)
78992                     .data([0]);
78993
78994                 div = div.enter()
78995                     .append('div')
78996                     .attr('class', klass)
78997                     .merge(div);
78998
78999
79000                 var background = div.selectAll('.attribution')
79001                     .data(data, function(d) { return d.name(); });
79002
79003                 background.exit()
79004                     .remove();
79005
79006                 background = background.enter()
79007                     .append('span')
79008                     .attr('class', 'attribution')
79009                     .each(function(d) {
79010                         if (d.terms_html) {
79011                             d3_select(this)
79012                                 .html(d.terms_html);
79013                             return;
79014                         }
79015
79016                         var selection;
79017                         if (d.terms_url) {
79018                             selection = d3_select(this)
79019                                 .append('a')
79020                                 .attr('href', d.terms_url)
79021                                 .attr('target', '_blank');
79022                         } else {
79023                             selection = d3_select(this);
79024                         }
79025
79026
79027                         var id_safe = d.id.replace(/\./g, '<TX_DOT>');
79028                         var terms_text = t('imagery.' + id_safe + '.attribution.text',
79029                             { default: d.terms_text || d.id || d.name() }
79030                         );
79031
79032                         if (d.icon && !d.overlay) {
79033                             selection
79034                                 .append('img')
79035                                 .attr('class', 'source-image')
79036                                 .attr('src', d.icon);
79037                         }
79038
79039                         selection
79040                             .append('span')
79041                             .attr('class', 'attribution-text')
79042                             .text(terms_text);
79043                     })
79044                     .merge(background);
79045
79046
79047                 var copyright = background.selectAll('.copyright-notice')
79048                     .data(function(d) {
79049                         var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
79050                         return notice ? [notice] : [];
79051                     });
79052
79053                 copyright.exit()
79054                     .remove();
79055
79056                 copyright = copyright.enter()
79057                     .append('span')
79058                     .attr('class', 'copyright-notice')
79059                     .merge(copyright);
79060
79061                 copyright
79062                     .text(String);
79063             }
79064
79065
79066             function update() {
79067                 attribution([context.background().baseLayerSource()], 'base-layer-attribution');
79068                 attribution(context.background().overlayLayerSources().filter(function (s) {
79069                     return s.validZoom(context.map().zoom());
79070                 }), 'overlay-layer-attribution');
79071             }
79072
79073
79074             return function(select) {
79075                 selection = select;
79076
79077                 context.background()
79078                     .on('change.attribution', update);
79079
79080                 context.map()
79081                     .on('move.attribution', throttle(update, 400, {leading: false}));
79082
79083                 update();
79084             };
79085         }
79086
79087         function uiBackgroundDisplayOptions(context) {
79088             var detected = utilDetect();
79089             var storedOpacity = context.storage('background-opacity');
79090             var minVal = 0.25;
79091             var maxVal = detected.cssfilters ? 2 : 1;
79092
79093             var sliders = detected.cssfilters
79094                 ? ['brightness', 'contrast', 'saturation', 'sharpness']
79095                 : ['brightness'];
79096
79097             var _options = {
79098                 brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
79099                 contrast: 1,
79100                 saturation: 1,
79101                 sharpness: 1
79102             };
79103
79104             var _selection = d3_select(null);
79105
79106
79107             function clamp(x, min, max) {
79108                 return Math.max(min, Math.min(x, max));
79109             }
79110
79111
79112             function updateValue(d, val) {
79113                 if (!val && event && event.target) {
79114                     val = event.target.value;
79115                 }
79116
79117                 val = clamp(val, minVal, maxVal);
79118
79119                 _options[d] = val;
79120                 context.background()[d](val);
79121
79122                 if (d === 'brightness') {
79123                     context.storage('background-opacity', val);
79124                 }
79125
79126                 _selection
79127                     .call(render);
79128             }
79129
79130
79131             function render(selection) {
79132                 var container = selection.selectAll('.display-options-container')
79133                     .data([0]);
79134
79135                 var containerEnter = container.enter()
79136                     .append('div')
79137                     .attr('class', 'display-options-container controls-list');
79138
79139                 // add slider controls
79140                 var slidersEnter = containerEnter.selectAll('.display-control')
79141                     .data(sliders)
79142                     .enter()
79143                     .append('div')
79144                     .attr('class', function(d) { return 'display-control display-control-' + d; });
79145
79146                 slidersEnter
79147                     .append('h5')
79148                     .text(function(d) { return t('background.' + d); })
79149                     .append('span')
79150                     .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
79151
79152                 slidersEnter
79153                     .append('input')
79154                     .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
79155                     .attr('type', 'range')
79156                     .attr('min', minVal)
79157                     .attr('max', maxVal)
79158                     .attr('step', '0.05')
79159                     .on('input', function(d) {
79160                         var val = d3_select(this).property('value');
79161                         updateValue(d, val);
79162                     });
79163
79164                 slidersEnter
79165                     .append('button')
79166                     .attr('title', t('background.reset'))
79167                     .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
79168                     .on('click', function(d) {
79169                         if (event.button !== 0) return;
79170                         updateValue(d, 1);
79171                     })
79172                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79173
79174                 // reset all button
79175                 containerEnter
79176                     .append('a')
79177                     .attr('class', 'display-option-resetlink')
79178                     .attr('href', '#')
79179                     .text(t('background.reset_all'))
79180                     .on('click', function() {
79181                         for (var i = 0; i < sliders.length; i++) {
79182                             updateValue(sliders[i],1);
79183                         }
79184                     });
79185
79186                 // update
79187                 container = containerEnter
79188                     .merge(container);
79189
79190                 container.selectAll('.display-option-input')
79191                     .property('value', function(d) { return _options[d]; });
79192
79193                 container.selectAll('.display-option-value')
79194                     .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
79195
79196                 container.selectAll('.display-option-reset')
79197                     .classed('disabled', function(d) { return _options[d] === 1; });
79198
79199                 // first time only, set brightness if needed
79200                 if (containerEnter.size() && _options.brightness !== 1) {
79201                     context.background().brightness(_options.brightness);
79202                 }
79203             }
79204
79205
79206             function backgroundDisplayOptions(selection) {
79207                 _selection = selection;
79208
79209                 selection
79210                     .call(uiDisclosure(context, 'background_display_options', true)
79211                         .title(t('background.display_options'))
79212                         .content(render)
79213                     );
79214             }
79215
79216
79217             return backgroundDisplayOptions;
79218         }
79219
79220         function uiBackgroundOffset(context) {
79221             var directions = [
79222                 ['right', [0.5, 0]],
79223                 ['top', [0, -0.5]],
79224                 ['left', [-0.5, 0]],
79225                 ['bottom', [0, 0.5]]
79226             ];
79227
79228
79229             function d3_eventCancel() {
79230                 event.stopPropagation();
79231                 event.preventDefault();
79232             }
79233
79234
79235             function updateValue() {
79236                 var meters = geoOffsetToMeters(context.background().offset());
79237                 var x = +meters[0].toFixed(2);
79238                 var y = +meters[1].toFixed(2);
79239
79240                 d3_selectAll('.nudge-inner-rect')
79241                     .select('input')
79242                     .classed('error', false)
79243                     .property('value', x + ', ' + y);
79244
79245                 d3_selectAll('.nudge-reset')
79246                     .classed('disabled', function() {
79247                         return (x === 0 && y === 0);
79248                     });
79249             }
79250
79251
79252             function resetOffset() {
79253                 context.background().offset([0, 0]);
79254                 updateValue();
79255             }
79256
79257
79258             function nudge(d) {
79259                 context.background().nudge(d, context.map().zoom());
79260                 updateValue();
79261             }
79262
79263
79264             function clickNudgeButton(d) {
79265                 var interval;
79266                 var timeout = window.setTimeout(function() {
79267                         interval = window.setInterval(nudge.bind(null, d), 100);
79268                     }, 500);
79269
79270                 function doneNudge() {
79271                     window.clearTimeout(timeout);
79272                     window.clearInterval(interval);
79273                     d3_select(window)
79274                         .on('mouseup.buttonoffset', null, true)
79275                         .on('mousedown.buttonoffset', null, true);
79276                 }
79277
79278                 d3_select(window)
79279                     .on('mouseup.buttonoffset', doneNudge, true)
79280                     .on('mousedown.buttonoffset', doneNudge, true);
79281
79282                 nudge(d);
79283             }
79284
79285
79286             function inputOffset() {
79287                 var input = d3_select(this);
79288                 var d = input.node().value;
79289
79290                 if (d === '') return resetOffset();
79291
79292                 d = d.replace(/;/g, ',').split(',').map(function(n) {
79293                     // if n is NaN, it will always get mapped to false.
79294                     return !isNaN(n) && n;
79295                 });
79296
79297                 if (d.length !== 2 || !d[0] || !d[1]) {
79298                     input.classed('error', true);
79299                     return;
79300                 }
79301
79302                 context.background().offset(geoMetersToOffset(d));
79303                 updateValue();
79304             }
79305
79306
79307             function dragOffset() {
79308                 event.preventDefault();
79309                 if (event.button !== 0) return;
79310
79311                 var origin = [event.clientX, event.clientY];
79312
79313                 context.container()
79314                     .append('div')
79315                     .attr('class', 'nudge-surface');
79316
79317                 d3_select(window)
79318                     .on('mousemove.offset', function() {
79319                         var latest = [event.clientX, event.clientY];
79320                         var d = [
79321                             -(origin[0] - latest[0]) / 4,
79322                             -(origin[1] - latest[1]) / 4
79323                         ];
79324
79325                         origin = latest;
79326                         nudge(d);
79327                     })
79328                     .on('mouseup.offset', function() {
79329                         if (event.button !== 0) return;
79330                         d3_selectAll('.nudge-surface')
79331                             .remove();
79332
79333                         d3_select(window)
79334                             .on('mousemove.offset', null)
79335                             .on('mouseup.offset', null);
79336                     });
79337             }
79338
79339
79340             function render(selection) {
79341                 var container = selection.selectAll('.nudge-container')
79342                     .data([0]);
79343
79344                 var containerEnter = container.enter()
79345                     .append('div')
79346                     .attr('class', 'nudge-container cf');
79347
79348                 containerEnter
79349                     .append('div')
79350                     .attr('class', 'nudge-instructions')
79351                     .text(t('background.offset'));
79352
79353                 var nudgeEnter = containerEnter
79354                     .append('div')
79355                     .attr('class', 'nudge-outer-rect')
79356                     .on('mousedown', dragOffset);
79357
79358                 nudgeEnter
79359                     .append('div')
79360                     .attr('class', 'nudge-inner-rect')
79361                     .append('input')
79362                     .on('change', inputOffset);
79363
79364                 containerEnter
79365                     .append('div')
79366                     .selectAll('button')
79367                     .data(directions).enter()
79368                     .append('button')
79369                     .attr('class', function(d) { return d[0] + ' nudge'; })
79370                     .on('contextmenu', d3_eventCancel)
79371                     .on('mousedown', function(d) {
79372                         if (event.button !== 0) return;
79373                         clickNudgeButton(d[1]);
79374                     });
79375
79376                 containerEnter
79377                     .append('button')
79378                     .attr('title', t('background.reset'))
79379                     .attr('class', 'nudge-reset disabled')
79380                     .on('contextmenu', d3_eventCancel)
79381                     .on('click', function() {
79382                         if (event.button !== 0) return;
79383                         resetOffset();
79384                     })
79385                     .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
79386
79387                 updateValue();
79388             }
79389
79390
79391             function backgroundOffset(selection) {
79392                 selection
79393                     .call(uiDisclosure(context, 'background_offset', false)
79394                         .title(t('background.fix_misalignment'))
79395                         .content(render)
79396                     );
79397             }
79398
79399
79400             context.background()
79401                 .on('change.backgroundOffset-update', updateValue);
79402
79403             return backgroundOffset;
79404         }
79405
79406         // import { utilGetDimensions } from '../util/dimensions';
79407
79408
79409         function uiMapInMap(context) {
79410
79411             function mapInMap(selection) {
79412                 var backgroundLayer = rendererTileLayer(context);
79413                 var overlayLayers = {};
79414                 var projection = geoRawMercator();
79415                 var dataLayer = svgData(projection, context).showLabels(false);
79416                 var debugLayer = svgDebug(projection, context);
79417                 var zoom = d3_zoom()
79418                     .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
79419                     .on('start', zoomStarted)
79420                     .on('zoom', zoomed)
79421                     .on('end', zoomEnded);
79422
79423                 var wrap = d3_select(null);
79424                 var tiles = d3_select(null);
79425                 var viewport = d3_select(null);
79426
79427                 var _isTransformed = false;
79428                 var _isHidden = true;
79429                 var _skipEvents = false;
79430                 var _gesture = null;
79431                 var _zDiff = 6;    // by default, minimap renders at (main zoom - 6)
79432                 var _dMini;        // dimensions of minimap
79433                 var _cMini;        // center pixel of minimap
79434                 var _tStart;       // transform at start of gesture
79435                 var _tCurr;        // transform at most recent event
79436                 var _timeoutID;
79437
79438
79439                 function zoomStarted() {
79440                     if (_skipEvents) return;
79441                     _tStart = _tCurr = projection.transform();
79442                     _gesture = null;
79443                 }
79444
79445
79446                 function zoomed() {
79447                     if (_skipEvents) return;
79448
79449                     var x = event.transform.x;
79450                     var y = event.transform.y;
79451                     var k = event.transform.k;
79452                     var isZooming = (k !== _tStart.k);
79453                     var isPanning = (x !== _tStart.x || y !== _tStart.y);
79454
79455                     if (!isZooming && !isPanning) {
79456                         return;  // no change
79457                     }
79458
79459                     // lock in either zooming or panning, don't allow both in minimap.
79460                     if (!_gesture) {
79461                         _gesture = isZooming ? 'zoom' : 'pan';
79462                     }
79463
79464                     var tMini = projection.transform();
79465                     var tX, tY, scale;
79466
79467                     if (_gesture === 'zoom') {
79468                         scale = k / tMini.k;
79469                         tX = (_cMini[0] / scale - _cMini[0]) * scale;
79470                         tY = (_cMini[1] / scale - _cMini[1]) * scale;
79471                     } else {
79472                         k = tMini.k;
79473                         scale = 1;
79474                         tX = x - tMini.x;
79475                         tY = y - tMini.y;
79476                     }
79477
79478                     utilSetTransform(tiles, tX, tY, scale);
79479                     utilSetTransform(viewport, 0, 0, scale);
79480                     _isTransformed = true;
79481                     _tCurr = identity$8.translate(x, y).scale(k);
79482
79483                     var zMain = geoScaleToZoom(context.projection.scale());
79484                     var zMini = geoScaleToZoom(k);
79485
79486                     _zDiff = zMain - zMini;
79487
79488                     queueRedraw();
79489                 }
79490
79491
79492                 function zoomEnded() {
79493                     if (_skipEvents) return;
79494                     if (_gesture !== 'pan') return;
79495
79496                     updateProjection();
79497                     _gesture = null;
79498                     context.map().center(projection.invert(_cMini));   // recenter main map..
79499                 }
79500
79501
79502                 function updateProjection() {
79503                     var loc = context.map().center();
79504                     var tMain = context.projection.transform();
79505                     var zMain = geoScaleToZoom(tMain.k);
79506                     var zMini = Math.max(zMain - _zDiff, 0.5);
79507                     var kMini = geoZoomToScale(zMini);
79508
79509                     projection
79510                         .translate([tMain.x, tMain.y])
79511                         .scale(kMini);
79512
79513                     var point = projection(loc);
79514                     var mouse = (_gesture === 'pan') ? geoVecSubtract([_tCurr.x, _tCurr.y], [_tStart.x, _tStart.y]) : [0, 0];
79515                     var xMini = _cMini[0] - point[0] + tMain.x + mouse[0];
79516                     var yMini = _cMini[1] - point[1] + tMain.y + mouse[1];
79517
79518                     projection
79519                         .translate([xMini, yMini])
79520                         .clipExtent([[0, 0], _dMini]);
79521
79522                     _tCurr = projection.transform();
79523
79524                     if (_isTransformed) {
79525                         utilSetTransform(tiles, 0, 0);
79526                         utilSetTransform(viewport, 0, 0);
79527                         _isTransformed = false;
79528                     }
79529
79530                     zoom
79531                         .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
79532
79533                     _skipEvents = true;
79534                     wrap.call(zoom.transform, _tCurr);
79535                     _skipEvents = false;
79536                 }
79537
79538
79539                 function redraw() {
79540                     clearTimeout(_timeoutID);
79541                     if (_isHidden) return;
79542
79543                     updateProjection();
79544                     var zMini = geoScaleToZoom(projection.scale());
79545
79546                     // setup tile container
79547                     tiles = wrap
79548                         .selectAll('.map-in-map-tiles')
79549                         .data([0]);
79550
79551                     tiles = tiles.enter()
79552                         .append('div')
79553                         .attr('class', 'map-in-map-tiles')
79554                         .merge(tiles);
79555
79556                     // redraw background
79557                     backgroundLayer
79558                         .source(context.background().baseLayerSource())
79559                         .projection(projection)
79560                         .dimensions(_dMini);
79561
79562                     var background = tiles
79563                         .selectAll('.map-in-map-background')
79564                         .data([0]);
79565
79566                     background.enter()
79567                         .append('div')
79568                         .attr('class', 'map-in-map-background')
79569                         .merge(background)
79570                         .call(backgroundLayer);
79571
79572
79573                     // redraw overlay
79574                     var overlaySources = context.background().overlayLayerSources();
79575                     var activeOverlayLayers = [];
79576                     for (var i = 0; i < overlaySources.length; i++) {
79577                         if (overlaySources[i].validZoom(zMini)) {
79578                             if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
79579                             activeOverlayLayers.push(overlayLayers[i]
79580                                 .source(overlaySources[i])
79581                                 .projection(projection)
79582                                 .dimensions(_dMini));
79583                         }
79584                     }
79585
79586                     var overlay = tiles
79587                         .selectAll('.map-in-map-overlay')
79588                         .data([0]);
79589
79590                     overlay = overlay.enter()
79591                         .append('div')
79592                         .attr('class', 'map-in-map-overlay')
79593                         .merge(overlay);
79594
79595
79596                     var overlays = overlay
79597                         .selectAll('div')
79598                         .data(activeOverlayLayers, function(d) { return d.source().name(); });
79599
79600                     overlays.exit()
79601                         .remove();
79602
79603                     overlays = overlays.enter()
79604                         .append('div')
79605                         .merge(overlays)
79606                         .each(function(layer) { d3_select(this).call(layer); });
79607
79608
79609                     var dataLayers = tiles
79610                         .selectAll('.map-in-map-data')
79611                         .data([0]);
79612
79613                     dataLayers.exit()
79614                         .remove();
79615
79616                     dataLayers = dataLayers.enter()
79617                         .append('svg')
79618                         .attr('class', 'map-in-map-data')
79619                         .merge(dataLayers)
79620                         .call(dataLayer)
79621                         .call(debugLayer);
79622
79623
79624                     // redraw viewport bounding box
79625                     if (_gesture !== 'pan') {
79626                         var getPath = d3_geoPath(projection);
79627                         var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
79628
79629                         viewport = wrap.selectAll('.map-in-map-viewport')
79630                             .data([0]);
79631
79632                         viewport = viewport.enter()
79633                             .append('svg')
79634                             .attr('class', 'map-in-map-viewport')
79635                             .merge(viewport);
79636
79637
79638                         var path = viewport.selectAll('.map-in-map-bbox')
79639                             .data([bbox]);
79640
79641                         path.enter()
79642                             .append('path')
79643                             .attr('class', 'map-in-map-bbox')
79644                             .merge(path)
79645                             .attr('d', getPath)
79646                             .classed('thick', function(d) { return getPath.area(d) < 30; });
79647                     }
79648                 }
79649
79650
79651                 function queueRedraw() {
79652                     clearTimeout(_timeoutID);
79653                     _timeoutID = setTimeout(function() { redraw(); }, 750);
79654                 }
79655
79656
79657                 function toggle() {
79658                     if (event) event.preventDefault();
79659
79660                     _isHidden = !_isHidden;
79661
79662                     d3_select('.minimap-toggle-item')
79663                         .classed('active', !_isHidden)
79664                         .select('input')
79665                         .property('checked', !_isHidden);
79666
79667                     if (_isHidden) {
79668                         wrap
79669                             .style('display', 'block')
79670                             .style('opacity', '1')
79671                             .transition()
79672                             .duration(200)
79673                             .style('opacity', '0')
79674                             .on('end', function() {
79675                                 selection.selectAll('.map-in-map')
79676                                     .style('display', 'none');
79677                             });
79678                     } else {
79679                         wrap
79680                             .style('display', 'block')
79681                             .style('opacity', '0')
79682                             .transition()
79683                             .duration(200)
79684                             .style('opacity', '1')
79685                             .on('end', function() {
79686                                 redraw();
79687                             });
79688                     }
79689                 }
79690
79691
79692                 uiMapInMap.toggle = toggle;
79693
79694                 wrap = selection.selectAll('.map-in-map')
79695                     .data([0]);
79696
79697                 wrap = wrap.enter()
79698                     .append('div')
79699                     .attr('class', 'map-in-map')
79700                     .style('display', (_isHidden ? 'none' : 'block'))
79701                     .call(zoom)
79702                     .on('dblclick.zoom', null)
79703                     .merge(wrap);
79704
79705                 // reflow warning: Hardcode dimensions - currently can't resize it anyway..
79706                 _dMini = [200,150]; //utilGetDimensions(wrap);
79707                 _cMini = geoVecScale(_dMini, 0.5);
79708
79709                 context.map()
79710                     .on('drawn.map-in-map', function(drawn) {
79711                         if (drawn.full === true) {
79712                             redraw();
79713                         }
79714                     });
79715
79716                 redraw();
79717
79718                 context.keybinding()
79719                     .on(t('background.minimap.key'), toggle);
79720             }
79721
79722             return mapInMap;
79723         }
79724
79725         function uiConfirm(selection) {
79726             var modalSelection = uiModal(selection);
79727
79728             modalSelection.select('.modal')
79729                 .classed('modal-alert', true);
79730
79731             var section = modalSelection.select('.content');
79732
79733             section.append('div')
79734                 .attr('class', 'modal-section header');
79735
79736             section.append('div')
79737                 .attr('class', 'modal-section message-text');
79738
79739             var buttons = section.append('div')
79740                 .attr('class', 'modal-section buttons cf');
79741
79742
79743             modalSelection.okButton = function() {
79744                 buttons
79745                     .append('button')
79746                     .attr('class', 'button ok-button action')
79747                     .on('click.confirm', function() {
79748                         modalSelection.remove();
79749                     })
79750                     .text(t('confirm.okay'))
79751                     .node()
79752                     .focus();
79753
79754                 return modalSelection;
79755             };
79756
79757
79758             return modalSelection;
79759         }
79760
79761         function uiSettingsCustomBackground(context) {
79762             var dispatch$1 = dispatch('change');
79763
79764             function render(selection) {
79765                 // keep separate copies of original and current settings
79766                 var _origSettings = {
79767                     template: context.storage('background-custom-template')
79768                 };
79769                 var _currSettings = {
79770                     template: context.storage('background-custom-template')
79771                 };
79772
79773                 var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
79774                 var modal = uiConfirm(selection).okButton();
79775
79776                 modal
79777                     .classed('settings-modal settings-custom-background', true);
79778
79779                 modal.select('.modal-section.header')
79780                     .append('h3')
79781                     .text(t('settings.custom_background.header'));
79782
79783
79784                 var textSection = modal.select('.modal-section.message-text');
79785
79786                 textSection
79787                     .append('pre')
79788                     .attr('class', 'instructions-template')
79789                     .text(t('settings.custom_background.instructions', { example: example }));
79790
79791                 textSection
79792                     .append('textarea')
79793                     .attr('class', 'field-template')
79794                     .attr('placeholder', t('settings.custom_background.template.placeholder'))
79795                     .call(utilNoAuto)
79796                     .property('value', _currSettings.template);
79797
79798
79799                 // insert a cancel button
79800                 var buttonSection = modal.select('.modal-section.buttons');
79801
79802                 buttonSection
79803                     .insert('button', '.ok-button')
79804                     .attr('class', 'button cancel-button secondary-action')
79805                     .text(t('confirm.cancel'));
79806
79807
79808                 buttonSection.select('.cancel-button')
79809                     .on('click.cancel', clickCancel);
79810
79811                 buttonSection.select('.ok-button')
79812                     .attr('disabled', isSaveDisabled)
79813                     .on('click.save', clickSave);
79814
79815
79816                 function isSaveDisabled() {
79817                     return null;
79818                 }
79819
79820
79821                 // restore the original template
79822                 function clickCancel() {
79823                     textSection.select('.field-template').property('value', _origSettings.template);
79824                     context.storage('background-custom-template', _origSettings.template);
79825                     this.blur();
79826                     modal.close();
79827                 }
79828
79829                 // accept the current template
79830                 function clickSave() {
79831                     _currSettings.template = textSection.select('.field-template').property('value');
79832                     context.storage('background-custom-template', _currSettings.template);
79833                     this.blur();
79834                     modal.close();
79835                     dispatch$1.call('change', this, _currSettings);
79836                 }
79837             }
79838
79839             return utilRebind(render, dispatch$1, 'on');
79840         }
79841
79842         function uiBackground(context) {
79843             var key = t('background.key');
79844
79845             var _pane = d3_select(null), _toggleButton = d3_select(null);
79846
79847             var _customSource = context.background().findSource('custom');
79848             var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
79849
79850             var _backgroundList = d3_select(null);
79851             var _overlayList = d3_select(null);
79852             var _displayOptionsContainer = d3_select(null);
79853             var _offsetContainer = d3_select(null);
79854
79855             var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
79856             var backgroundOffset = uiBackgroundOffset(context);
79857
79858             var settingsCustomBackground = uiSettingsCustomBackground(context)
79859                 .on('change', customChanged);
79860
79861
79862             function setTooltips(selection) {
79863                 selection.each(function(d, i, nodes) {
79864                     var item = d3_select(this).select('label');
79865                     var span = item.select('span');
79866                     var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
79867                     var description = d.description();
79868                     var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
79869
79870                     item.call(tooltip().destroyAny);
79871
79872                     if (d === _previousBackground) {
79873                         item.call(tooltip()
79874                             .placement(placement)
79875                             .html(true)
79876                             .title(function() {
79877                                 var tip = '<div>' + t('background.switch') + '</div>';
79878                                 return uiTooltipHtml(tip, uiCmd('⌘' + key));
79879                             })
79880                         );
79881                     } else if (description || isOverflowing) {
79882                         item.call(tooltip()
79883                             .placement(placement)
79884                             .title(description || d.name())
79885                         );
79886                     }
79887                 });
79888             }
79889
79890
79891             function updateLayerSelections(selection) {
79892                 function active(d) {
79893                     return context.background().showsLayer(d);
79894                 }
79895
79896                 selection.selectAll('li')
79897                     .classed('active', active)
79898                     .classed('switch', function(d) { return d === _previousBackground; })
79899                     .call(setTooltips)
79900                     .selectAll('input')
79901                     .property('checked', active);
79902             }
79903
79904
79905             function chooseBackground(d) {
79906                 if (d.id === 'custom' && !d.template()) {
79907                     return editCustom();
79908                 }
79909
79910                 event.preventDefault();
79911                 _previousBackground = context.background().baseLayerSource();
79912                 context.storage('background-last-used-toggle', _previousBackground.id);
79913                 context.storage('background-last-used', d.id);
79914                 context.background().baseLayerSource(d);
79915                 _backgroundList.call(updateLayerSelections);
79916                 document.activeElement.blur();
79917             }
79918
79919
79920             function customChanged(d) {
79921                 if (d && d.template) {
79922                     _customSource.template(d.template);
79923                     chooseBackground(_customSource);
79924                 } else {
79925                     _customSource.template('');
79926                     chooseBackground(context.background().findSource('none'));
79927                 }
79928             }
79929
79930
79931             function editCustom() {
79932                 event.preventDefault();
79933                 context.container()
79934                     .call(settingsCustomBackground);
79935             }
79936
79937
79938             function chooseOverlay(d) {
79939                 event.preventDefault();
79940                 context.background().toggleOverlayLayer(d);
79941                 _overlayList.call(updateLayerSelections);
79942                 document.activeElement.blur();
79943             }
79944
79945
79946             function drawListItems(layerList, type, change, filter) {
79947                 var sources = context.background()
79948                     .sources(context.map().extent())
79949                     .filter(filter);
79950
79951                 var layerLinks = layerList.selectAll('li')
79952                     .data(sources, function(d) { return d.name(); });
79953
79954                 layerLinks.exit()
79955                     .remove();
79956
79957                 var enter = layerLinks.enter()
79958                     .append('li')
79959                     .classed('layer-custom', function(d) { return d.id === 'custom'; })
79960                     .classed('best', function(d) { return d.best(); });
79961
79962                 enter.filter(function(d) { return d.id === 'custom'; })
79963                     .append('button')
79964                     .attr('class', 'layer-browse')
79965                     .call(tooltip()
79966                         .title(t('settings.custom_background.tooltip'))
79967                         .placement((textDirection === 'rtl') ? 'right' : 'left')
79968                     )
79969                     .on('click', editCustom)
79970                     .call(svgIcon('#iD-icon-more'));
79971
79972                 enter.filter(function(d) { return d.best(); })
79973                     .append('div')
79974                     .attr('class', 'best')
79975                     .call(tooltip()
79976                         .title(t('background.best_imagery'))
79977                         .placement((textDirection === 'rtl') ? 'right' : 'left')
79978                     )
79979                     .append('span')
79980                     .html('&#9733;');
79981
79982                 var label = enter
79983                     .append('label');
79984
79985                 label
79986                     .append('input')
79987                     .attr('type', type)
79988                     .attr('name', 'layers')
79989                     .on('change', change);
79990
79991                 label
79992                     .append('span')
79993                     .text(function(d) { return d.name(); });
79994
79995
79996                 layerList.selectAll('li')
79997                     .sort(sortSources)
79998                     .style('display', layerList.selectAll('li').data().length > 0 ? 'block' : 'none');
79999
80000                 layerList
80001                     .call(updateLayerSelections);
80002
80003
80004                 function sortSources(a, b) {
80005                     return a.best() && !b.best() ? -1
80006                         : b.best() && !a.best() ? 1
80007                         : d3_descending(a.area(), b.area()) || d3_ascending(a.name(), b.name()) || 0;
80008                 }
80009             }
80010
80011
80012             function renderBackgroundList(selection) {
80013
80014                 // the background list
80015                 var container = selection.selectAll('.layer-background-list')
80016                     .data([0]);
80017
80018                 _backgroundList = container.enter()
80019                     .append('ul')
80020                     .attr('class', 'layer-list layer-background-list')
80021                     .attr('dir', 'auto')
80022                     .merge(container);
80023
80024
80025                 // add minimap toggle below list
80026                 var minimapEnter = selection.selectAll('.minimap-toggle-list')
80027                     .data([0])
80028                     .enter()
80029                     .append('ul')
80030                     .attr('class', 'layer-list minimap-toggle-list')
80031                     .append('li')
80032                     .attr('class', 'minimap-toggle-item');
80033
80034                 var minimapLabelEnter = minimapEnter
80035                     .append('label')
80036                     .call(tooltip()
80037                         .html(true)
80038                         .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
80039                         .placement('top')
80040                     );
80041
80042                 minimapLabelEnter
80043                     .append('input')
80044                     .attr('type', 'checkbox')
80045                     .on('change', function() {
80046                         event.preventDefault();
80047                         uiMapInMap.toggle();
80048                     });
80049
80050                 minimapLabelEnter
80051                     .append('span')
80052                     .text(t('background.minimap.description'));
80053
80054
80055                 // "Info / Report a Problem" link
80056                 selection.selectAll('.imagery-faq')
80057                     .data([0])
80058                     .enter()
80059                     .append('div')
80060                     .attr('class', 'imagery-faq')
80061                     .append('a')
80062                     .attr('target', '_blank')
80063                     .attr('tabindex', -1)
80064                     .call(svgIcon('#iD-icon-out-link', 'inline'))
80065                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
80066                     .append('span')
80067                     .text(t('background.imagery_source_faq'));
80068
80069                 updateBackgroundList();
80070             }
80071
80072
80073             function renderOverlayList(selection) {
80074                 var container = selection.selectAll('.layer-overlay-list')
80075                     .data([0]);
80076
80077                 _overlayList = container.enter()
80078                     .append('ul')
80079                     .attr('class', 'layer-list layer-overlay-list')
80080                     .attr('dir', 'auto')
80081                     .merge(container);
80082
80083                 updateOverlayList();
80084             }
80085
80086             function updateBackgroundList() {
80087                 _backgroundList
80088                     .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
80089             }
80090
80091             function updateOverlayList() {
80092                 _overlayList
80093                     .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
80094             }
80095
80096
80097             function update() {
80098                 if (!_pane.select('.disclosure-wrap-background_list').classed('hide')) {
80099                     updateBackgroundList();
80100                 }
80101
80102                 if (!_pane.select('.disclosure-wrap-overlay_list').classed('hide')) {
80103                     updateOverlayList();
80104                 }
80105
80106                 _displayOptionsContainer
80107                     .call(backgroundDisplayOptions);
80108
80109                 _offsetContainer
80110                     .call(backgroundOffset);
80111             }
80112
80113
80114             function quickSwitch() {
80115                 if (event) {
80116                     event.stopImmediatePropagation();
80117                     event.preventDefault();
80118                 }
80119                 if (_previousBackground) {
80120                     chooseBackground(_previousBackground);
80121                 }
80122             }
80123
80124             var paneTooltip = tooltip()
80125                 .placement((textDirection === 'rtl') ? 'right' : 'left')
80126                 .html(true)
80127                 .title(uiTooltipHtml(t('background.description'), key));
80128
80129             uiBackground.togglePane = function() {
80130                 if (event) event.preventDefault();
80131                 paneTooltip.hide(_toggleButton);
80132                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
80133             };
80134
80135             function hidePane() {
80136                 context.ui().togglePanes();
80137             }
80138
80139             uiBackground.renderToggleButton = function(selection) {
80140
80141                 _toggleButton = selection
80142                     .append('button')
80143                     .attr('tabindex', -1)
80144                     .on('click', uiBackground.togglePane)
80145                     .call(svgIcon('#iD-icon-layers', 'light'))
80146                     .call(paneTooltip);
80147             };
80148
80149             uiBackground.renderPane = function(selection) {
80150
80151                 _pane = selection
80152                     .append('div')
80153                     .attr('class', 'fillL map-pane background-pane hide')
80154                     .attr('pane', 'background');
80155
80156
80157                 var heading = _pane
80158                     .append('div')
80159                     .attr('class', 'pane-heading');
80160
80161                 heading
80162                     .append('h2')
80163                     .text(t('background.title'));
80164
80165                 heading
80166                     .append('button')
80167                     .on('click', hidePane)
80168                     .call(svgIcon('#iD-icon-close'));
80169
80170
80171                 var content = _pane
80172                     .append('div')
80173                     .attr('class', 'pane-content');
80174
80175                 // background list
80176                 content
80177                     .append('div')
80178                     .attr('class', 'background-background-list-container')
80179                     .call(uiDisclosure(context, 'background_list', true)
80180                         .title(t('background.backgrounds'))
80181                         .content(renderBackgroundList)
80182                     );
80183
80184                 // overlay list
80185                 content
80186                     .append('div')
80187                     .attr('class', 'background-overlay-list-container')
80188                     .call(uiDisclosure(context, 'overlay_list', true)
80189                         .title(t('background.overlays'))
80190                         .content(renderOverlayList)
80191                     );
80192
80193                 // display options
80194                 _displayOptionsContainer = content
80195                     .append('div')
80196                     .attr('class', 'background-display-options');
80197
80198                 // offset controls
80199                 _offsetContainer = content
80200                     .append('div')
80201                     .attr('class', 'background-offset');
80202
80203
80204                 // add listeners
80205                 context.map()
80206                     .on('move.background-update',
80207                         debounce(function() { window.requestIdleCallback(update); }, 1000)
80208                     );
80209
80210
80211                 context.background()
80212                     .on('change.background-update', update);
80213
80214
80215                 update();
80216
80217                 context.keybinding()
80218                     .on(key, uiBackground.togglePane)
80219                     .on(uiCmd('⌘' + key), quickSwitch);
80220             };
80221
80222             return uiBackground;
80223         }
80224
80225         function uiContributors(context) {
80226             var osm = context.connection(),
80227                 debouncedUpdate = debounce(function() { update(); }, 1000),
80228                 limit = 4,
80229                 hidden = false,
80230                 wrap = d3_select(null);
80231
80232
80233             function update() {
80234                 if (!osm) return;
80235
80236                 var users = {},
80237                     entities = context.intersects(context.map().extent());
80238
80239                 entities.forEach(function(entity) {
80240                     if (entity && entity.user) users[entity.user] = true;
80241                 });
80242
80243                 var u = Object.keys(users),
80244                     subset = u.slice(0, u.length > limit ? limit - 1 : limit);
80245
80246                 wrap.html('')
80247                     .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
80248
80249                 var userList = d3_select(document.createElement('span'));
80250
80251                 userList.selectAll()
80252                     .data(subset)
80253                     .enter()
80254                     .append('a')
80255                     .attr('class', 'user-link')
80256                     .attr('href', function(d) { return osm.userURL(d); })
80257                     .attr('target', '_blank')
80258                     .attr('tabindex', -1)
80259                     .text(String);
80260
80261                 if (u.length > limit) {
80262                     var count = d3_select(document.createElement('span'));
80263
80264                     count.append('a')
80265                         .attr('target', '_blank')
80266                         .attr('tabindex', -1)
80267                         .attr('href', function() {
80268                             return osm.changesetsURL(context.map().center(), context.map().zoom());
80269                         })
80270                         .text(u.length - limit + 1);
80271
80272                     wrap.append('span')
80273                         .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
80274
80275                 } else {
80276                     wrap.append('span')
80277                         .html(t('contributors.list', { users: userList.html() }));
80278                 }
80279
80280                 if (!u.length) {
80281                     hidden = true;
80282                     wrap
80283                         .transition()
80284                         .style('opacity', 0);
80285
80286                 } else if (hidden) {
80287                     wrap
80288                         .transition()
80289                         .style('opacity', 1);
80290                 }
80291             }
80292
80293
80294             return function(selection) {
80295                 if (!osm) return;
80296                 wrap = selection;
80297                 update();
80298
80299                 osm.on('loaded.contributors', debouncedUpdate);
80300                 context.map().on('move.contributors', debouncedUpdate);
80301             };
80302         }
80303
80304         function uiFeatureInfo(context) {
80305             function update(selection) {
80306                 var features = context.features();
80307                 var stats = features.stats();
80308                 var count = 0;
80309                 var hiddenList = features.hidden().map(function(k) {
80310                     if (stats[k]) {
80311                         count += stats[k];
80312                         return String(stats[k]) + ' ' + t('feature.' + k + '.description');
80313                     }
80314                 }).filter(Boolean);
80315
80316                 selection.html('');
80317
80318                 if (hiddenList.length) {
80319                     var tooltipBehavior = tooltip()
80320                         .placement('top')
80321                         .html(true)
80322                         .title(function() {
80323                             return uiTooltipHtml(hiddenList.join('<br/>'));
80324                         });
80325
80326                     var warning = selection.append('a')
80327                         .attr('href', '#')
80328                         .attr('tabindex', -1)
80329                         .html(t('feature_info.hidden_warning', { count: count }))
80330                         .call(tooltipBehavior)
80331                         .on('click', function() {
80332                             tooltipBehavior.hide(warning);
80333                             // open map data panel?
80334                             event.preventDefault();
80335                         });
80336                 }
80337
80338                 selection
80339                     .classed('hide', !hiddenList.length);
80340             }
80341
80342
80343             return function(selection) {
80344                 update(selection);
80345
80346                 context.features().on('change.feature_info', function() {
80347                     update(selection);
80348                 });
80349             };
80350         }
80351
80352         function uiFullScreen(context) {
80353             var element = context.container().node();
80354             // var button = d3_select(null);
80355
80356
80357             function getFullScreenFn() {
80358                 if (element.requestFullscreen) {
80359                     return element.requestFullscreen;
80360                 } else if (element.msRequestFullscreen) {
80361                     return element.msRequestFullscreen;
80362                 } else if (element.mozRequestFullScreen) {
80363                     return element.mozRequestFullScreen;
80364                 } else if (element.webkitRequestFullscreen) {
80365                     return element.webkitRequestFullscreen;
80366                 }
80367             }
80368
80369
80370             function getExitFullScreenFn() {
80371                 if (document.exitFullscreen) {
80372                     return document.exitFullscreen;
80373                 } else if (document.msExitFullscreen) {
80374                     return document.msExitFullscreen;
80375                 } else if (document.mozCancelFullScreen) {
80376                     return document.mozCancelFullScreen;
80377                 } else if (document.webkitExitFullscreen) {
80378                     return document.webkitExitFullscreen;
80379                 }
80380             }
80381
80382
80383             function isFullScreen() {
80384                 return document.fullscreenElement ||
80385                     document.mozFullScreenElement ||
80386                     document.webkitFullscreenElement ||
80387                     document.msFullscreenElement;
80388             }
80389
80390
80391             function isSupported() {
80392                 return !!getFullScreenFn();
80393             }
80394
80395
80396             function fullScreen() {
80397                 event.preventDefault();
80398                 if (!isFullScreen()) {
80399                     // button.classed('active', true);
80400                     getFullScreenFn().apply(element);
80401                 } else {
80402                     // button.classed('active', false);
80403                     getExitFullScreenFn().apply(document);
80404                 }
80405             }
80406
80407
80408             return function() { // selection) {
80409                 if (!isSupported()) return;
80410
80411                 // button = selection.append('button')
80412                 //     .attr('title', t('full_screen'))
80413                 //     .attr('tabindex', -1)
80414                 //     .on('click', fullScreen)
80415                 //     .call(tooltip);
80416
80417                 // button.append('span')
80418                 //     .attr('class', 'icon full-screen');
80419
80420                 var detected = utilDetect();
80421                 var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
80422                 context.keybinding().on(keys, fullScreen);
80423             };
80424         }
80425
80426         function uiGeolocate(context) {
80427             var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ };
80428             var locating = uiLoading(context).message(t('geolocate.locating')).blocking(true);
80429             var layer = context.layers().layer('geolocate');
80430             var _position;
80431             var _extent;
80432             var _timeoutID;
80433
80434
80435             function click() {
80436                 if (context.inIntro()) return;
80437                 context.enter(modeBrowse(context));
80438                 if (!layer.enabled()) {
80439                     if (!_position) {
80440                         context.container().call(locating);
80441                         navigator.geolocation.getCurrentPosition(success, error, geoOptions);
80442                     } else {
80443                         zoomTo();
80444                     }
80445                 } else {
80446                     layer.enabled(null, false);
80447                 }
80448                 // This timeout ensures that we still call finish() even if
80449                 // the user declines to share their location in Firefox
80450                 _timeoutID = setTimeout(finish, 10000 /* 10sec */ );
80451             }
80452
80453             function zoomTo() {
80454                 var map = context.map();
80455                 layer.enabled(_position, true);
80456                 map.centerZoomEase(_extent.center(), Math.min(20, map.extentZoom(_extent)));
80457             }
80458
80459
80460             function success(geolocation) {
80461                 _position = geolocation;
80462                 var coords = _position.coords;
80463                 _extent = geoExtent([coords.longitude, coords.latitude]).padByMeters(coords.accuracy);
80464                 zoomTo();
80465                 finish();
80466             }
80467
80468
80469             function error() {
80470                 finish();
80471             }
80472
80473
80474             function finish() {
80475                 locating.close();  // unblock ui
80476                 if (_timeoutID) { clearTimeout(_timeoutID); }
80477                 _timeoutID = undefined;
80478             }
80479
80480
80481             return function(selection) {
80482                 if (!navigator.geolocation) return;
80483
80484                 selection
80485                     .append('button')
80486                     .attr('tabindex', -1)
80487                     .attr('title', t('geolocate.title'))
80488                     .on('click', click)
80489                     .call(svgIcon('#iD-icon-geolocate', 'light'))
80490                     .call(tooltip()
80491                         .placement((textDirection === 'rtl') ? 'right' : 'left'));
80492             };
80493         }
80494
80495         var marked = createCommonjsModule(function (module, exports) {
80496         (function(root) {
80497
80498         /**
80499          * Block-Level Grammar
80500          */
80501
80502         var block = {
80503           newline: /^\n+/,
80504           code: /^( {4}[^\n]+\n*)+/,
80505           fences: noop,
80506           hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
80507           heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
80508           nptable: noop,
80509           blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
80510           list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
80511           html: '^ {0,3}(?:' // optional indentation
80512             + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
80513             + '|comment[^\\n]*(\\n+|$)' // (2)
80514             + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
80515             + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
80516             + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
80517             + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
80518             + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
80519             + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
80520             + ')',
80521           def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
80522           table: noop,
80523           lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
80524           paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
80525           text: /^[^\n]+/
80526         };
80527
80528         block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
80529         block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
80530         block.def = edit(block.def)
80531           .replace('label', block._label)
80532           .replace('title', block._title)
80533           .getRegex();
80534
80535         block.bullet = /(?:[*+-]|\d{1,9}\.)/;
80536         block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
80537         block.item = edit(block.item, 'gm')
80538           .replace(/bull/g, block.bullet)
80539           .getRegex();
80540
80541         block.list = edit(block.list)
80542           .replace(/bull/g, block.bullet)
80543           .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
80544           .replace('def', '\\n+(?=' + block.def.source + ')')
80545           .getRegex();
80546
80547         block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
80548           + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
80549           + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
80550           + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
80551           + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
80552           + '|track|ul';
80553         block._comment = /<!--(?!-?>)[\s\S]*?-->/;
80554         block.html = edit(block.html, 'i')
80555           .replace('comment', block._comment)
80556           .replace('tag', block._tag)
80557           .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
80558           .getRegex();
80559
80560         block.paragraph = edit(block.paragraph)
80561           .replace('hr', block.hr)
80562           .replace('heading', block.heading)
80563           .replace('lheading', block.lheading)
80564           .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
80565           .getRegex();
80566
80567         block.blockquote = edit(block.blockquote)
80568           .replace('paragraph', block.paragraph)
80569           .getRegex();
80570
80571         /**
80572          * Normal Block Grammar
80573          */
80574
80575         block.normal = merge({}, block);
80576
80577         /**
80578          * GFM Block Grammar
80579          */
80580
80581         block.gfm = merge({}, block.normal, {
80582           fences: /^ {0,3}(`{3,}|~{3,})([^`\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
80583           paragraph: /^/,
80584           heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
80585         });
80586
80587         block.gfm.paragraph = edit(block.paragraph)
80588           .replace('(?!', '(?!'
80589             + block.gfm.fences.source.replace('\\1', '\\2') + '|'
80590             + block.list.source.replace('\\1', '\\3') + '|')
80591           .getRegex();
80592
80593         /**
80594          * GFM + Tables Block Grammar
80595          */
80596
80597         block.tables = merge({}, block.gfm, {
80598           nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
80599           table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
80600         });
80601
80602         /**
80603          * Pedantic grammar
80604          */
80605
80606         block.pedantic = merge({}, block.normal, {
80607           html: edit(
80608             '^ *(?:comment *(?:\\n|\\s*$)'
80609             + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
80610             + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
80611             .replace('comment', block._comment)
80612             .replace(/tag/g, '(?!(?:'
80613               + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
80614               + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
80615               + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
80616             .getRegex(),
80617           def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
80618         });
80619
80620         /**
80621          * Block Lexer
80622          */
80623
80624         function Lexer(options) {
80625           this.tokens = [];
80626           this.tokens.links = Object.create(null);
80627           this.options = options || marked.defaults;
80628           this.rules = block.normal;
80629
80630           if (this.options.pedantic) {
80631             this.rules = block.pedantic;
80632           } else if (this.options.gfm) {
80633             if (this.options.tables) {
80634               this.rules = block.tables;
80635             } else {
80636               this.rules = block.gfm;
80637             }
80638           }
80639         }
80640
80641         /**
80642          * Expose Block Rules
80643          */
80644
80645         Lexer.rules = block;
80646
80647         /**
80648          * Static Lex Method
80649          */
80650
80651         Lexer.lex = function(src, options) {
80652           var lexer = new Lexer(options);
80653           return lexer.lex(src);
80654         };
80655
80656         /**
80657          * Preprocessing
80658          */
80659
80660         Lexer.prototype.lex = function(src) {
80661           src = src
80662             .replace(/\r\n|\r/g, '\n')
80663             .replace(/\t/g, '    ')
80664             .replace(/\u00a0/g, ' ')
80665             .replace(/\u2424/g, '\n');
80666
80667           return this.token(src, true);
80668         };
80669
80670         /**
80671          * Lexing
80672          */
80673
80674         Lexer.prototype.token = function(src, top) {
80675           src = src.replace(/^ +$/gm, '');
80676           var next,
80677               loose,
80678               cap,
80679               bull,
80680               b,
80681               item,
80682               listStart,
80683               listItems,
80684               t,
80685               space,
80686               i,
80687               tag,
80688               l,
80689               isordered,
80690               istask,
80691               ischecked;
80692
80693           while (src) {
80694             // newline
80695             if (cap = this.rules.newline.exec(src)) {
80696               src = src.substring(cap[0].length);
80697               if (cap[0].length > 1) {
80698                 this.tokens.push({
80699                   type: 'space'
80700                 });
80701               }
80702             }
80703
80704             // code
80705             if (cap = this.rules.code.exec(src)) {
80706               src = src.substring(cap[0].length);
80707               cap = cap[0].replace(/^ {4}/gm, '');
80708               this.tokens.push({
80709                 type: 'code',
80710                 text: !this.options.pedantic
80711                   ? rtrim(cap, '\n')
80712                   : cap
80713               });
80714               continue;
80715             }
80716
80717             // fences (gfm)
80718             if (cap = this.rules.fences.exec(src)) {
80719               src = src.substring(cap[0].length);
80720               this.tokens.push({
80721                 type: 'code',
80722                 lang: cap[2] ? cap[2].trim() : cap[2],
80723                 text: cap[3] || ''
80724               });
80725               continue;
80726             }
80727
80728             // heading
80729             if (cap = this.rules.heading.exec(src)) {
80730               src = src.substring(cap[0].length);
80731               this.tokens.push({
80732                 type: 'heading',
80733                 depth: cap[1].length,
80734                 text: cap[2]
80735               });
80736               continue;
80737             }
80738
80739             // table no leading pipe (gfm)
80740             if (cap = this.rules.nptable.exec(src)) {
80741               item = {
80742                 type: 'table',
80743                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80744                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80745                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80746               };
80747
80748               if (item.header.length === item.align.length) {
80749                 src = src.substring(cap[0].length);
80750
80751                 for (i = 0; i < item.align.length; i++) {
80752                   if (/^ *-+: *$/.test(item.align[i])) {
80753                     item.align[i] = 'right';
80754                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80755                     item.align[i] = 'center';
80756                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80757                     item.align[i] = 'left';
80758                   } else {
80759                     item.align[i] = null;
80760                   }
80761                 }
80762
80763                 for (i = 0; i < item.cells.length; i++) {
80764                   item.cells[i] = splitCells(item.cells[i], item.header.length);
80765                 }
80766
80767                 this.tokens.push(item);
80768
80769                 continue;
80770               }
80771             }
80772
80773             // hr
80774             if (cap = this.rules.hr.exec(src)) {
80775               src = src.substring(cap[0].length);
80776               this.tokens.push({
80777                 type: 'hr'
80778               });
80779               continue;
80780             }
80781
80782             // blockquote
80783             if (cap = this.rules.blockquote.exec(src)) {
80784               src = src.substring(cap[0].length);
80785
80786               this.tokens.push({
80787                 type: 'blockquote_start'
80788               });
80789
80790               cap = cap[0].replace(/^ *> ?/gm, '');
80791
80792               // Pass `top` to keep the current
80793               // "toplevel" state. This is exactly
80794               // how markdown.pl works.
80795               this.token(cap, top);
80796
80797               this.tokens.push({
80798                 type: 'blockquote_end'
80799               });
80800
80801               continue;
80802             }
80803
80804             // list
80805             if (cap = this.rules.list.exec(src)) {
80806               src = src.substring(cap[0].length);
80807               bull = cap[2];
80808               isordered = bull.length > 1;
80809
80810               listStart = {
80811                 type: 'list_start',
80812                 ordered: isordered,
80813                 start: isordered ? +bull : '',
80814                 loose: false
80815               };
80816
80817               this.tokens.push(listStart);
80818
80819               // Get each top-level item.
80820               cap = cap[0].match(this.rules.item);
80821
80822               listItems = [];
80823               next = false;
80824               l = cap.length;
80825               i = 0;
80826
80827               for (; i < l; i++) {
80828                 item = cap[i];
80829
80830                 // Remove the list item's bullet
80831                 // so it is seen as the next token.
80832                 space = item.length;
80833                 item = item.replace(/^ *([*+-]|\d+\.) */, '');
80834
80835                 // Outdent whatever the
80836                 // list item contains. Hacky.
80837                 if (~item.indexOf('\n ')) {
80838                   space -= item.length;
80839                   item = !this.options.pedantic
80840                     ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
80841                     : item.replace(/^ {1,4}/gm, '');
80842                 }
80843
80844                 // Determine whether the next list item belongs here.
80845                 // Backpedal if it does not belong in this list.
80846                 if (i !== l - 1) {
80847                   b = block.bullet.exec(cap[i + 1])[0];
80848                   if (bull.length > 1 ? b.length === 1
80849                     : (b.length > 1 || (this.options.smartLists && b !== bull))) {
80850                     src = cap.slice(i + 1).join('\n') + src;
80851                     i = l - 1;
80852                   }
80853                 }
80854
80855                 // Determine whether item is loose or not.
80856                 // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
80857                 // for discount behavior.
80858                 loose = next || /\n\n(?!\s*$)/.test(item);
80859                 if (i !== l - 1) {
80860                   next = item.charAt(item.length - 1) === '\n';
80861                   if (!loose) loose = next;
80862                 }
80863
80864                 if (loose) {
80865                   listStart.loose = true;
80866                 }
80867
80868                 // Check for task list items
80869                 istask = /^\[[ xX]\] /.test(item);
80870                 ischecked = undefined;
80871                 if (istask) {
80872                   ischecked = item[1] !== ' ';
80873                   item = item.replace(/^\[[ xX]\] +/, '');
80874                 }
80875
80876                 t = {
80877                   type: 'list_item_start',
80878                   task: istask,
80879                   checked: ischecked,
80880                   loose: loose
80881                 };
80882
80883                 listItems.push(t);
80884                 this.tokens.push(t);
80885
80886                 // Recurse.
80887                 this.token(item, false);
80888
80889                 this.tokens.push({
80890                   type: 'list_item_end'
80891                 });
80892               }
80893
80894               if (listStart.loose) {
80895                 l = listItems.length;
80896                 i = 0;
80897                 for (; i < l; i++) {
80898                   listItems[i].loose = true;
80899                 }
80900               }
80901
80902               this.tokens.push({
80903                 type: 'list_end'
80904               });
80905
80906               continue;
80907             }
80908
80909             // html
80910             if (cap = this.rules.html.exec(src)) {
80911               src = src.substring(cap[0].length);
80912               this.tokens.push({
80913                 type: this.options.sanitize
80914                   ? 'paragraph'
80915                   : 'html',
80916                 pre: !this.options.sanitizer
80917                   && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
80918                 text: cap[0]
80919               });
80920               continue;
80921             }
80922
80923             // def
80924             if (top && (cap = this.rules.def.exec(src))) {
80925               src = src.substring(cap[0].length);
80926               if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
80927               tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
80928               if (!this.tokens.links[tag]) {
80929                 this.tokens.links[tag] = {
80930                   href: cap[2],
80931                   title: cap[3]
80932                 };
80933               }
80934               continue;
80935             }
80936
80937             // table (gfm)
80938             if (cap = this.rules.table.exec(src)) {
80939               item = {
80940                 type: 'table',
80941                 header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
80942                 align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
80943                 cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
80944               };
80945
80946               if (item.header.length === item.align.length) {
80947                 src = src.substring(cap[0].length);
80948
80949                 for (i = 0; i < item.align.length; i++) {
80950                   if (/^ *-+: *$/.test(item.align[i])) {
80951                     item.align[i] = 'right';
80952                   } else if (/^ *:-+: *$/.test(item.align[i])) {
80953                     item.align[i] = 'center';
80954                   } else if (/^ *:-+ *$/.test(item.align[i])) {
80955                     item.align[i] = 'left';
80956                   } else {
80957                     item.align[i] = null;
80958                   }
80959                 }
80960
80961                 for (i = 0; i < item.cells.length; i++) {
80962                   item.cells[i] = splitCells(
80963                     item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
80964                     item.header.length);
80965                 }
80966
80967                 this.tokens.push(item);
80968
80969                 continue;
80970               }
80971             }
80972
80973             // lheading
80974             if (cap = this.rules.lheading.exec(src)) {
80975               src = src.substring(cap[0].length);
80976               this.tokens.push({
80977                 type: 'heading',
80978                 depth: cap[2] === '=' ? 1 : 2,
80979                 text: cap[1]
80980               });
80981               continue;
80982             }
80983
80984             // top-level paragraph
80985             if (top && (cap = this.rules.paragraph.exec(src))) {
80986               src = src.substring(cap[0].length);
80987               this.tokens.push({
80988                 type: 'paragraph',
80989                 text: cap[1].charAt(cap[1].length - 1) === '\n'
80990                   ? cap[1].slice(0, -1)
80991                   : cap[1]
80992               });
80993               continue;
80994             }
80995
80996             // text
80997             if (cap = this.rules.text.exec(src)) {
80998               // Top-level should never reach here.
80999               src = src.substring(cap[0].length);
81000               this.tokens.push({
81001                 type: 'text',
81002                 text: cap[0]
81003               });
81004               continue;
81005             }
81006
81007             if (src) {
81008               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81009             }
81010           }
81011
81012           return this.tokens;
81013         };
81014
81015         /**
81016          * Inline-Level Grammar
81017          */
81018
81019         var inline = {
81020           escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
81021           autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
81022           url: noop,
81023           tag: '^comment'
81024             + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
81025             + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
81026             + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
81027             + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
81028             + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
81029           link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
81030           reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
81031           nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
81032           strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
81033           em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
81034           code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
81035           br: /^( {2,}|\\)\n(?!\s*$)/,
81036           del: noop,
81037           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
81038         };
81039
81040         // list of punctuation marks from common mark spec
81041         // without ` and ] to workaround Rule 17 (inline code blocks/links)
81042         inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
81043         inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
81044
81045         inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
81046
81047         inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
81048         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])?)+(?![-_])/;
81049         inline.autolink = edit(inline.autolink)
81050           .replace('scheme', inline._scheme)
81051           .replace('email', inline._email)
81052           .getRegex();
81053
81054         inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
81055
81056         inline.tag = edit(inline.tag)
81057           .replace('comment', block._comment)
81058           .replace('attribute', inline._attribute)
81059           .getRegex();
81060
81061         inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|`(?!`)|[^\[\]\\`])*?/;
81062         inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*)/;
81063         inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
81064
81065         inline.link = edit(inline.link)
81066           .replace('label', inline._label)
81067           .replace('href', inline._href)
81068           .replace('title', inline._title)
81069           .getRegex();
81070
81071         inline.reflink = edit(inline.reflink)
81072           .replace('label', inline._label)
81073           .getRegex();
81074
81075         /**
81076          * Normal Inline Grammar
81077          */
81078
81079         inline.normal = merge({}, inline);
81080
81081         /**
81082          * Pedantic Inline Grammar
81083          */
81084
81085         inline.pedantic = merge({}, inline.normal, {
81086           strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
81087           em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
81088           link: edit(/^!?\[(label)\]\((.*?)\)/)
81089             .replace('label', inline._label)
81090             .getRegex(),
81091           reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
81092             .replace('label', inline._label)
81093             .getRegex()
81094         });
81095
81096         /**
81097          * GFM Inline Grammar
81098          */
81099
81100         inline.gfm = merge({}, inline.normal, {
81101           escape: edit(inline.escape).replace('])', '~|])').getRegex(),
81102           _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
81103           url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
81104           _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
81105           del: /^~+(?=\S)([\s\S]*?\S)~+/,
81106           text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
81107         });
81108
81109         inline.gfm.url = edit(inline.gfm.url, 'i')
81110           .replace('email', inline.gfm._extended_email)
81111           .getRegex();
81112         /**
81113          * GFM + Line Breaks Inline Grammar
81114          */
81115
81116         inline.breaks = merge({}, inline.gfm, {
81117           br: edit(inline.br).replace('{2,}', '*').getRegex(),
81118           text: edit(inline.gfm.text).replace(/\{2,\}/g, '*').getRegex()
81119         });
81120
81121         /**
81122          * Inline Lexer & Compiler
81123          */
81124
81125         function InlineLexer(links, options) {
81126           this.options = options || marked.defaults;
81127           this.links = links;
81128           this.rules = inline.normal;
81129           this.renderer = this.options.renderer || new Renderer();
81130           this.renderer.options = this.options;
81131
81132           if (!this.links) {
81133             throw new Error('Tokens array requires a `links` property.');
81134           }
81135
81136           if (this.options.pedantic) {
81137             this.rules = inline.pedantic;
81138           } else if (this.options.gfm) {
81139             if (this.options.breaks) {
81140               this.rules = inline.breaks;
81141             } else {
81142               this.rules = inline.gfm;
81143             }
81144           }
81145         }
81146
81147         /**
81148          * Expose Inline Rules
81149          */
81150
81151         InlineLexer.rules = inline;
81152
81153         /**
81154          * Static Lexing/Compiling Method
81155          */
81156
81157         InlineLexer.output = function(src, links, options) {
81158           var inline = new InlineLexer(links, options);
81159           return inline.output(src);
81160         };
81161
81162         /**
81163          * Lexing/Compiling
81164          */
81165
81166         InlineLexer.prototype.output = function(src) {
81167           var out = '',
81168               link,
81169               text,
81170               href,
81171               title,
81172               cap,
81173               prevCapZero;
81174
81175           while (src) {
81176             // escape
81177             if (cap = this.rules.escape.exec(src)) {
81178               src = src.substring(cap[0].length);
81179               out += escape(cap[1]);
81180               continue;
81181             }
81182
81183             // tag
81184             if (cap = this.rules.tag.exec(src)) {
81185               if (!this.inLink && /^<a /i.test(cap[0])) {
81186                 this.inLink = true;
81187               } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
81188                 this.inLink = false;
81189               }
81190               if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81191                 this.inRawBlock = true;
81192               } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
81193                 this.inRawBlock = false;
81194               }
81195
81196               src = src.substring(cap[0].length);
81197               out += this.options.sanitize
81198                 ? this.options.sanitizer
81199                   ? this.options.sanitizer(cap[0])
81200                   : escape(cap[0])
81201                 : cap[0];
81202               continue;
81203             }
81204
81205             // link
81206             if (cap = this.rules.link.exec(src)) {
81207               var lastParenIndex = findClosingBracket(cap[2], '()');
81208               if (lastParenIndex > -1) {
81209                 var linkLen = cap[0].length - (cap[2].length - lastParenIndex) - (cap[3] || '').length;
81210                 cap[2] = cap[2].substring(0, lastParenIndex);
81211                 cap[0] = cap[0].substring(0, linkLen).trim();
81212                 cap[3] = '';
81213               }
81214               src = src.substring(cap[0].length);
81215               this.inLink = true;
81216               href = cap[2];
81217               if (this.options.pedantic) {
81218                 link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
81219
81220                 if (link) {
81221                   href = link[1];
81222                   title = link[3];
81223                 } else {
81224                   title = '';
81225                 }
81226               } else {
81227                 title = cap[3] ? cap[3].slice(1, -1) : '';
81228               }
81229               href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
81230               out += this.outputLink(cap, {
81231                 href: InlineLexer.escapes(href),
81232                 title: InlineLexer.escapes(title)
81233               });
81234               this.inLink = false;
81235               continue;
81236             }
81237
81238             // reflink, nolink
81239             if ((cap = this.rules.reflink.exec(src))
81240                 || (cap = this.rules.nolink.exec(src))) {
81241               src = src.substring(cap[0].length);
81242               link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
81243               link = this.links[link.toLowerCase()];
81244               if (!link || !link.href) {
81245                 out += cap[0].charAt(0);
81246                 src = cap[0].substring(1) + src;
81247                 continue;
81248               }
81249               this.inLink = true;
81250               out += this.outputLink(cap, link);
81251               this.inLink = false;
81252               continue;
81253             }
81254
81255             // strong
81256             if (cap = this.rules.strong.exec(src)) {
81257               src = src.substring(cap[0].length);
81258               out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
81259               continue;
81260             }
81261
81262             // em
81263             if (cap = this.rules.em.exec(src)) {
81264               src = src.substring(cap[0].length);
81265               out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
81266               continue;
81267             }
81268
81269             // code
81270             if (cap = this.rules.code.exec(src)) {
81271               src = src.substring(cap[0].length);
81272               out += this.renderer.codespan(escape(cap[2].trim(), true));
81273               continue;
81274             }
81275
81276             // br
81277             if (cap = this.rules.br.exec(src)) {
81278               src = src.substring(cap[0].length);
81279               out += this.renderer.br();
81280               continue;
81281             }
81282
81283             // del (gfm)
81284             if (cap = this.rules.del.exec(src)) {
81285               src = src.substring(cap[0].length);
81286               out += this.renderer.del(this.output(cap[1]));
81287               continue;
81288             }
81289
81290             // autolink
81291             if (cap = this.rules.autolink.exec(src)) {
81292               src = src.substring(cap[0].length);
81293               if (cap[2] === '@') {
81294                 text = escape(this.mangle(cap[1]));
81295                 href = 'mailto:' + text;
81296               } else {
81297                 text = escape(cap[1]);
81298                 href = text;
81299               }
81300               out += this.renderer.link(href, null, text);
81301               continue;
81302             }
81303
81304             // url (gfm)
81305             if (!this.inLink && (cap = this.rules.url.exec(src))) {
81306               if (cap[2] === '@') {
81307                 text = escape(cap[0]);
81308                 href = 'mailto:' + text;
81309               } else {
81310                 // do extended autolink path validation
81311                 do {
81312                   prevCapZero = cap[0];
81313                   cap[0] = this.rules._backpedal.exec(cap[0])[0];
81314                 } while (prevCapZero !== cap[0]);
81315                 text = escape(cap[0]);
81316                 if (cap[1] === 'www.') {
81317                   href = 'http://' + text;
81318                 } else {
81319                   href = text;
81320                 }
81321               }
81322               src = src.substring(cap[0].length);
81323               out += this.renderer.link(href, null, text);
81324               continue;
81325             }
81326
81327             // text
81328             if (cap = this.rules.text.exec(src)) {
81329               src = src.substring(cap[0].length);
81330               if (this.inRawBlock) {
81331                 out += this.renderer.text(cap[0]);
81332               } else {
81333                 out += this.renderer.text(escape(this.smartypants(cap[0])));
81334               }
81335               continue;
81336             }
81337
81338             if (src) {
81339               throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
81340             }
81341           }
81342
81343           return out;
81344         };
81345
81346         InlineLexer.escapes = function(text) {
81347           return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
81348         };
81349
81350         /**
81351          * Compile Link
81352          */
81353
81354         InlineLexer.prototype.outputLink = function(cap, link) {
81355           var href = link.href,
81356               title = link.title ? escape(link.title) : null;
81357
81358           return cap[0].charAt(0) !== '!'
81359             ? this.renderer.link(href, title, this.output(cap[1]))
81360             : this.renderer.image(href, title, escape(cap[1]));
81361         };
81362
81363         /**
81364          * Smartypants Transformations
81365          */
81366
81367         InlineLexer.prototype.smartypants = function(text) {
81368           if (!this.options.smartypants) return text;
81369           return text
81370             // em-dashes
81371             .replace(/---/g, '\u2014')
81372             // en-dashes
81373             .replace(/--/g, '\u2013')
81374             // opening singles
81375             .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
81376             // closing singles & apostrophes
81377             .replace(/'/g, '\u2019')
81378             // opening doubles
81379             .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
81380             // closing doubles
81381             .replace(/"/g, '\u201d')
81382             // ellipses
81383             .replace(/\.{3}/g, '\u2026');
81384         };
81385
81386         /**
81387          * Mangle Links
81388          */
81389
81390         InlineLexer.prototype.mangle = function(text) {
81391           if (!this.options.mangle) return text;
81392           var out = '',
81393               l = text.length,
81394               i = 0,
81395               ch;
81396
81397           for (; i < l; i++) {
81398             ch = text.charCodeAt(i);
81399             if (Math.random() > 0.5) {
81400               ch = 'x' + ch.toString(16);
81401             }
81402             out += '&#' + ch + ';';
81403           }
81404
81405           return out;
81406         };
81407
81408         /**
81409          * Renderer
81410          */
81411
81412         function Renderer(options) {
81413           this.options = options || marked.defaults;
81414         }
81415
81416         Renderer.prototype.code = function(code, infostring, escaped) {
81417           var lang = (infostring || '').match(/\S*/)[0];
81418           if (this.options.highlight) {
81419             var out = this.options.highlight(code, lang);
81420             if (out != null && out !== code) {
81421               escaped = true;
81422               code = out;
81423             }
81424           }
81425
81426           if (!lang) {
81427             return '<pre><code>'
81428               + (escaped ? code : escape(code, true))
81429               + '</code></pre>';
81430           }
81431
81432           return '<pre><code class="'
81433             + this.options.langPrefix
81434             + escape(lang, true)
81435             + '">'
81436             + (escaped ? code : escape(code, true))
81437             + '</code></pre>\n';
81438         };
81439
81440         Renderer.prototype.blockquote = function(quote) {
81441           return '<blockquote>\n' + quote + '</blockquote>\n';
81442         };
81443
81444         Renderer.prototype.html = function(html) {
81445           return html;
81446         };
81447
81448         Renderer.prototype.heading = function(text, level, raw, slugger) {
81449           if (this.options.headerIds) {
81450             return '<h'
81451               + level
81452               + ' id="'
81453               + this.options.headerPrefix
81454               + slugger.slug(raw)
81455               + '">'
81456               + text
81457               + '</h'
81458               + level
81459               + '>\n';
81460           }
81461           // ignore IDs
81462           return '<h' + level + '>' + text + '</h' + level + '>\n';
81463         };
81464
81465         Renderer.prototype.hr = function() {
81466           return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
81467         };
81468
81469         Renderer.prototype.list = function(body, ordered, start) {
81470           var type = ordered ? 'ol' : 'ul',
81471               startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
81472           return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
81473         };
81474
81475         Renderer.prototype.listitem = function(text) {
81476           return '<li>' + text + '</li>\n';
81477         };
81478
81479         Renderer.prototype.checkbox = function(checked) {
81480           return '<input '
81481             + (checked ? 'checked="" ' : '')
81482             + 'disabled="" type="checkbox"'
81483             + (this.options.xhtml ? ' /' : '')
81484             + '> ';
81485         };
81486
81487         Renderer.prototype.paragraph = function(text) {
81488           return '<p>' + text + '</p>\n';
81489         };
81490
81491         Renderer.prototype.table = function(header, body) {
81492           if (body) body = '<tbody>' + body + '</tbody>';
81493
81494           return '<table>\n'
81495             + '<thead>\n'
81496             + header
81497             + '</thead>\n'
81498             + body
81499             + '</table>\n';
81500         };
81501
81502         Renderer.prototype.tablerow = function(content) {
81503           return '<tr>\n' + content + '</tr>\n';
81504         };
81505
81506         Renderer.prototype.tablecell = function(content, flags) {
81507           var type = flags.header ? 'th' : 'td';
81508           var tag = flags.align
81509             ? '<' + type + ' align="' + flags.align + '">'
81510             : '<' + type + '>';
81511           return tag + content + '</' + type + '>\n';
81512         };
81513
81514         // span level renderer
81515         Renderer.prototype.strong = function(text) {
81516           return '<strong>' + text + '</strong>';
81517         };
81518
81519         Renderer.prototype.em = function(text) {
81520           return '<em>' + text + '</em>';
81521         };
81522
81523         Renderer.prototype.codespan = function(text) {
81524           return '<code>' + text + '</code>';
81525         };
81526
81527         Renderer.prototype.br = function() {
81528           return this.options.xhtml ? '<br/>' : '<br>';
81529         };
81530
81531         Renderer.prototype.del = function(text) {
81532           return '<del>' + text + '</del>';
81533         };
81534
81535         Renderer.prototype.link = function(href, title, text) {
81536           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81537           if (href === null) {
81538             return text;
81539           }
81540           var out = '<a href="' + escape(href) + '"';
81541           if (title) {
81542             out += ' title="' + title + '"';
81543           }
81544           out += '>' + text + '</a>';
81545           return out;
81546         };
81547
81548         Renderer.prototype.image = function(href, title, text) {
81549           href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
81550           if (href === null) {
81551             return text;
81552           }
81553
81554           var out = '<img src="' + href + '" alt="' + text + '"';
81555           if (title) {
81556             out += ' title="' + title + '"';
81557           }
81558           out += this.options.xhtml ? '/>' : '>';
81559           return out;
81560         };
81561
81562         Renderer.prototype.text = function(text) {
81563           return text;
81564         };
81565
81566         /**
81567          * TextRenderer
81568          * returns only the textual part of the token
81569          */
81570
81571         function TextRenderer() {}
81572
81573         // no need for block level renderers
81574
81575         TextRenderer.prototype.strong =
81576         TextRenderer.prototype.em =
81577         TextRenderer.prototype.codespan =
81578         TextRenderer.prototype.del =
81579         TextRenderer.prototype.text = function (text) {
81580           return text;
81581         };
81582
81583         TextRenderer.prototype.link =
81584         TextRenderer.prototype.image = function(href, title, text) {
81585           return '' + text;
81586         };
81587
81588         TextRenderer.prototype.br = function() {
81589           return '';
81590         };
81591
81592         /**
81593          * Parsing & Compiling
81594          */
81595
81596         function Parser(options) {
81597           this.tokens = [];
81598           this.token = null;
81599           this.options = options || marked.defaults;
81600           this.options.renderer = this.options.renderer || new Renderer();
81601           this.renderer = this.options.renderer;
81602           this.renderer.options = this.options;
81603           this.slugger = new Slugger();
81604         }
81605
81606         /**
81607          * Static Parse Method
81608          */
81609
81610         Parser.parse = function(src, options) {
81611           var parser = new Parser(options);
81612           return parser.parse(src);
81613         };
81614
81615         /**
81616          * Parse Loop
81617          */
81618
81619         Parser.prototype.parse = function(src) {
81620           this.inline = new InlineLexer(src.links, this.options);
81621           // use an InlineLexer with a TextRenderer to extract pure text
81622           this.inlineText = new InlineLexer(
81623             src.links,
81624             merge({}, this.options, {renderer: new TextRenderer()})
81625           );
81626           this.tokens = src.reverse();
81627
81628           var out = '';
81629           while (this.next()) {
81630             out += this.tok();
81631           }
81632
81633           return out;
81634         };
81635
81636         /**
81637          * Next Token
81638          */
81639
81640         Parser.prototype.next = function() {
81641           return this.token = this.tokens.pop();
81642         };
81643
81644         /**
81645          * Preview Next Token
81646          */
81647
81648         Parser.prototype.peek = function() {
81649           return this.tokens[this.tokens.length - 1] || 0;
81650         };
81651
81652         /**
81653          * Parse Text Tokens
81654          */
81655
81656         Parser.prototype.parseText = function() {
81657           var body = this.token.text;
81658
81659           while (this.peek().type === 'text') {
81660             body += '\n' + this.next().text;
81661           }
81662
81663           return this.inline.output(body);
81664         };
81665
81666         /**
81667          * Parse Current Token
81668          */
81669
81670         Parser.prototype.tok = function() {
81671           switch (this.token.type) {
81672             case 'space': {
81673               return '';
81674             }
81675             case 'hr': {
81676               return this.renderer.hr();
81677             }
81678             case 'heading': {
81679               return this.renderer.heading(
81680                 this.inline.output(this.token.text),
81681                 this.token.depth,
81682                 unescape(this.inlineText.output(this.token.text)),
81683                 this.slugger);
81684             }
81685             case 'code': {
81686               return this.renderer.code(this.token.text,
81687                 this.token.lang,
81688                 this.token.escaped);
81689             }
81690             case 'table': {
81691               var header = '',
81692                   body = '',
81693                   i,
81694                   row,
81695                   cell,
81696                   j;
81697
81698               // header
81699               cell = '';
81700               for (i = 0; i < this.token.header.length; i++) {
81701                 cell += this.renderer.tablecell(
81702                   this.inline.output(this.token.header[i]),
81703                   { header: true, align: this.token.align[i] }
81704                 );
81705               }
81706               header += this.renderer.tablerow(cell);
81707
81708               for (i = 0; i < this.token.cells.length; i++) {
81709                 row = this.token.cells[i];
81710
81711                 cell = '';
81712                 for (j = 0; j < row.length; j++) {
81713                   cell += this.renderer.tablecell(
81714                     this.inline.output(row[j]),
81715                     { header: false, align: this.token.align[j] }
81716                   );
81717                 }
81718
81719                 body += this.renderer.tablerow(cell);
81720               }
81721               return this.renderer.table(header, body);
81722             }
81723             case 'blockquote_start': {
81724               body = '';
81725
81726               while (this.next().type !== 'blockquote_end') {
81727                 body += this.tok();
81728               }
81729
81730               return this.renderer.blockquote(body);
81731             }
81732             case 'list_start': {
81733               body = '';
81734               var ordered = this.token.ordered,
81735                   start = this.token.start;
81736
81737               while (this.next().type !== 'list_end') {
81738                 body += this.tok();
81739               }
81740
81741               return this.renderer.list(body, ordered, start);
81742             }
81743             case 'list_item_start': {
81744               body = '';
81745               var loose = this.token.loose;
81746               var checked = this.token.checked;
81747               var task = this.token.task;
81748
81749               if (this.token.task) {
81750                 body += this.renderer.checkbox(checked);
81751               }
81752
81753               while (this.next().type !== 'list_item_end') {
81754                 body += !loose && this.token.type === 'text'
81755                   ? this.parseText()
81756                   : this.tok();
81757               }
81758               return this.renderer.listitem(body, task, checked);
81759             }
81760             case 'html': {
81761               // TODO parse inline content if parameter markdown=1
81762               return this.renderer.html(this.token.text);
81763             }
81764             case 'paragraph': {
81765               return this.renderer.paragraph(this.inline.output(this.token.text));
81766             }
81767             case 'text': {
81768               return this.renderer.paragraph(this.parseText());
81769             }
81770             default: {
81771               var errMsg = 'Token with "' + this.token.type + '" type was not found.';
81772               if (this.options.silent) {
81773                 console.log(errMsg);
81774               } else {
81775                 throw new Error(errMsg);
81776               }
81777             }
81778           }
81779         };
81780
81781         /**
81782          * Slugger generates header id
81783          */
81784
81785         function Slugger () {
81786           this.seen = {};
81787         }
81788
81789         /**
81790          * Convert string to unique id
81791          */
81792
81793         Slugger.prototype.slug = function (value) {
81794           var slug = value
81795             .toLowerCase()
81796             .trim()
81797             .replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
81798             .replace(/\s/g, '-');
81799
81800           if (this.seen.hasOwnProperty(slug)) {
81801             var originalSlug = slug;
81802             do {
81803               this.seen[originalSlug]++;
81804               slug = originalSlug + '-' + this.seen[originalSlug];
81805             } while (this.seen.hasOwnProperty(slug));
81806           }
81807           this.seen[slug] = 0;
81808
81809           return slug;
81810         };
81811
81812         /**
81813          * Helpers
81814          */
81815
81816         function escape(html, encode) {
81817           if (encode) {
81818             if (escape.escapeTest.test(html)) {
81819               return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
81820             }
81821           } else {
81822             if (escape.escapeTestNoEncode.test(html)) {
81823               return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
81824             }
81825           }
81826
81827           return html;
81828         }
81829
81830         escape.escapeTest = /[&<>"']/;
81831         escape.escapeReplace = /[&<>"']/g;
81832         escape.replacements = {
81833           '&': '&amp;',
81834           '<': '&lt;',
81835           '>': '&gt;',
81836           '"': '&quot;',
81837           "'": '&#39;'
81838         };
81839
81840         escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
81841         escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
81842
81843         function unescape(html) {
81844           // explicitly match decimal, hex, and named HTML entities
81845           return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
81846             n = n.toLowerCase();
81847             if (n === 'colon') return ':';
81848             if (n.charAt(0) === '#') {
81849               return n.charAt(1) === 'x'
81850                 ? String.fromCharCode(parseInt(n.substring(2), 16))
81851                 : String.fromCharCode(+n.substring(1));
81852             }
81853             return '';
81854           });
81855         }
81856
81857         function edit(regex, opt) {
81858           regex = regex.source || regex;
81859           opt = opt || '';
81860           return {
81861             replace: function(name, val) {
81862               val = val.source || val;
81863               val = val.replace(/(^|[^\[])\^/g, '$1');
81864               regex = regex.replace(name, val);
81865               return this;
81866             },
81867             getRegex: function() {
81868               return new RegExp(regex, opt);
81869             }
81870           };
81871         }
81872
81873         function cleanUrl(sanitize, base, href) {
81874           if (sanitize) {
81875             try {
81876               var prot = decodeURIComponent(unescape(href))
81877                 .replace(/[^\w:]/g, '')
81878                 .toLowerCase();
81879             } catch (e) {
81880               return null;
81881             }
81882             if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
81883               return null;
81884             }
81885           }
81886           if (base && !originIndependentUrl.test(href)) {
81887             href = resolveUrl(base, href);
81888           }
81889           try {
81890             href = encodeURI(href).replace(/%25/g, '%');
81891           } catch (e) {
81892             return null;
81893           }
81894           return href;
81895         }
81896
81897         function resolveUrl(base, href) {
81898           if (!baseUrls[' ' + base]) {
81899             // we can ignore everything in base after the last slash of its path component,
81900             // but we might need to add _that_
81901             // https://tools.ietf.org/html/rfc3986#section-3
81902             if (/^[^:]+:\/*[^/]*$/.test(base)) {
81903               baseUrls[' ' + base] = base + '/';
81904             } else {
81905               baseUrls[' ' + base] = rtrim(base, '/', true);
81906             }
81907           }
81908           base = baseUrls[' ' + base];
81909
81910           if (href.slice(0, 2) === '//') {
81911             return base.replace(/:[\s\S]*/, ':') + href;
81912           } else if (href.charAt(0) === '/') {
81913             return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
81914           } else {
81915             return base + href;
81916           }
81917         }
81918         var baseUrls = {};
81919         var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
81920
81921         function noop() {}
81922         noop.exec = noop;
81923
81924         function merge(obj) {
81925           var i = 1,
81926               target,
81927               key;
81928
81929           for (; i < arguments.length; i++) {
81930             target = arguments[i];
81931             for (key in target) {
81932               if (Object.prototype.hasOwnProperty.call(target, key)) {
81933                 obj[key] = target[key];
81934               }
81935             }
81936           }
81937
81938           return obj;
81939         }
81940
81941         function splitCells(tableRow, count) {
81942           // ensure that every cell-delimiting pipe has a space
81943           // before it to distinguish it from an escaped pipe
81944           var row = tableRow.replace(/\|/g, function (match, offset, str) {
81945                 var escaped = false,
81946                     curr = offset;
81947                 while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
81948                 if (escaped) {
81949                   // odd number of slashes means | is escaped
81950                   // so we leave it alone
81951                   return '|';
81952                 } else {
81953                   // add space before unescaped |
81954                   return ' |';
81955                 }
81956               }),
81957               cells = row.split(/ \|/),
81958               i = 0;
81959
81960           if (cells.length > count) {
81961             cells.splice(count);
81962           } else {
81963             while (cells.length < count) cells.push('');
81964           }
81965
81966           for (; i < cells.length; i++) {
81967             // leading or trailing whitespace is ignored per the gfm spec
81968             cells[i] = cells[i].trim().replace(/\\\|/g, '|');
81969           }
81970           return cells;
81971         }
81972
81973         // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
81974         // /c*$/ is vulnerable to REDOS.
81975         // invert: Remove suffix of non-c chars instead. Default falsey.
81976         function rtrim(str, c, invert) {
81977           if (str.length === 0) {
81978             return '';
81979           }
81980
81981           // Length of suffix matching the invert condition.
81982           var suffLen = 0;
81983
81984           // Step left until we fail to match the invert condition.
81985           while (suffLen < str.length) {
81986             var currChar = str.charAt(str.length - suffLen - 1);
81987             if (currChar === c && !invert) {
81988               suffLen++;
81989             } else if (currChar !== c && invert) {
81990               suffLen++;
81991             } else {
81992               break;
81993             }
81994           }
81995
81996           return str.substr(0, str.length - suffLen);
81997         }
81998
81999         function findClosingBracket(str, b) {
82000           if (str.indexOf(b[1]) === -1) {
82001             return -1;
82002           }
82003           var level = 0;
82004           for (var i = 0; i < str.length; i++) {
82005             if (str[i] === '\\') {
82006               i++;
82007             } else if (str[i] === b[0]) {
82008               level++;
82009             } else if (str[i] === b[1]) {
82010               level--;
82011               if (level < 0) {
82012                 return i;
82013               }
82014             }
82015           }
82016           return -1;
82017         }
82018
82019         /**
82020          * Marked
82021          */
82022
82023         function marked(src, opt, callback) {
82024           // throw error in case of non string input
82025           if (typeof src === 'undefined' || src === null) {
82026             throw new Error('marked(): input parameter is undefined or null');
82027           }
82028           if (typeof src !== 'string') {
82029             throw new Error('marked(): input parameter is of type '
82030               + Object.prototype.toString.call(src) + ', string expected');
82031           }
82032
82033           if (callback || typeof opt === 'function') {
82034             if (!callback) {
82035               callback = opt;
82036               opt = null;
82037             }
82038
82039             opt = merge({}, marked.defaults, opt || {});
82040
82041             var highlight = opt.highlight,
82042                 tokens,
82043                 pending,
82044                 i = 0;
82045
82046             try {
82047               tokens = Lexer.lex(src, opt);
82048             } catch (e) {
82049               return callback(e);
82050             }
82051
82052             pending = tokens.length;
82053
82054             var done = function(err) {
82055               if (err) {
82056                 opt.highlight = highlight;
82057                 return callback(err);
82058               }
82059
82060               var out;
82061
82062               try {
82063                 out = Parser.parse(tokens, opt);
82064               } catch (e) {
82065                 err = e;
82066               }
82067
82068               opt.highlight = highlight;
82069
82070               return err
82071                 ? callback(err)
82072                 : callback(null, out);
82073             };
82074
82075             if (!highlight || highlight.length < 3) {
82076               return done();
82077             }
82078
82079             delete opt.highlight;
82080
82081             if (!pending) return done();
82082
82083             for (; i < tokens.length; i++) {
82084               (function(token) {
82085                 if (token.type !== 'code') {
82086                   return --pending || done();
82087                 }
82088                 return highlight(token.text, token.lang, function(err, code) {
82089                   if (err) return done(err);
82090                   if (code == null || code === token.text) {
82091                     return --pending || done();
82092                   }
82093                   token.text = code;
82094                   token.escaped = true;
82095                   --pending || done();
82096                 });
82097               })(tokens[i]);
82098             }
82099
82100             return;
82101           }
82102           try {
82103             if (opt) opt = merge({}, marked.defaults, opt);
82104             return Parser.parse(Lexer.lex(src, opt), opt);
82105           } catch (e) {
82106             e.message += '\nPlease report this to https://github.com/markedjs/marked.';
82107             if ((opt || marked.defaults).silent) {
82108               return '<p>An error occurred:</p><pre>'
82109                 + escape(e.message + '', true)
82110                 + '</pre>';
82111             }
82112             throw e;
82113           }
82114         }
82115
82116         /**
82117          * Options
82118          */
82119
82120         marked.options =
82121         marked.setOptions = function(opt) {
82122           merge(marked.defaults, opt);
82123           return marked;
82124         };
82125
82126         marked.getDefaults = function () {
82127           return {
82128             baseUrl: null,
82129             breaks: false,
82130             gfm: true,
82131             headerIds: true,
82132             headerPrefix: '',
82133             highlight: null,
82134             langPrefix: 'language-',
82135             mangle: true,
82136             pedantic: false,
82137             renderer: new Renderer(),
82138             sanitize: false,
82139             sanitizer: null,
82140             silent: false,
82141             smartLists: false,
82142             smartypants: false,
82143             tables: true,
82144             xhtml: false
82145           };
82146         };
82147
82148         marked.defaults = marked.getDefaults();
82149
82150         /**
82151          * Expose
82152          */
82153
82154         marked.Parser = Parser;
82155         marked.parser = Parser.parse;
82156
82157         marked.Renderer = Renderer;
82158         marked.TextRenderer = TextRenderer;
82159
82160         marked.Lexer = Lexer;
82161         marked.lexer = Lexer.lex;
82162
82163         marked.InlineLexer = InlineLexer;
82164         marked.inlineLexer = InlineLexer.output;
82165
82166         marked.Slugger = Slugger;
82167
82168         marked.parse = marked;
82169
82170         {
82171           module.exports = marked;
82172         }
82173         })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
82174         });
82175
82176         function pointBox(loc, context) {
82177             var rect = context.surfaceRect();
82178             var point = context.curtainProjection(loc);
82179             return {
82180                 left: point[0] + rect.left - 40,
82181                 top: point[1] + rect.top - 60,
82182                 width: 80,
82183                 height: 90
82184             };
82185         }
82186
82187
82188         function pad$2(locOrBox, padding, context) {
82189             var box;
82190             if (locOrBox instanceof Array) {
82191                 var rect = context.surfaceRect();
82192                 var point = context.curtainProjection(locOrBox);
82193                 box = {
82194                     left: point[0] + rect.left,
82195                     top: point[1] + rect.top
82196                 };
82197             } else {
82198                 box = locOrBox;
82199             }
82200
82201             return {
82202                 left: box.left - padding,
82203                 top: box.top - padding,
82204                 width: (box.width || 0) + 2 * padding,
82205                 height: (box.width || 0) + 2 * padding
82206             };
82207         }
82208
82209
82210         function icon(name, svgklass, useklass) {
82211             return '<svg class="icon ' + (svgklass || '') + '">' +
82212                  '<use xlink:href="' + name + '"' +
82213                  (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
82214         }
82215
82216
82217         function slugify(text) {
82218             return text.toString().toLowerCase()
82219                 .replace(/\s+/g, '-')           // Replace spaces with -
82220                 .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
82221                 .replace(/\-\-+/g, '-')         // Replace multiple - with single -
82222                 .replace(/^-+/, '')             // Trim - from start of text
82223                 .replace(/-+$/, '');            // Trim - from end of text
82224         }
82225
82226
82227         // console warning for missing walkthrough names
82228         var missingStrings = {};
82229         function checkKey(key, text) {
82230             if (t(key, { default: undefined}) === undefined) {
82231                 if (missingStrings.hasOwnProperty(key)) return;  // warn once
82232                 missingStrings[key] = text;
82233                 var missing = key + ': ' + text;
82234                 if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
82235             }
82236         }
82237
82238
82239         function localize(obj) {
82240             var key;
82241
82242             // Assign name if entity has one..
82243             var name = obj.tags && obj.tags.name;
82244             if (name) {
82245                 key = 'intro.graph.name.' + slugify(name);
82246                 obj.tags.name = t(key, { default: name });
82247                 checkKey(key, name);
82248             }
82249
82250             // Assign street name if entity has one..
82251             var street = obj.tags && obj.tags['addr:street'];
82252             if (street) {
82253                 key = 'intro.graph.name.' + slugify(street);
82254                 obj.tags['addr:street'] = t(key, { default: street });
82255                 checkKey(key, street);
82256
82257                 // Add address details common across walkthrough..
82258                 var addrTags = [
82259                     'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
82260                     'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
82261                 ];
82262                 addrTags.forEach(function(k) {
82263                     var key = 'intro.graph.' + k;
82264                     var tag = 'addr:' + k;
82265                     var val = obj.tags && obj.tags[tag];
82266                     var str = t(key, { default: val });
82267
82268                     if (str) {
82269                         if (str.match(/^<.*>$/) !== null) {
82270                             delete obj.tags[tag];
82271                         } else {
82272                             obj.tags[tag] = str;
82273                         }
82274                     }
82275                 });
82276             }
82277
82278             return obj;
82279         }
82280
82281
82282         // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
82283         function isMostlySquare(points) {
82284             // note: uses 15 here instead of the 12 from actionOrthogonalize because
82285             // actionOrthogonalize can actually straighten some larger angles as it iterates
82286             var threshold = 15; // degrees within right or straight
82287             var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
82288             var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
82289
82290             for (var i = 0; i < points.length; i++) {
82291                 var a = points[(i - 1 + points.length) % points.length];
82292                 var origin = points[i];
82293                 var b = points[(i + 1) % points.length];
82294
82295                 var dotp = geoVecNormalizedDot(a, b, origin);
82296                 var mag = Math.abs(dotp);
82297                 if (mag > lowerBound && mag < upperBound) {
82298                     return false;
82299                 }
82300             }
82301
82302             return true;
82303         }
82304
82305
82306         function selectMenuItem(operation) {
82307             var selector = '.edit-menu .edit-menu-item-' + operation +
82308                 ', .radial-menu .radial-menu-item-' + operation;
82309             return d3_select(selector);
82310         }
82311
82312
82313         function transitionTime(point1, point2) {
82314             var distance = geoSphericalDistance(point1, point2);
82315             if (distance === 0)
82316                 return 0;
82317             else if (distance < 80)
82318                 return 500;
82319             else
82320                 return 1000;
82321         }
82322
82323         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]}};
82324
82325         // Tooltips and svg mask used to highlight certain features
82326         function uiCurtain() {
82327
82328             var surface = d3_select(null),
82329                 tooltip = d3_select(null),
82330                 darkness = d3_select(null);
82331
82332             function curtain(selection) {
82333                 surface = selection
82334                     .append('svg')
82335                     .attr('id', 'curtain')
82336                     .style('z-index', 1000)
82337                     .style('pointer-events', 'none')
82338                     .style('position', 'absolute')
82339                     .style('top', 0)
82340                     .style('left', 0);
82341
82342                 darkness = surface.append('path')
82343                     .attr('x', 0)
82344                     .attr('y', 0)
82345                     .attr('class', 'curtain-darkness');
82346
82347                 d3_select(window).on('resize.curtain', resize);
82348
82349                 tooltip = selection.append('div')
82350                     .attr('class', 'tooltip')
82351                     .style('z-index', 1002);
82352
82353                 tooltip
82354                     .append('div')
82355                     .attr('class', 'tooltip-arrow');
82356
82357                 tooltip
82358                     .append('div')
82359                     .attr('class', 'tooltip-inner');
82360
82361                 resize();
82362
82363
82364                 function resize() {
82365                     surface
82366                         .attr('width', window.innerWidth)
82367                         .attr('height', window.innerHeight);
82368                     curtain.cut(darkness.datum());
82369                 }
82370             }
82371
82372
82373             /**
82374              * Reveal cuts the curtain to highlight the given box,
82375              * and shows a tooltip with instructions next to the box.
82376              *
82377              * @param  {String|ClientRect} [box]   box used to cut the curtain
82378              * @param  {String}    [text]          text for a tooltip
82379              * @param  {Object}    [options]
82380              * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
82381              * @param  {integer}   [options.duration]        transition time in milliseconds
82382              * @param  {string}    [options.buttonText]      if set, create a button with this text label
82383              * @param  {function}  [options.buttonCallback]  if set, the callback for the button
82384              * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
82385              */
82386             curtain.reveal = function(box, text, options) {
82387                 if (typeof box === 'string') {
82388                     box = d3_select(box).node();
82389                 }
82390                 if (box && box.getBoundingClientRect) {
82391                     box = copyBox(box.getBoundingClientRect());
82392                 }
82393
82394                 options = options || {};
82395
82396                 var tooltipBox;
82397                 if (options.tooltipBox) {
82398                     tooltipBox = options.tooltipBox;
82399                     if (typeof tooltipBox === 'string') {
82400                         tooltipBox = d3_select(tooltipBox).node();
82401                     }
82402                     if (tooltipBox && tooltipBox.getBoundingClientRect) {
82403                         tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
82404                     }
82405                 } else {
82406                     tooltipBox = box;
82407                 }
82408
82409                 if (tooltipBox && text) {
82410                     // pseudo markdown bold text for the instruction section..
82411                     var parts = text.split('**');
82412                     var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
82413                     if (parts[1]) {
82414                         html += '<span class="instruction">' + parts[1] + '</span>';
82415                     }
82416
82417                     html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
82418                     html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
82419
82420                     if (options.buttonText && options.buttonCallback) {
82421                         html += '<div class="button-section">' +
82422                             '<button href="#" class="button action">' + options.buttonText + '</button></div>';
82423                     }
82424
82425                     var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
82426                     tooltip
82427                         .classed(classes, true)
82428                         .selectAll('.tooltip-inner')
82429                         .html(html);
82430
82431                     if (options.buttonText && options.buttonCallback) {
82432                         var button = tooltip.selectAll('.button-section .button.action');
82433                         button
82434                             .on('click', function() {
82435                                 event.preventDefault();
82436                                 options.buttonCallback();
82437                             });
82438                     }
82439
82440                     var tip = copyBox(tooltip.node().getBoundingClientRect()),
82441                         w = window.innerWidth,
82442                         h = window.innerHeight,
82443                         tooltipWidth = 200,
82444                         tooltipArrow = 5,
82445                         side, pos;
82446
82447
82448                     // hack: this will have bottom placement,
82449                     // so need to reserve extra space for the tooltip illustration.
82450                     if (options.tooltipClass === 'intro-mouse') {
82451                         tip.height += 80;
82452                     }
82453
82454                     // trim box dimensions to just the portion that fits in the window..
82455                     if (tooltipBox.top + tooltipBox.height > h) {
82456                         tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
82457                     }
82458                     if (tooltipBox.left + tooltipBox.width > w) {
82459                         tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
82460                     }
82461
82462                     // determine tooltip placement..
82463
82464                     if (tooltipBox.top + tooltipBox.height < 100) {
82465                         // tooltip below box..
82466                         side = 'bottom';
82467                         pos = [
82468                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82469                             tooltipBox.top + tooltipBox.height
82470                         ];
82471
82472                     } else if (tooltipBox.top > h - 140) {
82473                         // tooltip above box..
82474                         side = 'top';
82475                         pos = [
82476                             tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
82477                             tooltipBox.top - tip.height
82478                         ];
82479
82480                     } else {
82481                         // tooltip to the side of the tooltipBox..
82482                         var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
82483
82484                         if (textDirection === 'rtl') {
82485                             if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
82486                                 side = 'right';
82487                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82488
82489                             } else {
82490                                 side = 'left';
82491                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82492                             }
82493
82494                         } else {
82495                             if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
82496                                 side = 'left';
82497                                 pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
82498                             }
82499                             else {
82500                                 side = 'right';
82501                                 pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
82502                             }
82503                         }
82504                     }
82505
82506                     if (options.duration !== 0 || !tooltip.classed(side)) {
82507                         tooltip.call(uiToggle(true));
82508                     }
82509
82510                     tooltip
82511                         .style('top', pos[1] + 'px')
82512                         .style('left', pos[0] + 'px')
82513                         .attr('class', classes + ' ' + side);
82514
82515
82516                     // shift tooltip-inner if it is very close to the top or bottom edge
82517                     // (doesn't affect the placement of the tooltip-arrow)
82518                     var shiftY = 0;
82519                     if (side === 'left' || side === 'right') {
82520                         if (pos[1] < 60) {
82521                             shiftY = 60 - pos[1];
82522                         }
82523                         else if (pos[1] + tip.height > h - 100) {
82524                             shiftY = h - pos[1] - tip.height - 100;
82525                         }
82526                     }
82527                     tooltip.selectAll('.tooltip-inner')
82528                         .style('top', shiftY + 'px');
82529
82530                 } else {
82531                     tooltip
82532                         .classed('in', false)
82533                         .call(uiToggle(false));
82534                 }
82535
82536                 curtain.cut(box, options.duration);
82537
82538                 return tooltip;
82539             };
82540
82541
82542             curtain.cut = function(datum, duration) {
82543                 darkness.datum(datum)
82544                     .interrupt();
82545
82546                 var selection;
82547                 if (duration === 0) {
82548                     selection = darkness;
82549                 } else {
82550                     selection = darkness
82551                         .transition()
82552                         .duration(duration || 600)
82553                         .ease(linear$1);
82554                 }
82555
82556                 selection
82557                     .attr('d', function(d) {
82558                         var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
82559                             window.innerWidth + ',' + window.innerHeight + 'L' +
82560                             window.innerWidth + ',0 Z';
82561
82562                         if (!d) return string;
82563                         return string + 'M' +
82564                             d.left + ',' + d.top + 'L' +
82565                             d.left + ',' + (d.top + d.height) + 'L' +
82566                             (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
82567                             (d.left + d.width) + ',' + (d.top) + 'Z';
82568
82569                     });
82570             };
82571
82572
82573             curtain.remove = function() {
82574                 surface.remove();
82575                 tooltip.remove();
82576                 d3_select(window).on('resize.curtain', null);
82577             };
82578
82579
82580             // ClientRects are immutable, so copy them to an object,
82581             // in case we need to trim the height/width.
82582             function copyBox(src) {
82583                 return {
82584                     top: src.top,
82585                     right: src.right,
82586                     bottom: src.bottom,
82587                     left: src.left,
82588                     width: src.width,
82589                     height: src.height
82590                 };
82591             }
82592
82593
82594             return curtain;
82595         }
82596
82597         function uiIntroWelcome(context, reveal) {
82598             var dispatch$1 = dispatch('done');
82599             var listener = clickListener();
82600
82601             var chapter = {
82602                 title: 'intro.welcome.title'
82603             };
82604
82605
82606             function welcome() {
82607                 context.map().centerZoom([-85.63591, 41.94285], 19);
82608                 reveal('.intro-nav-wrap .chapter-welcome',
82609                     t('intro.welcome.welcome'),
82610                     { buttonText: t('intro.ok'), buttonCallback: practice }
82611                 );
82612             }
82613
82614             function practice() {
82615                 reveal('.intro-nav-wrap .chapter-welcome',
82616                     t('intro.welcome.practice'),
82617                     { buttonText: t('intro.ok'), buttonCallback: words }
82618                 );
82619             }
82620
82621             function words() {
82622                 reveal('.intro-nav-wrap .chapter-welcome',
82623                     t('intro.welcome.words'),
82624                     { buttonText: t('intro.ok'), buttonCallback: mouse }
82625                 );
82626             }
82627
82628
82629             function mouse() {
82630                 reveal('.intro-nav-wrap .chapter-welcome',
82631                     t('intro.welcome.mouse'),
82632                     { buttonText: t('intro.ok'), buttonCallback: leftClick }
82633                 );
82634             }
82635
82636
82637             function leftClick() {
82638                 var counter = 0;
82639                 var times = 5;
82640
82641                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82642                     t('intro.welcome.leftclick', { num: times }),
82643                     { tooltipClass: 'intro-mouse' }
82644                 );
82645
82646                 tooltip.selectAll('.tooltip-inner')
82647                     .insert('svg', 'span')
82648                     .attr('class', 'tooltip-illustration')
82649                     .append('use')
82650                     .attr('xlink:href', '#iD-walkthrough-mouse');
82651
82652                 tooltip
82653                     .append('div')
82654                     .attr('class', 'counter');
82655
82656                 tooltip.call(listener);
82657
82658                 listener.on('click', function(which) {
82659                     if (which === 'left') {
82660                         d3_select('.curtain-tooltip.intro-mouse .counter')
82661                             .text(String(++counter));
82662
82663                         if (counter === times) {
82664                             window.setTimeout(function() { continueTo(rightClick); }, 1000);
82665                         }
82666                     }
82667                 });
82668
82669                 function continueTo(nextStep) {
82670                     listener.on('click', null);
82671                     tooltip.call(listener.off);
82672                     tooltip.select('.counter').remove();
82673                     nextStep();
82674                 }
82675             }
82676
82677
82678             function rightClick() {
82679                 var counter = 0;
82680                 var times = 5;
82681
82682                 var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
82683                     t('intro.welcome.rightclick', { num: times }),
82684                     { tooltipClass: 'intro-mouse' }
82685                 );
82686
82687                 tooltip.selectAll('.tooltip-inner')
82688                     .insert('svg', 'span')
82689                     .attr('class', 'tooltip-illustration')
82690                     .append('use')
82691                     .attr('xlink:href', '#iD-walkthrough-mouse');
82692
82693                 tooltip
82694                     .append('div')
82695                     .attr('class', 'counter');
82696
82697                 tooltip.call(listener);
82698
82699                 listener.on('click', function(which) {
82700                     if (which === 'right') {
82701                         d3_select('.curtain-tooltip.intro-mouse .counter')
82702                             .text(String(++counter));
82703
82704                         if (counter === times) {
82705                             window.setTimeout(function() { continueTo(chapters); }, 1000);
82706                         }
82707                     }
82708                 });
82709
82710                 function continueTo(nextStep) {
82711                     listener.on('click', null);
82712                     tooltip.call(listener.off);
82713                     tooltip.select('.counter').remove();
82714                     nextStep();
82715                 }
82716             }
82717
82718
82719             function chapters() {
82720                 dispatch$1.call('done');
82721                 reveal('.intro-nav-wrap .chapter-navigation',
82722                     t('intro.welcome.chapters', { next: t('intro.navigation.title') })
82723                 );
82724             }
82725
82726
82727             chapter.enter = function() {
82728                 welcome();
82729             };
82730
82731
82732             chapter.exit = function() {
82733                 listener.off();
82734                 d3_select('.curtain-tooltip.intro-mouse')
82735                     .selectAll('.counter')
82736                     .remove();
82737             };
82738
82739
82740             chapter.restart = function() {
82741                 chapter.exit();
82742                 chapter.enter();
82743             };
82744
82745
82746             return utilRebind(chapter, dispatch$1, 'on');
82747         }
82748
82749
82750
82751         function clickListener() {
82752             var dispatch$1 = dispatch('click');
82753             var minTime = 120;
82754             var tooltip = d3_select(null);
82755             var down = {};
82756
82757             // `down` keeps track of which buttons/keys are down.
82758             // Setting a property in `down` happens immediately.
82759             // Unsetting a property in `down` is delayed because
82760             //   on Windows a contextmenu event happens after keyup/mouseup
82761
82762             function keydown() {
82763                 if (event.keyCode === 93)  {   // context menu
82764                     event.preventDefault();
82765                     event.stopPropagation();
82766                     down.menu = event.timeStamp;
82767                     tooltip.classed('rightclick', true);
82768                 }
82769             }
82770
82771
82772             function keyup() {
82773                 if (event.keyCode === 93)  {   // context menu
82774                     event.preventDefault();
82775                     event.stopPropagation();
82776                     var endTime = event.timeStamp;
82777                     var startTime = down.menu || endTime;
82778                     var delay = (endTime - startTime < minTime) ? minTime : 0;
82779
82780                     window.setTimeout(function() {
82781                         tooltip.classed('rightclick', false);
82782                         down.menu = undefined;  // delayed, for Windows
82783                     }, delay);
82784
82785                     dispatch$1.call('click', this, 'right');
82786                 }
82787             }
82788
82789
82790             function mousedown() {
82791                 var button = event.button;
82792                 if (button === 0 && !event.ctrlKey) {
82793                     tooltip.classed('leftclick', true);
82794                 } else if (button === 2) {
82795                     tooltip.classed('rightclick', true);
82796                 }
82797                 down[button] = event.timeStamp;
82798             }
82799
82800
82801             function mouseup() {
82802                 var button = event.button;
82803                 var endTime = event.timeStamp;
82804                 var startTime = down[button] || endTime;
82805                 var delay = (endTime - startTime < minTime) ? minTime : 0;
82806
82807                 if (button === 0 && !event.ctrlKey) {
82808                     window.setTimeout(function() {
82809                         tooltip.classed('leftclick', false);
82810                         down[button] = undefined;  // delayed, for Windows
82811                     }, delay);
82812
82813                     dispatch$1.call('click', this, 'left');
82814
82815                 } else if (button === 2) {
82816                     window.setTimeout(function() {
82817                         tooltip.classed('rightclick', false);
82818                         down[button] = undefined;  // delayed, for Windows
82819                     }, delay);
82820
82821                     dispatch$1.call('click', this, 'right');
82822
82823                 } else {
82824                     window.setTimeout(function() {
82825                         down[button] = undefined;  // delayed, for Windows
82826                     }, delay);
82827                 }
82828             }
82829
82830
82831             function contextmenu() {
82832                 event.preventDefault();
82833                 event.stopPropagation();
82834                 if (!down[2] && !down.menu) {
82835                     tooltip.classed('rightclick', true);
82836                     window.setTimeout(function() {
82837                         tooltip.classed('rightclick', false);
82838                     }, minTime);
82839                     dispatch$1.call('click', this, 'right');
82840                 }
82841             }
82842
82843
82844             var behavior = function(selection) {
82845                 tooltip = selection;
82846                 down = {};
82847
82848                 d3_select(window)
82849                     .on('keydown.intro', keydown)
82850                     .on('keyup.intro', keyup)
82851                     .on('mousedown.intro', mousedown)
82852                     .on('mouseup.intro', mouseup)
82853                     .on('contextmenu.intro', contextmenu);
82854             };
82855
82856
82857             behavior.off = function() {
82858                 d3_select(window)
82859                     .on('keydown.intro', null)
82860                     .on('keyup.intro', null)
82861                     .on('mousedown.intro', null)
82862                     .on('mouseup.intro', null)
82863                     .on('contextmenu.intro', null);
82864
82865                 tooltip
82866                     .classed('leftclick', false)
82867                     .classed('rightclick', false);
82868             };
82869
82870             return utilRebind(behavior, dispatch$1, 'on');
82871         }
82872
82873         function uiIntroNavigation(context, reveal) {
82874             var dispatch$1 = dispatch('done');
82875             var timeouts = [];
82876             var hallId = 'n2061';
82877             var townHall = [-85.63591, 41.94285];
82878             var springStreetId = 'w397';
82879             var springStreetEndId = 'n1834';
82880             var springStreet = [-85.63582, 41.94255];
82881             var onewayField = context.presets().field('oneway');
82882             var maxspeedField = context.presets().field('maxspeed');
82883
82884
82885             var chapter = {
82886                 title: 'intro.navigation.title'
82887             };
82888
82889
82890             function timeout(f, t) {
82891                 timeouts.push(window.setTimeout(f, t));
82892             }
82893
82894
82895             function eventCancel() {
82896                 event.stopPropagation();
82897                 event.preventDefault();
82898             }
82899
82900
82901             function isTownHallSelected() {
82902                 var ids = context.selectedIDs();
82903                 return ids.length === 1 && ids[0] === hallId;
82904             }
82905
82906
82907             function dragMap() {
82908                 context.enter(modeBrowse(context));
82909                 context.history().reset('initial');
82910
82911                 var msec = transitionTime(townHall, context.map().center());
82912                 if (msec) { reveal(null, null, { duration: 0 }); }
82913                 context.map().centerZoomEase(townHall, 19, msec);
82914
82915                 timeout(function() {
82916                     var centerStart = context.map().center();
82917
82918                     reveal('#surface', t('intro.navigation.drag'));
82919                     context.map().on('drawn.intro', function() {
82920                         reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
82921                     });
82922
82923                     context.map().on('move.intro', function() {
82924                         var centerNow = context.map().center();
82925                         if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
82926                             context.map().on('move.intro', null);
82927                             timeout(function() { continueTo(zoomMap); }, 3000);
82928                         }
82929                     });
82930
82931                 }, msec + 100);
82932
82933                 function continueTo(nextStep) {
82934                     context.map().on('move.intro drawn.intro', null);
82935                     nextStep();
82936                 }
82937             }
82938
82939
82940             function zoomMap() {
82941                 var zoomStart = context.map().zoom();
82942
82943                 reveal('#surface',
82944                     t('intro.navigation.zoom', {
82945                         plus: icon('#iD-icon-plus', 'pre-text'),
82946                         minus: icon('#iD-icon-minus', 'pre-text')
82947                     })
82948                 );
82949
82950                 context.map().on('drawn.intro', function() {
82951                     reveal('#surface',
82952                         t('intro.navigation.zoom', {
82953                             plus: icon('#iD-icon-plus', 'pre-text'),
82954                             minus: icon('#iD-icon-minus', 'pre-text')
82955                         }), { duration: 0 }
82956                     );
82957                 });
82958
82959                 context.map().on('move.intro', function() {
82960                     if (context.map().zoom() !== zoomStart) {
82961                         context.map().on('move.intro', null);
82962                         timeout(function() { continueTo(features); }, 3000);
82963                     }
82964                 });
82965
82966                 function continueTo(nextStep) {
82967                     context.map().on('move.intro drawn.intro', null);
82968                     nextStep();
82969                 }
82970             }
82971
82972
82973             function features() {
82974                 var onClick = function() { continueTo(pointsLinesAreas); };
82975
82976                 reveal('#surface', t('intro.navigation.features'),
82977                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82978                 );
82979
82980                 context.map().on('drawn.intro', function() {
82981                     reveal('#surface', t('intro.navigation.features'),
82982                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
82983                     );
82984                 });
82985
82986                 function continueTo(nextStep) {
82987                     context.map().on('drawn.intro', null);
82988                     nextStep();
82989                 }
82990             }
82991
82992             function pointsLinesAreas() {
82993                 var onClick = function() { continueTo(nodesWays); };
82994
82995                 reveal('#surface', t('intro.navigation.points_lines_areas'),
82996                     { buttonText: t('intro.ok'), buttonCallback: onClick }
82997                 );
82998
82999                 context.map().on('drawn.intro', function() {
83000                     reveal('#surface', t('intro.navigation.points_lines_areas'),
83001                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83002                     );
83003                 });
83004
83005                 function continueTo(nextStep) {
83006                     context.map().on('drawn.intro', null);
83007                     nextStep();
83008                 }
83009             }
83010
83011             function nodesWays() {
83012                 var onClick = function() { continueTo(clickTownHall); };
83013
83014                 reveal('#surface', t('intro.navigation.nodes_ways'),
83015                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83016                 );
83017
83018                 context.map().on('drawn.intro', function() {
83019                     reveal('#surface', t('intro.navigation.nodes_ways'),
83020                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83021                     );
83022                 });
83023
83024                 function continueTo(nextStep) {
83025                     context.map().on('drawn.intro', null);
83026                     nextStep();
83027                 }
83028             }
83029
83030             function clickTownHall() {
83031                 context.enter(modeBrowse(context));
83032                 context.history().reset('initial');
83033
83034                 var entity = context.hasEntity(hallId);
83035                 if (!entity) return;
83036                 reveal(null, null, { duration: 0 });
83037                 context.map().centerZoomEase(entity.loc, 19, 500);
83038
83039                 timeout(function() {
83040                     var entity = context.hasEntity(hallId);
83041                     if (!entity) return;
83042                     var box = pointBox(entity.loc, context);
83043                     reveal(box, t('intro.navigation.click_townhall'));
83044
83045                     context.map().on('move.intro drawn.intro', function() {
83046                         var entity = context.hasEntity(hallId);
83047                         if (!entity) return;
83048                         var box = pointBox(entity.loc, context);
83049                         reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
83050                     });
83051
83052                     context.on('enter.intro', function() {
83053                         if (isTownHallSelected()) continueTo(selectedTownHall);
83054                     });
83055
83056                 }, 550);  // after centerZoomEase
83057
83058                 context.history().on('change.intro', function() {
83059                     if (!context.hasEntity(hallId)) {
83060                         continueTo(clickTownHall);
83061                     }
83062                 });
83063
83064                 function continueTo(nextStep) {
83065                     context.on('enter.intro', null);
83066                     context.map().on('move.intro drawn.intro', null);
83067                     context.history().on('change.intro', null);
83068                     nextStep();
83069                 }
83070             }
83071
83072
83073             function selectedTownHall() {
83074                 if (!isTownHallSelected()) return clickTownHall();
83075
83076                 var entity = context.hasEntity(hallId);
83077                 if (!entity) return clickTownHall();
83078
83079                 var box = pointBox(entity.loc, context);
83080                 var onClick = function() { continueTo(editorTownHall); };
83081
83082                 reveal(box, t('intro.navigation.selected_townhall'),
83083                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83084                 );
83085
83086                 context.map().on('move.intro drawn.intro', function() {
83087                     var entity = context.hasEntity(hallId);
83088                     if (!entity) return;
83089                     var box = pointBox(entity.loc, context);
83090                     reveal(box, t('intro.navigation.selected_townhall'),
83091                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83092                     );
83093                 });
83094
83095                 context.history().on('change.intro', function() {
83096                     if (!context.hasEntity(hallId)) {
83097                         continueTo(clickTownHall);
83098                     }
83099                 });
83100
83101                 function continueTo(nextStep) {
83102                     context.map().on('move.intro drawn.intro', null);
83103                     context.history().on('change.intro', null);
83104                     nextStep();
83105                 }
83106             }
83107
83108
83109             function editorTownHall() {
83110                 if (!isTownHallSelected()) return clickTownHall();
83111
83112                 // disallow scrolling
83113                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83114
83115                 var onClick = function() { continueTo(presetTownHall); };
83116
83117                 reveal('.entity-editor-pane',
83118                     t('intro.navigation.editor_townhall'),
83119                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83120                 );
83121
83122                 context.on('exit.intro', function() {
83123                     continueTo(clickTownHall);
83124                 });
83125
83126                 context.history().on('change.intro', function() {
83127                     if (!context.hasEntity(hallId)) {
83128                         continueTo(clickTownHall);
83129                     }
83130                 });
83131
83132                 function continueTo(nextStep) {
83133                     context.on('exit.intro', null);
83134                     context.history().on('change.intro', null);
83135                     d3_select('.inspector-wrap').on('wheel.intro', null);
83136                     nextStep();
83137                 }
83138             }
83139
83140
83141             function presetTownHall() {
83142                 if (!isTownHallSelected()) return clickTownHall();
83143
83144                 // reset pane, in case user happened to change it..
83145                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83146                 // disallow scrolling
83147                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83148
83149                 // preset match, in case the user happened to change it.
83150                 var entity = context.entity(context.selectedIDs()[0]);
83151                 var preset = context.presets().match(entity, context.graph());
83152
83153                 var onClick = function() { continueTo(fieldsTownHall); };
83154
83155                 context.on('exit.intro', function() {
83156                     continueTo(clickTownHall);
83157                 });
83158
83159                 context.history().on('change.intro', function() {
83160                     if (!context.hasEntity(hallId)) {
83161                         continueTo(clickTownHall);
83162                     }
83163                 });
83164
83165                 reveal('.inspector-body .preset-list-item.inspector-inner',
83166                     t('intro.navigation.preset_townhall', { preset: preset.name() }),
83167                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83168                 );
83169
83170                 function continueTo(nextStep) {
83171                     context.on('exit.intro', null);
83172                     context.history().on('change.intro', null);
83173                     d3_select('.inspector-wrap').on('wheel.intro', null);
83174                     nextStep();
83175                 }
83176             }
83177
83178
83179             function fieldsTownHall() {
83180                 if (!isTownHallSelected()) return clickTownHall();
83181
83182                 // reset pane, in case user happened to change it..
83183                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83184                 // disallow scrolling
83185                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83186
83187                 var onClick = function() { continueTo(closeTownHall); };
83188
83189                 reveal('.inspector-body .preset-editor',
83190                     t('intro.navigation.fields_townhall'),
83191                     { buttonText: t('intro.ok'), buttonCallback: onClick }
83192                 );
83193
83194                 context.on('exit.intro', function() {
83195                     continueTo(clickTownHall);
83196                 });
83197
83198                 context.history().on('change.intro', function() {
83199                     if (!context.hasEntity(hallId)) {
83200                         continueTo(clickTownHall);
83201                     }
83202                 });
83203
83204                 function continueTo(nextStep) {
83205                     context.on('exit.intro', null);
83206                     context.history().on('change.intro', null);
83207                     d3_select('.inspector-wrap').on('wheel.intro', null);
83208                     nextStep();
83209                 }
83210             }
83211
83212
83213             function closeTownHall() {
83214                 if (!isTownHallSelected()) return clickTownHall();
83215
83216                 var selector = '.entity-editor-pane button.preset-close svg use';
83217                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83218
83219                 reveal('.entity-editor-pane',
83220                     t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
83221                 );
83222
83223                 context.on('exit.intro', function() {
83224                     continueTo(searchStreet);
83225                 });
83226
83227                 context.history().on('change.intro', function() {
83228                     // update the close icon in the tooltip if the user edits something.
83229                     var selector = '.entity-editor-pane button.preset-close svg use';
83230                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83231
83232                     reveal('.entity-editor-pane',
83233                         t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
83234                         { duration: 0 }
83235                     );
83236                 });
83237
83238                 function continueTo(nextStep) {
83239                     context.on('exit.intro', null);
83240                     context.history().on('change.intro', null);
83241                     nextStep();
83242                 }
83243             }
83244
83245
83246             function searchStreet() {
83247                 context.enter(modeBrowse(context));
83248                 context.history().reset('initial');  // ensure spring street exists
83249
83250                 var msec = transitionTime(springStreet, context.map().center());
83251                 if (msec) { reveal(null, null, { duration: 0 }); }
83252                 context.map().centerZoomEase(springStreet, 19, msec);  // ..and user can see it
83253
83254                 timeout(function() {
83255                     reveal('.search-header input',
83256                         t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
83257                     );
83258
83259                     d3_select('.search-header input')
83260                         .on('keyup.intro', checkSearchResult);
83261                 }, msec + 100);
83262             }
83263
83264
83265             function checkSearchResult() {
83266                 var first = d3_select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
83267                 var firstName = first.select('.entity-name');
83268                 var name = t('intro.graph.name.spring-street');
83269
83270                 if (!firstName.empty() && firstName.text() === name) {
83271                     reveal(first.node(),
83272                         t('intro.navigation.choose_street', { name: name }),
83273                         { duration: 300 }
83274                     );
83275
83276                     context.on('exit.intro', function() {
83277                         continueTo(selectedStreet);
83278                     });
83279
83280                     d3_select('.search-header input')
83281                         .on('keydown.intro', eventCancel, true)
83282                         .on('keyup.intro', null);
83283                 }
83284
83285                 function continueTo(nextStep) {
83286                     context.on('exit.intro', null);
83287                     d3_select('.search-header input')
83288                         .on('keydown.intro', null)
83289                         .on('keyup.intro', null);
83290                     nextStep();
83291                 }
83292             }
83293
83294
83295             function selectedStreet() {
83296                 if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83297                     return searchStreet();
83298                 }
83299
83300                 var onClick = function() { continueTo(editorStreet); };
83301                 var entity = context.entity(springStreetEndId);
83302                 var box = pointBox(entity.loc, context);
83303                 box.height = 500;
83304
83305                 reveal(box,
83306                     t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83307                     { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
83308                 );
83309
83310                 timeout(function() {
83311                     context.map().on('move.intro drawn.intro', function() {
83312                         var entity = context.hasEntity(springStreetEndId);
83313                         if (!entity) return;
83314                         var box = pointBox(entity.loc, context);
83315                         box.height = 500;
83316                         reveal(box,
83317                             t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
83318                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
83319                         );
83320                     });
83321                 }, 600);  // after reveal.
83322
83323                 context.on('enter.intro', function(mode) {
83324                     if (!context.hasEntity(springStreetId)) {
83325                         return continueTo(searchStreet);
83326                     }
83327                     var ids = context.selectedIDs();
83328                     if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
83329                         // keep Spring Street selected..
83330                         context.enter(modeSelect(context, [springStreetId]));
83331                     }
83332                 });
83333
83334                 context.history().on('change.intro', function() {
83335                     if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
83336                         timeout(function() {
83337                             continueTo(searchStreet);
83338                         }, 300);  // after any transition (e.g. if user deleted intersection)
83339                     }
83340                 });
83341
83342                 function continueTo(nextStep) {
83343                     context.map().on('move.intro drawn.intro', null);
83344                     context.on('enter.intro', null);
83345                     context.history().on('change.intro', null);
83346                     nextStep();
83347                 }
83348             }
83349
83350
83351             function editorStreet() {
83352                 var selector = '.entity-editor-pane button.preset-close svg use';
83353                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83354
83355                 reveal('.entity-editor-pane',
83356                     t('intro.navigation.editor_street', {
83357                         button: icon(href, 'pre-text'),
83358                         field1: onewayField.label(),
83359                         field2: maxspeedField.label()
83360                     })
83361                 );
83362
83363                 context.on('exit.intro', function() {
83364                     continueTo(play);
83365                 });
83366
83367                 context.history().on('change.intro', function() {
83368                     // update the close icon in the tooltip if the user edits something.
83369                     var selector = '.entity-editor-pane button.preset-close svg use';
83370                     var href = d3_select(selector).attr('href') || '#iD-icon-close';
83371
83372                     reveal('.entity-editor-pane',
83373                         t('intro.navigation.editor_street', {
83374                             button: icon(href, 'pre-text'),
83375                             field1: onewayField.label().toLowerCase(),
83376                             field2: maxspeedField.label().toLowerCase()
83377                         }), { duration: 0 }
83378                     );
83379                 });
83380
83381                 function continueTo(nextStep) {
83382                     context.on('exit.intro', null);
83383                     context.history().on('change.intro', null);
83384                     nextStep();
83385                 }
83386             }
83387
83388
83389             function play() {
83390                 dispatch$1.call('done');
83391                 reveal('#id-container',
83392                     t('intro.navigation.play', { next: t('intro.points.title') }), {
83393                         tooltipBox: '.intro-nav-wrap .chapter-point',
83394                         buttonText: t('intro.ok'),
83395                         buttonCallback: function() { reveal('#id-container'); }
83396                     }
83397                 );
83398             }
83399
83400
83401             chapter.enter = function() {
83402                 dragMap();
83403             };
83404
83405
83406             chapter.exit = function() {
83407                 timeouts.forEach(window.clearTimeout);
83408                 context.on('enter.intro exit.intro', null);
83409                 context.map().on('move.intro drawn.intro', null);
83410                 context.history().on('change.intro', null);
83411                 d3_select('.inspector-wrap').on('wheel.intro', null);
83412                 d3_select('.search-header input').on('keydown.intro keyup.intro', null);
83413             };
83414
83415
83416             chapter.restart = function() {
83417                 chapter.exit();
83418                 chapter.enter();
83419             };
83420
83421
83422             return utilRebind(chapter, dispatch$1, 'on');
83423         }
83424
83425         function uiIntroPoint(context, reveal) {
83426             var dispatch$1 = dispatch('done');
83427             var timeouts = [];
83428             var intersection = [-85.63279, 41.94394];
83429             var building = [-85.632422, 41.944045];
83430             var cafePreset = context.presets().item('amenity/cafe');
83431             var _pointID = null;
83432
83433
83434             var chapter = {
83435                 title: 'intro.points.title'
83436             };
83437
83438
83439             function timeout(f, t) {
83440                 timeouts.push(window.setTimeout(f, t));
83441             }
83442
83443
83444             function revealEditMenu(loc, text, options) {
83445                 var rect = context.surfaceRect();
83446                 var point = context.curtainProjection(loc);
83447                 var pad = 40;
83448                 var width = 250 + (2 * pad);
83449                 var height = 250;
83450                 var startX = rect.left + point[0];
83451                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
83452                 var box = {
83453                     left: left,
83454                     top: point[1] + rect.top - 60,
83455                     width: width,
83456                     height: height
83457                 };
83458                 reveal(box, text, options);
83459             }
83460
83461
83462             function eventCancel() {
83463                 event.stopPropagation();
83464                 event.preventDefault();
83465             }
83466
83467
83468             function addPoint() {
83469                 context.enter(modeBrowse(context));
83470                 context.history().reset('initial');
83471
83472                 var msec = transitionTime(intersection, context.map().center());
83473                 if (msec) { reveal(null, null, { duration: 0 }); }
83474                 context.map().centerZoomEase(intersection, 19, msec);
83475
83476                 timeout(function() {
83477                     var tooltip = reveal('button.add-point',
83478                         t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
83479
83480                     _pointID = null;
83481
83482                     tooltip.selectAll('.tooltip-inner')
83483                         .insert('svg', 'span')
83484                         .attr('class', 'tooltip-illustration')
83485                         .append('use')
83486                         .attr('xlink:href', '#iD-graphic-points');
83487
83488                     context.on('enter.intro', function(mode) {
83489                         if (mode.id !== 'add-point') return;
83490                         continueTo(placePoint);
83491                     });
83492                 }, msec + 100);
83493
83494                 function continueTo(nextStep) {
83495                     context.on('enter.intro', null);
83496                     nextStep();
83497                 }
83498             }
83499
83500
83501             function placePoint() {
83502                 if (context.mode().id !== 'add-point') {
83503                     return chapter.restart();
83504                 }
83505
83506                 var pointBox = pad$2(building, 150, context);
83507                 reveal(pointBox, t('intro.points.place_point'));
83508
83509                 context.map().on('move.intro drawn.intro', function() {
83510                     pointBox = pad$2(building, 150, context);
83511                     reveal(pointBox, t('intro.points.place_point'), { duration: 0 });
83512                 });
83513
83514                 context.on('enter.intro', function(mode) {
83515                     if (mode.id !== 'select') return chapter.restart();
83516                     _pointID = context.mode().selectedIDs()[0];
83517                     continueTo(searchPreset);
83518                 });
83519
83520                 function continueTo(nextStep) {
83521                     context.map().on('move.intro drawn.intro', null);
83522                     context.on('enter.intro', null);
83523                     nextStep();
83524                 }
83525             }
83526
83527
83528             function searchPreset() {
83529                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83530                     return addPoint();
83531                 }
83532
83533                 // disallow scrolling
83534                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83535
83536                 d3_select('.preset-search-input')
83537                     .on('keydown.intro', null)
83538                     .on('keyup.intro', checkPresetSearch);
83539
83540                 reveal('.preset-search-input',
83541                     t('intro.points.search_cafe', { preset: cafePreset.name() })
83542                 );
83543
83544                 context.on('enter.intro', function(mode) {
83545                     if (!_pointID || !context.hasEntity(_pointID)) {
83546                         return continueTo(addPoint);
83547                     }
83548
83549                     var ids = context.selectedIDs();
83550                     if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
83551                         // keep the user's point selected..
83552                         context.enter(modeSelect(context, [_pointID]));
83553
83554                         // disallow scrolling
83555                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83556
83557                         d3_select('.preset-search-input')
83558                             .on('keydown.intro', null)
83559                             .on('keyup.intro', checkPresetSearch);
83560
83561                         reveal('.preset-search-input',
83562                             t('intro.points.search_cafe', { preset: cafePreset.name() })
83563                         );
83564
83565                         context.history().on('change.intro', null);
83566                     }
83567                 });
83568
83569
83570                 function checkPresetSearch() {
83571                     var first = d3_select('.preset-list-item:first-child');
83572
83573                     if (first.classed('preset-amenity-cafe')) {
83574                         d3_select('.preset-search-input')
83575                             .on('keydown.intro', eventCancel, true)
83576                             .on('keyup.intro', null);
83577
83578                         reveal(first.select('.preset-list-button').node(),
83579                             t('intro.points.choose_cafe', { preset: cafePreset.name() }),
83580                             { duration: 300 }
83581                         );
83582
83583                         context.history().on('change.intro', function() {
83584                             continueTo(aboutFeatureEditor);
83585                         });
83586                     }
83587                 }
83588
83589                 function continueTo(nextStep) {
83590                     context.on('enter.intro', null);
83591                     context.history().on('change.intro', null);
83592                     d3_select('.inspector-wrap').on('wheel.intro', null);
83593                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83594                     nextStep();
83595                 }
83596             }
83597
83598
83599             function aboutFeatureEditor() {
83600                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83601                     return addPoint();
83602                 }
83603
83604                 timeout(function() {
83605                     reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
83606                         tooltipClass: 'intro-points-describe',
83607                         buttonText: t('intro.ok'),
83608                         buttonCallback: function() { continueTo(addName); }
83609                     });
83610                 }, 400);
83611
83612                 context.on('exit.intro', function() {
83613                     // if user leaves select mode here, just continue with the tutorial.
83614                     continueTo(reselectPoint);
83615                 });
83616
83617                 function continueTo(nextStep) {
83618                     context.on('exit.intro', null);
83619                     nextStep();
83620                 }
83621             }
83622
83623
83624             function addName() {
83625                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83626                     return addPoint();
83627                 }
83628
83629                 // reset pane, in case user happened to change it..
83630                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83631
83632                 timeout(function() {
83633                     // It's possible for the user to add a name in a previous step..
83634                     // If so, don't tell them to add the name in this step.
83635                     // Give them an OK button instead.
83636                     var entity = context.entity(_pointID);
83637                     if (entity.tags.name) {
83638                         var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
83639                             tooltipClass: 'intro-points-describe',
83640                             buttonText: t('intro.ok'),
83641                             buttonCallback: function() { continueTo(addCloseEditor); }
83642                         });
83643                         tooltip.select('.instruction').style('display', 'none');
83644
83645                     } else {
83646                         reveal('.entity-editor-pane', t('intro.points.add_name'),
83647                             { tooltipClass: 'intro-points-describe' }
83648                         );
83649                     }
83650                 }, 400);
83651
83652                 context.history().on('change.intro', function() {
83653                     continueTo(addCloseEditor);
83654                 });
83655
83656                 context.on('exit.intro', function() {
83657                     // if user leaves select mode here, just continue with the tutorial.
83658                     continueTo(reselectPoint);
83659                 });
83660
83661                 function continueTo(nextStep) {
83662                     context.on('exit.intro', null);
83663                     context.history().on('change.intro', null);
83664                     nextStep();
83665                 }
83666             }
83667
83668
83669             function addCloseEditor() {
83670                 // reset pane, in case user happened to change it..
83671                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83672
83673                 var selector = '.entity-editor-pane button.preset-close svg use';
83674                 var href = d3_select(selector).attr('href') || '#iD-icon-close';
83675
83676                 context.on('exit.intro', function() {
83677                     continueTo(reselectPoint);
83678                 });
83679
83680                 reveal('.entity-editor-pane',
83681                     t('intro.points.add_close', { button: icon(href, 'pre-text') })
83682                 );
83683
83684                 function continueTo(nextStep) {
83685                     context.on('exit.intro', null);
83686                     nextStep();
83687                 }
83688             }
83689
83690
83691             function reselectPoint() {
83692                 if (!_pointID) return chapter.restart();
83693                 var entity = context.hasEntity(_pointID);
83694                 if (!entity) return chapter.restart();
83695
83696                 // make sure it's still a cafe, in case user somehow changed it..
83697                 var oldPreset = context.presets().match(entity, context.graph());
83698                 context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
83699
83700                 context.enter(modeBrowse(context));
83701
83702                 var msec = transitionTime(entity.loc, context.map().center());
83703                 if (msec) { reveal(null, null, { duration: 0 }); }
83704                 context.map().centerEase(entity.loc, msec);
83705
83706                 timeout(function() {
83707                     var box = pointBox(entity.loc, context);
83708                     reveal(box, t('intro.points.reselect'), { duration: 600 });
83709
83710                     timeout(function() {
83711                         context.map().on('move.intro drawn.intro', function() {
83712                             var entity = context.hasEntity(_pointID);
83713                             if (!entity) return chapter.restart();
83714                             var box = pointBox(entity.loc, context);
83715                             reveal(box, t('intro.points.reselect'), { duration: 0 });
83716                         });
83717                     }, 600); // after reveal..
83718
83719                     context.on('enter.intro', function(mode) {
83720                         if (mode.id !== 'select') return;
83721                         continueTo(updatePoint);
83722                     });
83723
83724                 }, msec + 100);
83725
83726                 function continueTo(nextStep) {
83727                     context.map().on('move.intro drawn.intro', null);
83728                     context.on('enter.intro', null);
83729                     nextStep();
83730                 }
83731             }
83732
83733
83734             function updatePoint() {
83735                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83736                     return continueTo(reselectPoint);
83737                 }
83738
83739                 // reset pane, in case user happened to untag the point..
83740                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83741
83742                 context.on('exit.intro', function() {
83743                     continueTo(reselectPoint);
83744                 });
83745
83746                 context.history().on('change.intro', function() {
83747                     continueTo(updateCloseEditor);
83748                 });
83749
83750                 timeout(function() {
83751                     reveal('.entity-editor-pane', t('intro.points.update'),
83752                         { tooltipClass: 'intro-points-describe' }
83753                     );
83754                 }, 400);
83755
83756                 function continueTo(nextStep) {
83757                     context.on('exit.intro', null);
83758                     context.history().on('change.intro', null);
83759                     nextStep();
83760                 }
83761             }
83762
83763
83764             function updateCloseEditor() {
83765                 if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
83766                     return continueTo(reselectPoint);
83767                 }
83768
83769                 // reset pane, in case user happened to change it..
83770                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
83771
83772                 context.on('exit.intro', function() {
83773                     continueTo(rightClickPoint);
83774                 });
83775
83776                 timeout(function() {
83777                     reveal('.entity-editor-pane',
83778                         t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
83779                     );
83780                 }, 500);
83781
83782                 function continueTo(nextStep) {
83783                     context.on('exit.intro', null);
83784                     nextStep();
83785                 }
83786             }
83787
83788
83789             function rightClickPoint() {
83790                 if (!_pointID) return chapter.restart();
83791                 var entity = context.hasEntity(_pointID);
83792                 if (!entity) return chapter.restart();
83793
83794                 context.enter(modeBrowse(context));
83795
83796                 var box = pointBox(entity.loc, context);
83797                 reveal(box, t('intro.points.rightclick'), { duration: 600 });
83798
83799                 timeout(function() {
83800                     context.map().on('move.intro drawn.intro', function() {
83801                         var entity = context.hasEntity(_pointID);
83802                         if (!entity) return chapter.restart();
83803                         var box = pointBox(entity.loc, context);
83804                         reveal(box, t('intro.points.rightclick'), { duration: 0 });
83805                     });
83806                 }, 600); // after reveal
83807
83808                 context.on('enter.intro', function(mode) {
83809                     if (mode.id !== 'select') return;
83810                     var ids = context.selectedIDs();
83811                     if (ids.length !== 1 || ids[0] !== _pointID) return;
83812
83813                     timeout(function() {
83814                         var node = selectMenuItem('delete').node();
83815                         if (!node) return;
83816                         continueTo(enterDelete);
83817                     }, 300);  // after menu visible
83818                 });
83819
83820                 function continueTo(nextStep) {
83821                     context.on('enter.intro', null);
83822                     context.map().on('move.intro drawn.intro', null);
83823                     nextStep();
83824                 }
83825             }
83826
83827
83828             function enterDelete() {
83829                 if (!_pointID) return chapter.restart();
83830                 var entity = context.hasEntity(_pointID);
83831                 if (!entity) return chapter.restart();
83832
83833                 var node = selectMenuItem('delete').node();
83834                 if (!node) { return continueTo(rightClickPoint); }
83835
83836                 revealEditMenu(entity.loc,
83837                     t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
83838                 );
83839
83840                 timeout(function() {
83841                     context.map().on('move.intro drawn.intro', function() {
83842                         revealEditMenu(entity.loc,
83843                             t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
83844                             { duration: 0}
83845                         );
83846                     });
83847                 }, 300); // after menu visible
83848
83849                 context.on('exit.intro', function() {
83850                     if (!_pointID) return chapter.restart();
83851                     var entity = context.hasEntity(_pointID);
83852                     if (entity) return continueTo(rightClickPoint);  // point still exists
83853                 });
83854
83855                 context.history().on('change.intro', function(changed) {
83856                     if (changed.deleted().length) {
83857                         continueTo(undo);
83858                     }
83859                 });
83860
83861                 function continueTo(nextStep) {
83862                     context.map().on('move.intro drawn.intro', null);
83863                     context.history().on('change.intro', null);
83864                     context.on('exit.intro', null);
83865                     nextStep();
83866                 }
83867             }
83868
83869
83870             function undo() {
83871                 context.history().on('change.intro', function() {
83872                     continueTo(play);
83873                 });
83874
83875                 var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
83876                 reveal('#bar button.undo-button',
83877                     t('intro.points.undo', { button: icon(iconName, 'pre-text') })
83878                 );
83879
83880                 function continueTo(nextStep) {
83881                     context.history().on('change.intro', null);
83882                     nextStep();
83883                 }
83884             }
83885
83886
83887             function play() {
83888                 dispatch$1.call('done');
83889                 reveal('#id-container',
83890                     t('intro.points.play', { next: t('intro.areas.title') }), {
83891                         tooltipBox: '.intro-nav-wrap .chapter-area',
83892                         buttonText: t('intro.ok'),
83893                         buttonCallback: function() { reveal('#id-container'); }
83894                     }
83895                 );
83896             }
83897
83898
83899             chapter.enter = function() {
83900                 addPoint();
83901             };
83902
83903
83904             chapter.exit = function() {
83905                 timeouts.forEach(window.clearTimeout);
83906                 context.on('enter.intro exit.intro', null);
83907                 context.map().on('move.intro drawn.intro', null);
83908                 context.history().on('change.intro', null);
83909                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
83910                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
83911             };
83912
83913
83914             chapter.restart = function() {
83915                 chapter.exit();
83916                 chapter.enter();
83917             };
83918
83919
83920             return utilRebind(chapter, dispatch$1, 'on');
83921         }
83922
83923         function uiIntroArea(context, reveal) {
83924             var dispatch$1 = dispatch('done');
83925             var playground = [-85.63552, 41.94159];
83926             var playgroundPreset = context.presets().item('leisure/playground');
83927             var descriptionField = context.presets().field('description');
83928             var timeouts = [];
83929             var _areaID;
83930
83931
83932             var chapter = {
83933                 title: 'intro.areas.title'
83934             };
83935
83936
83937             function timeout(f, t) {
83938                 timeouts.push(window.setTimeout(f, t));
83939             }
83940
83941
83942             function eventCancel() {
83943                 event.stopPropagation();
83944                 event.preventDefault();
83945             }
83946
83947
83948             function revealPlayground(center, text, options) {
83949                 var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
83950                 var box = pad$2(center, padding, context);
83951                 reveal(box, text, options);
83952             }
83953
83954
83955             function addArea() {
83956                 context.enter(modeBrowse(context));
83957                 context.history().reset('initial');
83958                 _areaID = null;
83959
83960                 var msec = transitionTime(playground, context.map().center());
83961                 if (msec) { reveal(null, null, { duration: 0 }); }
83962                 context.map().centerZoomEase(playground, 19, msec);
83963
83964                 timeout(function() {
83965                     var tooltip = reveal('button.add-area',
83966                         t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
83967
83968                     tooltip.selectAll('.tooltip-inner')
83969                         .insert('svg', 'span')
83970                         .attr('class', 'tooltip-illustration')
83971                         .append('use')
83972                         .attr('xlink:href', '#iD-graphic-areas');
83973
83974                     context.on('enter.intro', function(mode) {
83975                         if (mode.id !== 'add-area') return;
83976                         continueTo(startPlayground);
83977                     });
83978                 }, msec + 100);
83979
83980                 function continueTo(nextStep) {
83981                     context.on('enter.intro', null);
83982                     nextStep();
83983                 }
83984             }
83985
83986
83987             function startPlayground() {
83988                 if (context.mode().id !== 'add-area') {
83989                     return chapter.restart();
83990                 }
83991
83992                 _areaID = null;
83993                 context.map().zoomEase(19.5, 500);
83994
83995                 timeout(function() {
83996                     revealPlayground(playground,
83997                         t('intro.areas.start_playground'), { duration: 250 }
83998                     );
83999
84000                     timeout(function() {
84001                         context.map().on('move.intro drawn.intro', function() {
84002                             revealPlayground(playground,
84003                                 t('intro.areas.start_playground'), { duration: 0 }
84004                             );
84005                         });
84006                         context.on('enter.intro', function(mode) {
84007                             if (mode.id !== 'draw-area') return chapter.restart();
84008                             continueTo(continuePlayground);
84009                         });
84010                     }, 250);  // after reveal
84011
84012                 }, 550);  // after easing
84013
84014                 function continueTo(nextStep) {
84015                     context.map().on('move.intro drawn.intro', null);
84016                     context.on('enter.intro', null);
84017                     nextStep();
84018                 }
84019             }
84020
84021
84022             function continuePlayground() {
84023                 if (context.mode().id !== 'draw-area') {
84024                     return chapter.restart();
84025                 }
84026
84027                 _areaID = null;
84028                 revealPlayground(playground,
84029                     t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84030                     { duration: 250 }
84031                 );
84032
84033                 timeout(function() {
84034                     context.map().on('move.intro drawn.intro', function() {
84035                         revealPlayground(playground,
84036                             t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
84037                             { duration: 0 }
84038                         );
84039                     });
84040                 }, 250);  // after reveal
84041
84042                 context.on('enter.intro', function(mode) {
84043                     if (mode.id === 'draw-area') {
84044                         var entity = context.hasEntity(context.selectedIDs()[0]);
84045                         if (entity && entity.nodes.length >= 6) {
84046                             return continueTo(finishPlayground);
84047                         } else {
84048                             return;
84049                         }
84050                     } else if (mode.id === 'select') {
84051                         _areaID = context.selectedIDs()[0];
84052                         return continueTo(searchPresets);
84053                     } else {
84054                         return chapter.restart();
84055                     }
84056                 });
84057
84058                 function continueTo(nextStep) {
84059                     context.map().on('move.intro drawn.intro', null);
84060                     context.on('enter.intro', null);
84061                     nextStep();
84062                 }
84063             }
84064
84065
84066             function finishPlayground() {
84067                 if (context.mode().id !== 'draw-area') {
84068                     return chapter.restart();
84069                 }
84070
84071                 _areaID = null;
84072                 revealPlayground(playground,
84073                     t('intro.areas.finish_playground'), { duration: 250 }
84074                 );
84075
84076                 timeout(function() {
84077                     context.map().on('move.intro drawn.intro', function() {
84078                         revealPlayground(playground,
84079                             t('intro.areas.finish_playground'), { duration: 0 }
84080                         );
84081                     });
84082                 }, 250);  // after reveal
84083
84084                 context.on('enter.intro', function(mode) {
84085                     if (mode.id === 'draw-area') {
84086                         return;
84087                     } else if (mode.id === 'select') {
84088                         _areaID = context.selectedIDs()[0];
84089                         return continueTo(searchPresets);
84090                     } else {
84091                         return chapter.restart();
84092                     }
84093                 });
84094
84095                 function continueTo(nextStep) {
84096                     context.map().on('move.intro drawn.intro', null);
84097                     context.on('enter.intro', null);
84098                     nextStep();
84099                 }
84100             }
84101
84102
84103             function searchPresets() {
84104                 if (!_areaID || !context.hasEntity(_areaID)) {
84105                     return addArea();
84106                 }
84107                 var ids = context.selectedIDs();
84108                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84109                     context.enter(modeSelect(context, [_areaID]));
84110                 }
84111
84112                 // disallow scrolling
84113                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84114
84115                 timeout(function() {
84116                     // reset pane, in case user somehow happened to change it..
84117                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84118
84119                     d3_select('.preset-search-input')
84120                         .on('keydown.intro', null)
84121                         .on('keyup.intro', checkPresetSearch);
84122
84123                     reveal('.preset-search-input',
84124                         t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84125                     );
84126                 }, 400);  // after preset list pane visible..
84127
84128                 context.on('enter.intro', function(mode) {
84129                     if (!_areaID || !context.hasEntity(_areaID)) {
84130                         return continueTo(addArea);
84131                     }
84132
84133                     var ids = context.selectedIDs();
84134                     if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
84135                         // keep the user's area selected..
84136                         context.enter(modeSelect(context, [_areaID]));
84137
84138                         // reset pane, in case user somehow happened to change it..
84139                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84140                         // disallow scrolling
84141                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84142
84143                         d3_select('.preset-search-input')
84144                             .on('keydown.intro', null)
84145                             .on('keyup.intro', checkPresetSearch);
84146
84147                         reveal('.preset-search-input',
84148                             t('intro.areas.search_playground', { preset: playgroundPreset.name() })
84149                         );
84150
84151                         context.history().on('change.intro', null);
84152                     }
84153                 });
84154
84155                 function checkPresetSearch() {
84156                     var first = d3_select('.preset-list-item:first-child');
84157
84158                     if (first.classed('preset-leisure-playground')) {
84159                         reveal(first.select('.preset-list-button').node(),
84160                             t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
84161                             { duration: 300 }
84162                         );
84163
84164                         d3_select('.preset-search-input')
84165                             .on('keydown.intro', eventCancel, true)
84166                             .on('keyup.intro', null);
84167
84168                         context.history().on('change.intro', function() {
84169                             continueTo(clickAddField);
84170                         });
84171                     }
84172                 }
84173
84174                 function continueTo(nextStep) {
84175                     d3_select('.inspector-wrap').on('wheel.intro', null);
84176                     context.on('enter.intro', null);
84177                     context.history().on('change.intro', null);
84178                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84179                     nextStep();
84180                 }
84181             }
84182
84183
84184             function clickAddField() {
84185                 if (!_areaID || !context.hasEntity(_areaID)) {
84186                     return addArea();
84187                 }
84188                 var ids = context.selectedIDs();
84189                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84190                     return searchPresets();
84191                 }
84192
84193                 if (!d3_select('.form-field-description').empty()) {
84194                     return continueTo(describePlayground);
84195                 }
84196
84197                 // disallow scrolling
84198                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84199
84200                 timeout(function() {
84201                     // reset pane, in case user somehow happened to change it..
84202                     d3_select('.inspector-wrap .panewrap').style('right', '0%');
84203
84204                     // It's possible for the user to add a description in a previous step..
84205                     // If they did this already, just continue to next step.
84206                     var entity = context.entity(_areaID);
84207                     if (entity.tags.description) {
84208                         return continueTo(play);
84209                     }
84210
84211                     // scroll "Add field" into view
84212                     var box = d3_select('.more-fields').node().getBoundingClientRect();
84213                     if (box.top > 300) {
84214                         var pane = d3_select('.entity-editor-pane .inspector-body');
84215                         var start = pane.node().scrollTop;
84216                         var end = start + (box.top - 300);
84217
84218                         pane
84219                             .transition()
84220                             .duration(250)
84221                             .tween('scroll.inspector', function() {
84222                                 var node = this;
84223                                 var i = d3_interpolateNumber(start, end);
84224                                 return function(t) {
84225                                     node.scrollTop = i(t);
84226                                 };
84227                             });
84228                     }
84229
84230                     timeout(function() {
84231                         reveal('.more-fields .combobox-input',
84232                             t('intro.areas.add_field'),
84233                             { duration: 300 }
84234                         );
84235
84236                         d3_select('.more-fields .combobox-input')
84237                             .on('click.intro', function() {
84238                                 // Watch for the combobox to appear...
84239                                 var watcher;
84240                                 watcher = window.setInterval(function() {
84241                                     if (!d3_select('div.combobox').empty()) {
84242                                         window.clearInterval(watcher);
84243                                         continueTo(chooseDescriptionField);
84244                                     }
84245                                 }, 300);
84246                             });
84247                     }, 300);  // after "Add Field" visible
84248
84249                 }, 400);  // after editor pane visible
84250
84251                 context.on('exit.intro', function() {
84252                     return continueTo(searchPresets);
84253                 });
84254
84255                 function continueTo(nextStep) {
84256                     d3_select('.inspector-wrap').on('wheel.intro', null);
84257                     d3_select('.more-fields .combobox-input').on('click.intro', null);
84258                     context.on('exit.intro', null);
84259                     nextStep();
84260                 }
84261             }
84262
84263
84264             function chooseDescriptionField() {
84265                 if (!_areaID || !context.hasEntity(_areaID)) {
84266                     return addArea();
84267                 }
84268                 var ids = context.selectedIDs();
84269                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84270                     return searchPresets();
84271                 }
84272
84273                 if (!d3_select('.form-field-description').empty()) {
84274                     return continueTo(describePlayground);
84275                 }
84276
84277                 // Make sure combobox is ready..
84278                 if (d3_select('div.combobox').empty()) {
84279                     return continueTo(clickAddField);
84280                 }
84281                 // Watch for the combobox to go away..
84282                 var watcher;
84283                 watcher = window.setInterval(function() {
84284                     if (d3_select('div.combobox').empty()) {
84285                         window.clearInterval(watcher);
84286                         timeout(function() {
84287                             if (d3_select('.form-field-description').empty()) {
84288                                 continueTo(retryChooseDescription);
84289                             } else {
84290                                 continueTo(describePlayground);
84291                             }
84292                         }, 300);  // after description field added.
84293                     }
84294                 }, 300);
84295
84296                 reveal('div.combobox',
84297                     t('intro.areas.choose_field', { field: descriptionField.label() }),
84298                     { duration: 300 }
84299                 );
84300
84301                 context.on('exit.intro', function() {
84302                     return continueTo(searchPresets);
84303                 });
84304
84305                 function continueTo(nextStep) {
84306                     if (watcher) window.clearInterval(watcher);
84307                     context.on('exit.intro', null);
84308                     nextStep();
84309                 }
84310             }
84311
84312
84313             function describePlayground() {
84314                 if (!_areaID || !context.hasEntity(_areaID)) {
84315                     return addArea();
84316                 }
84317                 var ids = context.selectedIDs();
84318                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84319                     return searchPresets();
84320                 }
84321
84322                 // reset pane, in case user happened to change it..
84323                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84324
84325                 if (d3_select('.form-field-description').empty()) {
84326                     return continueTo(retryChooseDescription);
84327                 }
84328
84329                 context.on('exit.intro', function() {
84330                     continueTo(play);
84331                 });
84332
84333                 reveal('.entity-editor-pane',
84334                     t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
84335                     { duration: 300 }
84336                 );
84337
84338                 function continueTo(nextStep) {
84339                     context.on('exit.intro', null);
84340                     nextStep();
84341                 }
84342             }
84343
84344
84345             function retryChooseDescription() {
84346                 if (!_areaID || !context.hasEntity(_areaID)) {
84347                     return addArea();
84348                 }
84349                 var ids = context.selectedIDs();
84350                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
84351                     return searchPresets();
84352                 }
84353
84354                 // reset pane, in case user happened to change it..
84355                 d3_select('.inspector-wrap .panewrap').style('right', '0%');
84356
84357                 reveal('.entity-editor-pane',
84358                     t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
84359                     buttonText: t('intro.ok'),
84360                     buttonCallback: function() { continueTo(clickAddField); }
84361                 });
84362
84363                 context.on('exit.intro', function() {
84364                     return continueTo(searchPresets);
84365                 });
84366
84367                 function continueTo(nextStep) {
84368                     context.on('exit.intro', null);
84369                     nextStep();
84370                 }
84371             }
84372
84373
84374             function play() {
84375                 dispatch$1.call('done');
84376                 reveal('#id-container',
84377                     t('intro.areas.play', { next: t('intro.lines.title') }), {
84378                         tooltipBox: '.intro-nav-wrap .chapter-line',
84379                         buttonText: t('intro.ok'),
84380                         buttonCallback: function() { reveal('#id-container'); }
84381                     }
84382                 );
84383             }
84384
84385
84386             chapter.enter = function() {
84387                 addArea();
84388             };
84389
84390
84391             chapter.exit = function() {
84392                 timeouts.forEach(window.clearTimeout);
84393                 context.on('enter.intro exit.intro', null);
84394                 context.map().on('move.intro drawn.intro', null);
84395                 context.history().on('change.intro', null);
84396                 d3_select('.inspector-wrap').on('wheel.intro', null);
84397                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
84398                 d3_select('.more-fields .combobox-input').on('click.intro', null);
84399             };
84400
84401
84402             chapter.restart = function() {
84403                 chapter.exit();
84404                 chapter.enter();
84405             };
84406
84407
84408             return utilRebind(chapter, dispatch$1, 'on');
84409         }
84410
84411         function uiIntroLine(context, reveal) {
84412             var dispatch$1 = dispatch('done');
84413             var timeouts = [];
84414             var _tulipRoadID = null;
84415             var flowerRoadID = 'w646';
84416             var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
84417             var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
84418             var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
84419             var roadCategory = context.presets().item('category-road_minor');
84420             var residentialPreset = context.presets().item('highway/residential');
84421             var woodRoadID = 'w525';
84422             var woodRoadEndID = 'n2862';
84423             var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
84424             var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
84425             var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
84426             var washingtonStreetID = 'w522';
84427             var twelfthAvenueID = 'w1';
84428             var eleventhAvenueEndID = 'n3550';
84429             var twelfthAvenueEndID = 'n5';
84430             var _washingtonSegmentID = null;
84431             var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
84432             var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
84433             var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
84434             var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
84435
84436
84437             var chapter = {
84438                 title: 'intro.lines.title'
84439             };
84440
84441
84442             function timeout(f, t) {
84443                 timeouts.push(window.setTimeout(f, t));
84444             }
84445
84446
84447             function eventCancel() {
84448                 event.stopPropagation();
84449                 event.preventDefault();
84450             }
84451
84452
84453             function revealEditMenu(loc, text, options) {
84454                 var rect = context.surfaceRect();
84455                 var point = context.curtainProjection(loc);
84456                 var pad = 40;
84457                 var width = 250 + (2 * pad);
84458                 var height = 350;
84459                 var startX = rect.left + point[0];
84460                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
84461                 var box = {
84462                     left: left,
84463                     top: point[1] + rect.top - 60,
84464                     width: width,
84465                     height: height
84466                 };
84467                 reveal(box, text, options);
84468             }
84469
84470
84471             function addLine() {
84472                 context.enter(modeBrowse(context));
84473                 context.history().reset('initial');
84474
84475                 var msec = transitionTime(tulipRoadStart, context.map().center());
84476                 if (msec) { reveal(null, null, { duration: 0 }); }
84477                 context.map().centerZoomEase(tulipRoadStart, 18.5, msec);
84478
84479                 timeout(function() {
84480                     var tooltip = reveal('button.add-line',
84481                         t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
84482
84483                     tooltip.selectAll('.tooltip-inner')
84484                         .insert('svg', 'span')
84485                         .attr('class', 'tooltip-illustration')
84486                         .append('use')
84487                         .attr('xlink:href', '#iD-graphic-lines');
84488
84489                     context.on('enter.intro', function(mode) {
84490                         if (mode.id !== 'add-line') return;
84491                         continueTo(startLine);
84492                     });
84493                 }, msec + 100);
84494
84495                 function continueTo(nextStep) {
84496                     context.on('enter.intro', null);
84497                     nextStep();
84498                 }
84499             }
84500
84501
84502             function startLine() {
84503                 if (context.mode().id !== 'add-line') return chapter.restart();
84504
84505                 _tulipRoadID = null;
84506
84507                 var padding = 70 * Math.pow(2, context.map().zoom() - 18);
84508                 var box = pad$2(tulipRoadStart, padding, context);
84509                 box.height = box.height + 100;
84510                 reveal(box, t('intro.lines.start_line'));
84511
84512                 context.map().on('move.intro drawn.intro', function() {
84513                     padding = 70 * Math.pow(2, context.map().zoom() - 18);
84514                     box = pad$2(tulipRoadStart, padding, context);
84515                     box.height = box.height + 100;
84516                     reveal(box, t('intro.lines.start_line'), { duration: 0 });
84517                 });
84518
84519                 context.on('enter.intro', function(mode) {
84520                     if (mode.id !== 'draw-line') return chapter.restart();
84521                     continueTo(drawLine);
84522                 });
84523
84524                 function continueTo(nextStep) {
84525                     context.map().on('move.intro drawn.intro', null);
84526                     context.on('enter.intro', null);
84527                     nextStep();
84528                 }
84529             }
84530
84531
84532             function drawLine() {
84533                 if (context.mode().id !== 'draw-line') return chapter.restart();
84534
84535                 _tulipRoadID = context.mode().selectedIDs()[0];
84536                 context.map().centerEase(tulipRoadMidpoint, 500);
84537
84538                 timeout(function() {
84539                     var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84540                     var box = pad$2(tulipRoadMidpoint, padding, context);
84541                     box.height = box.height * 2;
84542                     reveal(box,
84543                         t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
84544                     );
84545
84546                     context.map().on('move.intro drawn.intro', function() {
84547                         padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
84548                         box = pad$2(tulipRoadMidpoint, padding, context);
84549                         box.height = box.height * 2;
84550                         reveal(box,
84551                             t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
84552                             { duration: 0 }
84553                         );
84554                     });
84555                 }, 550);  // after easing..
84556
84557                 context.history().on('change.intro', function() {
84558                     if (isLineConnected()) {
84559                         continueTo(continueLine);
84560                     }
84561                 });
84562
84563                 context.on('enter.intro', function(mode) {
84564                     if (mode.id === 'draw-line') {
84565                         return;
84566                     } else if (mode.id === 'select') {
84567                         continueTo(retryIntersect);
84568                         return;
84569                     } else {
84570                         return chapter.restart();
84571                     }
84572                 });
84573
84574                 function continueTo(nextStep) {
84575                     context.map().on('move.intro drawn.intro', null);
84576                     context.history().on('change.intro', null);
84577                     context.on('enter.intro', null);
84578                     nextStep();
84579                 }
84580             }
84581
84582
84583             function isLineConnected() {
84584                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84585                 if (!entity) return false;
84586
84587                 var drawNodes = context.graph().childNodes(entity);
84588                 return drawNodes.some(function(node) {
84589                     return context.graph().parentWays(node).some(function(parent) {
84590                         return parent.id === flowerRoadID;
84591                     });
84592                 });
84593             }
84594
84595
84596             function retryIntersect() {
84597                 d3_select(window).on('mousedown.intro', eventCancel, true);
84598
84599                 var box = pad$2(tulipRoadIntersection, 80, context);
84600                 reveal(box,
84601                     t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
84602                 );
84603
84604                 timeout(chapter.restart, 3000);
84605             }
84606
84607
84608             function continueLine() {
84609                 if (context.mode().id !== 'draw-line') return chapter.restart();
84610                 var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
84611                 if (!entity) return chapter.restart();
84612
84613                 context.map().centerEase(tulipRoadIntersection, 500);
84614
84615                 reveal('#surface', t('intro.lines.continue_line'));
84616
84617                 context.on('enter.intro', function(mode) {
84618                     if (mode.id === 'draw-line')
84619                         return;
84620                     else if (mode.id === 'select')
84621                         return continueTo(chooseCategoryRoad);
84622                     else
84623                         return chapter.restart();
84624                 });
84625
84626                 function continueTo(nextStep) {
84627                     context.on('enter.intro', null);
84628                     nextStep();
84629                 }
84630             }
84631
84632
84633             function chooseCategoryRoad() {
84634                 if (context.mode().id !== 'select') return chapter.restart();
84635
84636                 context.on('exit.intro', function() {
84637                     return chapter.restart();
84638                 });
84639
84640                 var button = d3_select('.preset-category-road_minor .preset-list-button');
84641                 if (button.empty()) return chapter.restart();
84642
84643                 // disallow scrolling
84644                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84645
84646                 timeout(function() {
84647                     // reset pane, in case user somehow happened to change it..
84648                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
84649
84650                     reveal(button.node(),
84651                         t('intro.lines.choose_category_road', { category: roadCategory.name() })
84652                     );
84653
84654                     button.on('click.intro', function() {
84655                         continueTo(choosePresetResidential);
84656                     });
84657
84658                 }, 400);  // after editor pane visible
84659
84660                 function continueTo(nextStep) {
84661                     d3_select('.inspector-wrap').on('wheel.intro', null);
84662                     d3_select('.preset-list-button').on('click.intro', null);
84663                     context.on('exit.intro', null);
84664                     nextStep();
84665                 }
84666             }
84667
84668
84669             function choosePresetResidential() {
84670                 if (context.mode().id !== 'select') return chapter.restart();
84671
84672                 context.on('exit.intro', function() {
84673                     return chapter.restart();
84674                 });
84675
84676                 var subgrid = d3_select('.preset-category-road_minor .subgrid');
84677                 if (subgrid.empty()) return chapter.restart();
84678
84679                 subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
84680                     .on('click.intro', function() {
84681                         continueTo(retryPresetResidential);
84682                     });
84683
84684                 subgrid.selectAll('.preset-highway-residential .preset-list-button')
84685                     .on('click.intro', function() {
84686                         continueTo(nameRoad);
84687                     });
84688
84689                 timeout(function() {
84690                     reveal(subgrid.node(),
84691                         t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
84692                         { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
84693                     );
84694                 }, 300);
84695
84696                 function continueTo(nextStep) {
84697                     d3_select('.preset-list-button').on('click.intro', null);
84698                     context.on('exit.intro', null);
84699                     nextStep();
84700                 }
84701             }
84702
84703
84704             // selected wrong road type
84705             function retryPresetResidential() {
84706                 if (context.mode().id !== 'select') return chapter.restart();
84707
84708                 context.on('exit.intro', function() {
84709                     return chapter.restart();
84710                 });
84711
84712                 // disallow scrolling
84713                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
84714
84715                 timeout(function() {
84716                     var button = d3_select('.entity-editor-pane .preset-list-button');
84717
84718                     reveal(button.node(),
84719                         t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
84720                     );
84721
84722                     button.on('click.intro', function() {
84723                         continueTo(chooseCategoryRoad);
84724                     });
84725
84726                 }, 500);
84727
84728                 function continueTo(nextStep) {
84729                     d3_select('.inspector-wrap').on('wheel.intro', null);
84730                     d3_select('.preset-list-button').on('click.intro', null);
84731                     context.on('exit.intro', null);
84732                     nextStep();
84733                 }
84734             }
84735
84736
84737             function nameRoad() {
84738                 context.on('exit.intro', function() {
84739                     continueTo(didNameRoad);
84740                 });
84741
84742                 timeout(function() {
84743                     reveal('.entity-editor-pane',
84744                         t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
84745                         { tooltipClass: 'intro-lines-name_road' }
84746                     );
84747                 }, 500);
84748
84749                 function continueTo(nextStep) {
84750                     context.on('exit.intro', null);
84751                     nextStep();
84752                 }
84753             }
84754
84755
84756             function didNameRoad() {
84757                 context.history().checkpoint('doneAddLine');
84758
84759                 timeout(function() {
84760                     reveal('#surface', t('intro.lines.did_name_road'), {
84761                         buttonText: t('intro.ok'),
84762                         buttonCallback: function() { continueTo(updateLine); }
84763                     });
84764                 }, 500);
84765
84766                 function continueTo(nextStep) {
84767                     nextStep();
84768                 }
84769             }
84770
84771
84772             function updateLine() {
84773                 context.history().reset('doneAddLine');
84774                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84775                     return chapter.restart();
84776                 }
84777
84778                 var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
84779                 if (msec) { reveal(null, null, { duration: 0 }); }
84780                 context.map().centerZoomEase(woodRoadDragMidpoint, 19, msec);
84781
84782                 timeout(function() {
84783                     var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84784                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84785                     var advance = function() { continueTo(addNode); };
84786
84787                     reveal(box, t('intro.lines.update_line'),
84788                         { buttonText: t('intro.ok'), buttonCallback: advance }
84789                     );
84790
84791                     context.map().on('move.intro drawn.intro', function() {
84792                         var padding = 250 * Math.pow(2, context.map().zoom() - 19);
84793                         var box = pad$2(woodRoadDragMidpoint, padding, context);
84794                         reveal(box, t('intro.lines.update_line'),
84795                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84796                         );
84797                     });
84798                 }, msec + 100);
84799
84800                 function continueTo(nextStep) {
84801                     context.map().on('move.intro drawn.intro', null);
84802                     nextStep();
84803                 }
84804             }
84805
84806
84807             function addNode() {
84808                 context.history().reset('doneAddLine');
84809                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84810                     return chapter.restart();
84811                 }
84812
84813                 var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84814                 var box = pad$2(woodRoadAddNode, padding, context);
84815                 reveal(box, t('intro.lines.add_node'));
84816
84817                 context.map().on('move.intro drawn.intro', function() {
84818                     var padding = 40 * Math.pow(2, context.map().zoom() - 19);
84819                     var box = pad$2(woodRoadAddNode, padding, context);
84820                     reveal(box, t('intro.lines.add_node'), { duration: 0 });
84821                 });
84822
84823                 context.history().on('change.intro', function(changed) {
84824                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84825                         return continueTo(updateLine);
84826                     }
84827                     if (changed.created().length === 1) {
84828                         timeout(function() { continueTo(startDragEndpoint); }, 500);
84829                     }
84830                 });
84831
84832                 context.on('enter.intro', function(mode) {
84833                     if (mode.id !== 'select') {
84834                         continueTo(updateLine);
84835                     }
84836                 });
84837
84838                 function continueTo(nextStep) {
84839                     context.map().on('move.intro drawn.intro', null);
84840                     context.history().on('change.intro', null);
84841                     context.on('enter.intro', null);
84842                     nextStep();
84843                 }
84844             }
84845
84846
84847             function startDragEndpoint() {
84848                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84849                     return continueTo(updateLine);
84850                 }
84851                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84852                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84853                 reveal(box, t('intro.lines.start_drag_endpoint'));
84854
84855                 context.map().on('move.intro drawn.intro', function() {
84856                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84857                         return continueTo(updateLine);
84858                     }
84859                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84860                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84861                     reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
84862
84863                     var entity = context.entity(woodRoadEndID);
84864                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
84865                         continueTo(finishDragEndpoint);
84866                     }
84867                 });
84868
84869                 function continueTo(nextStep) {
84870                     context.map().on('move.intro drawn.intro', null);
84871                     nextStep();
84872                 }
84873             }
84874
84875
84876             function finishDragEndpoint() {
84877                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84878                     return continueTo(updateLine);
84879                 }
84880
84881                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84882                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84883                 reveal(box, t('intro.lines.finish_drag_endpoint'));
84884
84885                 context.map().on('move.intro drawn.intro', function() {
84886                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84887                         return continueTo(updateLine);
84888                     }
84889                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84890                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84891                     reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
84892
84893                     var entity = context.entity(woodRoadEndID);
84894                     if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
84895                         continueTo(startDragEndpoint);
84896                     }
84897                 });
84898
84899                 context.on('enter.intro', function() {
84900                     continueTo(startDragMidpoint);
84901                 });
84902
84903                 function continueTo(nextStep) {
84904                     context.map().on('move.intro drawn.intro', null);
84905                     context.on('enter.intro', null);
84906                     nextStep();
84907                 }
84908             }
84909
84910
84911             function startDragMidpoint() {
84912                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84913                     return continueTo(updateLine);
84914                 }
84915                 if (context.selectedIDs().indexOf(woodRoadID) === -1) {
84916                     context.enter(modeSelect(context, [woodRoadID]));
84917                 }
84918
84919                 var padding = 80 * Math.pow(2, context.map().zoom() - 19);
84920                 var box = pad$2(woodRoadDragMidpoint, padding, context);
84921                 reveal(box, t('intro.lines.start_drag_midpoint'));
84922
84923                 context.map().on('move.intro drawn.intro', function() {
84924                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84925                         return continueTo(updateLine);
84926                     }
84927                     var padding = 80 * Math.pow(2, context.map().zoom() - 19);
84928                     var box = pad$2(woodRoadDragMidpoint, padding, context);
84929                     reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
84930                 });
84931
84932                 context.history().on('change.intro', function(changed) {
84933                     if (changed.created().length === 1) {
84934                         continueTo(continueDragMidpoint);
84935                     }
84936                 });
84937
84938                 context.on('enter.intro', function(mode) {
84939                     if (mode.id !== 'select') {
84940                         // keep Wood Road selected so midpoint triangles are drawn..
84941                         context.enter(modeSelect(context, [woodRoadID]));
84942                     }
84943                 });
84944
84945                 function continueTo(nextStep) {
84946                     context.map().on('move.intro drawn.intro', null);
84947                     context.history().on('change.intro', null);
84948                     context.on('enter.intro', null);
84949                     nextStep();
84950                 }
84951             }
84952
84953
84954             function continueDragMidpoint() {
84955                 if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84956                     return continueTo(updateLine);
84957                 }
84958
84959                 var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84960                 var box = pad$2(woodRoadDragEndpoint, padding, context);
84961                 box.height += 400;
84962
84963                 var advance = function() {
84964                     context.history().checkpoint('doneUpdateLine');
84965                     continueTo(deleteLines);
84966                 };
84967
84968                 reveal(box, t('intro.lines.continue_drag_midpoint'),
84969                     { buttonText: t('intro.ok'), buttonCallback: advance }
84970                 );
84971
84972                 context.map().on('move.intro drawn.intro', function() {
84973                     if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
84974                         return continueTo(updateLine);
84975                     }
84976                     var padding = 100 * Math.pow(2, context.map().zoom() - 19);
84977                     var box = pad$2(woodRoadDragEndpoint, padding, context);
84978                     box.height += 400;
84979                     reveal(box, t('intro.lines.continue_drag_midpoint'),
84980                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
84981                     );
84982                 });
84983
84984                 function continueTo(nextStep) {
84985                     context.map().on('move.intro drawn.intro', null);
84986                     nextStep();
84987                 }
84988             }
84989
84990
84991             function deleteLines() {
84992                 context.history().reset('doneUpdateLine');
84993                 context.enter(modeBrowse(context));
84994
84995                 if (!context.hasEntity(washingtonStreetID) ||
84996                     !context.hasEntity(twelfthAvenueID) ||
84997                     !context.hasEntity(eleventhAvenueEndID)) {
84998                     return chapter.restart();
84999                 }
85000
85001                 var msec = transitionTime(deleteLinesLoc, context.map().center());
85002                 if (msec) { reveal(null, null, { duration: 0 }); }
85003                 context.map().centerZoomEase(deleteLinesLoc, 18, msec);
85004
85005                 timeout(function() {
85006                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85007                     var box = pad$2(deleteLinesLoc, padding, context);
85008                     box.top -= 200;
85009                     box.height += 400;
85010                     var advance = function() { continueTo(rightClickIntersection); };
85011
85012                     reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85013                         { buttonText: t('intro.ok'), buttonCallback: advance }
85014                     );
85015
85016                     context.map().on('move.intro drawn.intro', function() {
85017                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85018                         var box = pad$2(deleteLinesLoc, padding, context);
85019                         box.top -= 200;
85020                         box.height += 400;
85021                         reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
85022                             { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85023                         );
85024                     });
85025
85026                     context.history().on('change.intro', function() {
85027                         timeout(function() {
85028                             continueTo(deleteLines);
85029                         }, 500);  // after any transition (e.g. if user deleted intersection)
85030                     });
85031
85032                 }, msec + 100);
85033
85034                 function continueTo(nextStep) {
85035                     context.map().on('move.intro drawn.intro', null);
85036                     context.history().on('change.intro', null);
85037                     nextStep();
85038                 }
85039             }
85040
85041
85042             function rightClickIntersection() {
85043                 context.history().reset('doneUpdateLine');
85044                 context.enter(modeBrowse(context));
85045
85046                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85047
85048                 timeout(function() {
85049                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85050                     var box = pad$2(eleventhAvenueEnd, padding, context);
85051                     reveal(box, t('intro.lines.rightclick_intersection',
85052                         { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
85053                     );
85054
85055                     context.map().on('move.intro drawn.intro', function() {
85056                         var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85057                         var box = pad$2(eleventhAvenueEnd, padding, context);
85058                         reveal(box, t('intro.lines.rightclick_intersection',
85059                             { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
85060                             { duration: 0 }
85061                         );
85062                     });
85063
85064                     context.on('enter.intro', function(mode) {
85065                         if (mode.id !== 'select') return;
85066                         var ids = context.selectedIDs();
85067                         if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
85068
85069                         timeout(function() {
85070                             var node = selectMenuItem('split').node();
85071                             if (!node) return;
85072                             continueTo(splitIntersection);
85073                         }, 300);  // after menu visible
85074                     });
85075
85076                     context.history().on('change.intro', function() {
85077                         timeout(function() {
85078                             continueTo(deleteLines);
85079                         }, 300);  // after any transition (e.g. if user deleted intersection)
85080                     });
85081
85082                 }, 600);
85083
85084                 function continueTo(nextStep) {
85085                     context.map().on('move.intro drawn.intro', null);
85086                     context.on('enter.intro', null);
85087                     context.history().on('change.intro', null);
85088                     nextStep();
85089                 }
85090             }
85091
85092
85093             function splitIntersection() {
85094                 if (!context.hasEntity(washingtonStreetID) ||
85095                     !context.hasEntity(twelfthAvenueID) ||
85096                     !context.hasEntity(eleventhAvenueEndID)) {
85097                     return continueTo(deleteLines);
85098                 }
85099
85100                 var node = selectMenuItem('split').node();
85101                 if (!node) { return continueTo(rightClickIntersection); }
85102
85103                 var wasChanged = false;
85104                 var menuCoords = context.map().mouseCoordinates();
85105                 _washingtonSegmentID = null;
85106
85107                 revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85108                     { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
85109                 );
85110
85111                 context.map().on('move.intro drawn.intro', function() {
85112                     var node = selectMenuItem('split').node();
85113                     if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
85114
85115                     revealEditMenu(menuCoords, t('intro.lines.split_intersection',
85116                         { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
85117                         { duration: 0 }
85118                     );
85119                 });
85120
85121                 context.history().on('change.intro', function(changed) {
85122                     wasChanged = true;
85123                     timeout(function() {
85124                         if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
85125                             _washingtonSegmentID = changed.created()[0].id;
85126                             continueTo(didSplit);
85127                         } else {
85128                             _washingtonSegmentID = null;
85129                             continueTo(retrySplit);
85130                         }
85131                     }, 300);  // after any transition (e.g. if user deleted intersection)
85132                 });
85133
85134                 function continueTo(nextStep) {
85135                     context.map().on('move.intro drawn.intro', null);
85136                     context.history().on('change.intro', null);
85137                     nextStep();
85138                 }
85139             }
85140
85141
85142             function retrySplit() {
85143                 context.enter(modeBrowse(context));
85144                 context.map().centerZoomEase(eleventhAvenueEnd, 18, 500);
85145                 var advance = function() { continueTo(rightClickIntersection); };
85146
85147                 var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85148                 var box = pad$2(eleventhAvenueEnd, padding, context);
85149                 reveal(box, t('intro.lines.retry_split'),
85150                     { buttonText: t('intro.ok'), buttonCallback: advance }
85151                 );
85152
85153                 context.map().on('move.intro drawn.intro', function() {
85154                     var padding = 60 * Math.pow(2, context.map().zoom() - 18);
85155                     var box = pad$2(eleventhAvenueEnd, padding, context);
85156                     reveal(box, t('intro.lines.retry_split'),
85157                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
85158                     );
85159                 });
85160
85161                 function continueTo(nextStep) {
85162                     context.map().on('move.intro drawn.intro', null);
85163                     nextStep();
85164                 }
85165             }
85166
85167
85168             function didSplit() {
85169                 if (!_washingtonSegmentID ||
85170                     !context.hasEntity(_washingtonSegmentID) ||
85171                     !context.hasEntity(washingtonStreetID) ||
85172                     !context.hasEntity(twelfthAvenueID) ||
85173                     !context.hasEntity(eleventhAvenueEndID)) {
85174                     return continueTo(rightClickIntersection);
85175                 }
85176
85177                 var ids = context.selectedIDs();
85178                 var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
85179                 var street = t('intro.graph.name.washington-street');
85180
85181                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85182                 var box = pad$2(twelfthAvenue, padding, context);
85183                 box.width = box.width / 2;
85184                 reveal(box, t(string, { street1: street, street2: street }),
85185                     { duration: 500 }
85186                 );
85187
85188                 timeout(function() {
85189                     context.map().centerZoomEase(twelfthAvenue, 18, 500);
85190
85191                     context.map().on('move.intro drawn.intro', function() {
85192                         var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85193                         var box = pad$2(twelfthAvenue, padding, context);
85194                         box.width = box.width / 2;
85195                         reveal(box, t(string, { street1: street, street2: street }),
85196                             { duration: 0 }
85197                         );
85198                     });
85199                 }, 600);  // after initial reveal and curtain cut
85200
85201                 context.on('enter.intro', function() {
85202                     var ids = context.selectedIDs();
85203                     if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
85204                         continueTo(multiSelect);
85205                     }
85206                 });
85207
85208                 context.history().on('change.intro', function() {
85209                     if (!_washingtonSegmentID ||
85210                         !context.hasEntity(_washingtonSegmentID) ||
85211                         !context.hasEntity(washingtonStreetID) ||
85212                         !context.hasEntity(twelfthAvenueID) ||
85213                         !context.hasEntity(eleventhAvenueEndID)) {
85214                         return continueTo(rightClickIntersection);
85215                     }
85216                 });
85217
85218                 function continueTo(nextStep) {
85219                     context.map().on('move.intro drawn.intro', null);
85220                     context.on('enter.intro', null);
85221                     context.history().on('change.intro', null);
85222                     nextStep();
85223                 }
85224             }
85225
85226
85227             function multiSelect() {
85228                 if (!_washingtonSegmentID ||
85229                     !context.hasEntity(_washingtonSegmentID) ||
85230                     !context.hasEntity(washingtonStreetID) ||
85231                     !context.hasEntity(twelfthAvenueID) ||
85232                     !context.hasEntity(eleventhAvenueEndID)) {
85233                     return continueTo(rightClickIntersection);
85234                 }
85235
85236                 var ids = context.selectedIDs();
85237                 var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
85238                 var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
85239
85240                 if (hasWashington && hasTwelfth) {
85241                     return continueTo(multiRightClick);
85242                 } else if (!hasWashington && !hasTwelfth) {
85243                     return continueTo(didSplit);
85244                 }
85245
85246                 context.map().centerZoomEase(twelfthAvenue, 18, 500);
85247
85248                 timeout(function() {
85249                     var selected, other, padding, box;
85250                     if (hasWashington) {
85251                         selected = t('intro.graph.name.washington-street');
85252                         other = t('intro.graph.name.12th-avenue');
85253                         padding = 60 * Math.pow(2, context.map().zoom() - 18);
85254                         box = pad$2(twelfthAvenueEnd, padding, context);
85255                         box.width *= 3;
85256                     } else {
85257                         selected = t('intro.graph.name.12th-avenue');
85258                         other = t('intro.graph.name.washington-street');
85259                         padding = 200 * Math.pow(2, context.map().zoom() - 18);
85260                         box = pad$2(twelfthAvenue, padding, context);
85261                         box.width /= 2;
85262                     }
85263
85264                     reveal(box,
85265                         t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
85266                     );
85267
85268                     context.map().on('move.intro drawn.intro', function() {
85269                         if (hasWashington) {
85270                             selected = t('intro.graph.name.washington-street');
85271                             other = t('intro.graph.name.12th-avenue');
85272                             padding = 60 * Math.pow(2, context.map().zoom() - 18);
85273                             box = pad$2(twelfthAvenueEnd, padding, context);
85274                             box.width *= 3;
85275                         } else {
85276                             selected = t('intro.graph.name.12th-avenue');
85277                             other = t('intro.graph.name.washington-street');
85278                             padding = 200 * Math.pow(2, context.map().zoom() - 18);
85279                             box = pad$2(twelfthAvenue, padding, context);
85280                             box.width /= 2;
85281                         }
85282
85283                         reveal(box,
85284                             t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
85285                             { duration: 0 }
85286                         );
85287                     });
85288
85289                     context.on('enter.intro', function() {
85290                         continueTo(multiSelect);
85291                     });
85292
85293                     context.history().on('change.intro', function() {
85294                         if (!_washingtonSegmentID ||
85295                             !context.hasEntity(_washingtonSegmentID) ||
85296                             !context.hasEntity(washingtonStreetID) ||
85297                             !context.hasEntity(twelfthAvenueID) ||
85298                             !context.hasEntity(eleventhAvenueEndID)) {
85299                             return continueTo(rightClickIntersection);
85300                         }
85301                     });
85302                 }, 600);
85303
85304                 function continueTo(nextStep) {
85305                     context.map().on('move.intro drawn.intro', null);
85306                     context.on('enter.intro', null);
85307                     context.history().on('change.intro', null);
85308                     nextStep();
85309                 }
85310             }
85311
85312
85313             function multiRightClick() {
85314                 if (!_washingtonSegmentID ||
85315                     !context.hasEntity(_washingtonSegmentID) ||
85316                     !context.hasEntity(washingtonStreetID) ||
85317                     !context.hasEntity(twelfthAvenueID) ||
85318                     !context.hasEntity(eleventhAvenueEndID)) {
85319                     return continueTo(rightClickIntersection);
85320                 }
85321
85322                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85323                 var box = pad$2(twelfthAvenue, padding, context);
85324                 reveal(box, t('intro.lines.multi_rightclick'));
85325
85326                 context.map().on('move.intro drawn.intro', function() {
85327                     var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85328                     var box = pad$2(twelfthAvenue, padding, context);
85329                     reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
85330                 });
85331
85332                 d3_select(window).on('click.intro contextmenu.intro', function() {
85333                     timeout(function() {
85334                         var ids = context.selectedIDs();
85335                         if (ids.length === 2 &&
85336                             ids.indexOf(twelfthAvenueID) !== -1 &&
85337                             ids.indexOf(_washingtonSegmentID) !== -1) {
85338                                 var node = selectMenuItem('delete').node();
85339                                 if (!node) return;
85340                                 continueTo(multiDelete);
85341                         } else if (ids.length === 1 &&
85342                             ids.indexOf(_washingtonSegmentID) !== -1) {
85343                             return continueTo(multiSelect);
85344                         } else {
85345                             return continueTo(didSplit);
85346                         }
85347                     }, 300);  // after edit menu visible
85348                 }, true);
85349
85350                 context.history().on('change.intro', function() {
85351                     if (!_washingtonSegmentID ||
85352                         !context.hasEntity(_washingtonSegmentID) ||
85353                         !context.hasEntity(washingtonStreetID) ||
85354                         !context.hasEntity(twelfthAvenueID) ||
85355                         !context.hasEntity(eleventhAvenueEndID)) {
85356                         return continueTo(rightClickIntersection);
85357                     }
85358                 });
85359
85360                 function continueTo(nextStep) {
85361                     context.map().on('move.intro drawn.intro', null);
85362                     d3_select(window).on('click.intro contextmenu.intro', null, true);
85363                     context.history().on('change.intro', null);
85364                     nextStep();
85365                 }
85366             }
85367
85368
85369             function multiDelete() {
85370                 if (!_washingtonSegmentID ||
85371                     !context.hasEntity(_washingtonSegmentID) ||
85372                     !context.hasEntity(washingtonStreetID) ||
85373                     !context.hasEntity(twelfthAvenueID) ||
85374                     !context.hasEntity(eleventhAvenueEndID)) {
85375                     return continueTo(rightClickIntersection);
85376                 }
85377
85378                 var node = selectMenuItem('delete').node();
85379                 if (!node) return continueTo(multiRightClick);
85380
85381                 var menuCoords = context.map().mouseCoordinates();
85382                 revealEditMenu(menuCoords,
85383                     t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
85384                 );
85385
85386                 context.map().on('move.intro drawn.intro', function() {
85387                     revealEditMenu(menuCoords,
85388                         t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
85389                         { duration: 0 }
85390                     );
85391                 });
85392
85393                 context.on('exit.intro', function() {
85394                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85395                         return continueTo(multiSelect);  // left select mode but roads still exist
85396                     }
85397                 });
85398
85399                 context.history().on('change.intro', function() {
85400                     if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
85401                         continueTo(retryDelete);         // changed something but roads still exist
85402                     } else {
85403                         continueTo(play);
85404                     }
85405                 });
85406
85407                 function continueTo(nextStep) {
85408                     context.map().on('move.intro drawn.intro', null);
85409                     context.on('exit.intro', null);
85410                     context.history().on('change.intro', null);
85411                     nextStep();
85412                 }
85413             }
85414
85415
85416             function retryDelete() {
85417                 context.enter(modeBrowse(context));
85418
85419                 var padding = 200 * Math.pow(2, context.map().zoom() - 18);
85420                 var box = pad$2(twelfthAvenue, padding, context);
85421                 reveal(box, t('intro.lines.retry_delete'), {
85422                     buttonText: t('intro.ok'),
85423                     buttonCallback: function() { continueTo(multiSelect); }
85424                 });
85425
85426                 function continueTo(nextStep) {
85427                     nextStep();
85428                 }
85429             }
85430
85431
85432             function play() {
85433                 dispatch$1.call('done');
85434                 reveal('#id-container',
85435                     t('intro.lines.play', { next: t('intro.buildings.title') }), {
85436                         tooltipBox: '.intro-nav-wrap .chapter-building',
85437                         buttonText: t('intro.ok'),
85438                         buttonCallback: function() { reveal('#id-container'); }
85439                     }
85440                 );
85441            }
85442
85443
85444             chapter.enter = function() {
85445                 addLine();
85446             };
85447
85448
85449             chapter.exit = function() {
85450                 timeouts.forEach(window.clearTimeout);
85451                 d3_select(window).on('mousedown.intro', null, true);
85452                 context.on('enter.intro exit.intro', null);
85453                 context.map().on('move.intro drawn.intro', null);
85454                 context.history().on('change.intro', null);
85455                 d3_select('.inspector-wrap').on('wheel.intro', null);
85456                 d3_select('.preset-list-button').on('click.intro', null);
85457             };
85458
85459
85460             chapter.restart = function() {
85461                 chapter.exit();
85462                 chapter.enter();
85463             };
85464
85465
85466             return utilRebind(chapter, dispatch$1, 'on');
85467         }
85468
85469         function uiIntroBuilding(context, reveal) {
85470             var dispatch$1 = dispatch('done');
85471             var house = [-85.62815, 41.95638];
85472             var tank = [-85.62732, 41.95347];
85473             var buildingCatetory = context.presets().item('category-building');
85474             var housePreset = context.presets().item('building/house');
85475             var tankPreset = context.presets().item('man_made/storage_tank');
85476             var timeouts = [];
85477             var _houseID = null;
85478             var _tankID = null;
85479
85480
85481             var chapter = {
85482                 title: 'intro.buildings.title'
85483             };
85484
85485
85486             function timeout(f, t) {
85487                 timeouts.push(window.setTimeout(f, t));
85488             }
85489
85490
85491             function eventCancel() {
85492                 event.stopPropagation();
85493                 event.preventDefault();
85494             }
85495
85496
85497             function revealHouse(center, text, options) {
85498                 var padding = 160 * Math.pow(2, context.map().zoom() - 20);
85499                 var box = pad$2(center, padding, context);
85500                 reveal(box, text, options);
85501             }
85502
85503
85504             function revealTank(center, text, options) {
85505                 var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
85506                 var box = pad$2(center, padding, context);
85507                 reveal(box, text, options);
85508             }
85509
85510
85511             function revealEditMenu(loc, text, options) {
85512                 var rect = context.surfaceRect();
85513                 var point = context.curtainProjection(loc);
85514                 var pad = 40;
85515                 var width = 250 + (2 * pad);
85516                 var height = 350;
85517                 var startX = rect.left + point[0];
85518                 var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
85519                 var box = {
85520                     left: left,
85521                     top: point[1] + rect.top - 60,
85522                     width: width,
85523                     height: height
85524                 };
85525                 reveal(box, text, options);
85526             }
85527
85528
85529             function addHouse() {
85530                 context.enter(modeBrowse(context));
85531                 context.history().reset('initial');
85532                 _houseID = null;
85533
85534                 var msec = transitionTime(house, context.map().center());
85535                 if (msec) { reveal(null, null, { duration: 0 }); }
85536                 context.map().centerZoomEase(house, 19, msec);
85537
85538                 timeout(function() {
85539                     var tooltip = reveal('button.add-area',
85540                         t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
85541
85542                     tooltip.selectAll('.tooltip-inner')
85543                         .insert('svg', 'span')
85544                         .attr('class', 'tooltip-illustration')
85545                         .append('use')
85546                         .attr('xlink:href', '#iD-graphic-buildings');
85547
85548                     context.on('enter.intro', function(mode) {
85549                         if (mode.id !== 'add-area') return;
85550                         continueTo(startHouse);
85551                     });
85552                 }, msec + 100);
85553
85554                 function continueTo(nextStep) {
85555                     context.on('enter.intro', null);
85556                     nextStep();
85557                 }
85558             }
85559
85560
85561             function startHouse() {
85562                 if (context.mode().id !== 'add-area') {
85563                     return continueTo(addHouse);
85564                 }
85565
85566                 _houseID = null;
85567                 context.map().zoomEase(20, 500);
85568
85569                 timeout(function() {
85570                     revealHouse(house, t('intro.buildings.start_building'));
85571
85572                     context.map().on('move.intro drawn.intro', function() {
85573                         revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
85574                     });
85575
85576                     context.on('enter.intro', function(mode) {
85577                         if (mode.id !== 'draw-area') return chapter.restart();
85578                         continueTo(continueHouse);
85579                     });
85580
85581                 }, 550);  // after easing
85582
85583                 function continueTo(nextStep) {
85584                     context.map().on('move.intro drawn.intro', null);
85585                     context.on('enter.intro', null);
85586                     nextStep();
85587                 }
85588             }
85589
85590
85591             function continueHouse() {
85592                 if (context.mode().id !== 'draw-area') {
85593                     return continueTo(addHouse);
85594                 }
85595
85596                 _houseID = null;
85597
85598                 revealHouse(house, t('intro.buildings.continue_building'));
85599
85600                 context.map().on('move.intro drawn.intro', function() {
85601                     revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
85602                 });
85603
85604                 context.on('enter.intro', function(mode) {
85605                     if (mode.id === 'draw-area') {
85606                         return;
85607                     } else if (mode.id === 'select') {
85608                         var graph = context.graph();
85609                         var way = context.entity(context.selectedIDs()[0]);
85610                         var nodes = graph.childNodes(way);
85611                         var points = utilArrayUniq(nodes)
85612                             .map(function(n) { return context.projection(n.loc); });
85613
85614                         if (isMostlySquare(points)) {
85615                             _houseID = way.id;
85616                             return continueTo(chooseCategoryBuilding);
85617                         } else {
85618                             return continueTo(retryHouse);
85619                         }
85620
85621                     } else {
85622                         return chapter.restart();
85623                     }
85624                 });
85625
85626                 function continueTo(nextStep) {
85627                     context.map().on('move.intro drawn.intro', null);
85628                     context.on('enter.intro', null);
85629                     nextStep();
85630                 }
85631             }
85632
85633
85634             function retryHouse() {
85635                 var onClick = function() { continueTo(addHouse); };
85636
85637                 revealHouse(house, t('intro.buildings.retry_building'),
85638                     { buttonText: t('intro.ok'), buttonCallback: onClick }
85639                 );
85640
85641                 context.map().on('move.intro drawn.intro', function() {
85642                     revealHouse(house, t('intro.buildings.retry_building'),
85643                         { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
85644                     );
85645                 });
85646
85647                 function continueTo(nextStep) {
85648                     context.map().on('move.intro drawn.intro', null);
85649                     nextStep();
85650                 }
85651             }
85652
85653
85654             function chooseCategoryBuilding() {
85655                 if (!_houseID || !context.hasEntity(_houseID)) {
85656                     return addHouse();
85657                 }
85658                 var ids = context.selectedIDs();
85659                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85660                     context.enter(modeSelect(context, [_houseID]));
85661                 }
85662
85663                 // disallow scrolling
85664                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85665
85666                 timeout(function() {
85667                     // reset pane, in case user somehow happened to change it..
85668                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85669
85670                     var button = d3_select('.preset-category-building .preset-list-button');
85671
85672                     reveal(button.node(),
85673                         t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
85674                     );
85675
85676                     button.on('click.intro', function() {
85677                         button.on('click.intro', null);
85678                         continueTo(choosePresetHouse);
85679                     });
85680
85681                 }, 400);  // after preset list pane visible..
85682
85683
85684                 context.on('enter.intro', function(mode) {
85685                     if (!_houseID || !context.hasEntity(_houseID)) {
85686                         return continueTo(addHouse);
85687                     }
85688                     var ids = context.selectedIDs();
85689                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85690                         return continueTo(chooseCategoryBuilding);
85691                     }
85692                 });
85693
85694                 function continueTo(nextStep) {
85695                     d3_select('.inspector-wrap').on('wheel.intro', null);
85696                     d3_select('.preset-list-button').on('click.intro', null);
85697                     context.on('enter.intro', null);
85698                     nextStep();
85699                 }
85700             }
85701
85702
85703             function choosePresetHouse() {
85704                 if (!_houseID || !context.hasEntity(_houseID)) {
85705                     return addHouse();
85706                 }
85707                 var ids = context.selectedIDs();
85708                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85709                     context.enter(modeSelect(context, [_houseID]));
85710                 }
85711
85712                 // disallow scrolling
85713                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
85714
85715                 timeout(function() {
85716                     // reset pane, in case user somehow happened to change it..
85717                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
85718
85719                     var button = d3_select('.preset-building-house .preset-list-button');
85720
85721                     reveal(button.node(),
85722                         t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
85723                         { duration: 300 }
85724                     );
85725
85726                     button.on('click.intro', function() {
85727                         button.on('click.intro', null);
85728                         continueTo(closeEditorHouse);
85729                     });
85730
85731                 }, 400);  // after preset list pane visible..
85732
85733                 context.on('enter.intro', function(mode) {
85734                     if (!_houseID || !context.hasEntity(_houseID)) {
85735                         return continueTo(addHouse);
85736                     }
85737                     var ids = context.selectedIDs();
85738                     if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
85739                         return continueTo(chooseCategoryBuilding);
85740                     }
85741                 });
85742
85743                 function continueTo(nextStep) {
85744                     d3_select('.inspector-wrap').on('wheel.intro', null);
85745                     d3_select('.preset-list-button').on('click.intro', null);
85746                     context.on('enter.intro', null);
85747                     nextStep();
85748                 }
85749             }
85750
85751
85752             function closeEditorHouse() {
85753                 if (!_houseID || !context.hasEntity(_houseID)) {
85754                     return addHouse();
85755                 }
85756                 var ids = context.selectedIDs();
85757                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
85758                     context.enter(modeSelect(context, [_houseID]));
85759                 }
85760
85761                 context.history().checkpoint('hasHouse');
85762
85763                 context.on('exit.intro', function() {
85764                     continueTo(rightClickHouse);
85765                 });
85766
85767                 timeout(function() {
85768                     reveal('.entity-editor-pane',
85769                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
85770                     );
85771                 }, 500);
85772
85773                 function continueTo(nextStep) {
85774                     context.on('exit.intro', null);
85775                     nextStep();
85776                 }
85777             }
85778
85779
85780             function rightClickHouse() {
85781                 if (!_houseID) return chapter.restart();
85782
85783                 context.enter(modeBrowse(context));
85784                 context.history().reset('hasHouse');
85785                 var zoom = context.map().zoom();
85786                 if (zoom < 20) {
85787                     zoom = 20;
85788                 }
85789                 context.map().centerZoomEase(house, zoom, 500);
85790
85791                 context.on('enter.intro', function(mode) {
85792                     if (mode.id !== 'select') return;
85793                     var ids = context.selectedIDs();
85794                     if (ids.length !== 1 || ids[0] !== _houseID) return;
85795
85796                     timeout(function() {
85797                         var node = selectMenuItem('orthogonalize').node();
85798                         if (!node) return;
85799                         continueTo(clickSquare);
85800                     }, 300);  // after menu visible
85801                 });
85802
85803                 context.map().on('move.intro drawn.intro', function() {
85804                     revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
85805                 });
85806
85807                 context.history().on('change.intro', function() {
85808                     continueTo(rightClickHouse);
85809                 });
85810
85811                 function continueTo(nextStep) {
85812                     context.on('enter.intro', null);
85813                     context.map().on('move.intro drawn.intro', null);
85814                     context.history().on('change.intro', null);
85815                     nextStep();
85816                 }
85817             }
85818
85819
85820             function clickSquare() {
85821                 if (!_houseID) return chapter.restart();
85822                 var entity = context.hasEntity(_houseID);
85823                 if (!entity) return continueTo(rightClickHouse);
85824
85825                 var node = selectMenuItem('orthogonalize').node();
85826                 if (!node) { return continueTo(rightClickHouse); }
85827
85828                 var wasChanged = false;
85829                 var menuCoords = context.map().mouseCoordinates();
85830
85831                 revealEditMenu(menuCoords,
85832                     t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
85833                 );
85834
85835                 context.on('enter.intro', function(mode) {
85836                     if (mode.id === 'browse') {
85837                         continueTo(rightClickHouse);
85838                     } else if (mode.id === 'move' || mode.id === 'rotate') {
85839                         continueTo(retryClickSquare);
85840                     }
85841                 });
85842
85843                 context.map().on('move.intro drawn.intro', function() {
85844                     var node = selectMenuItem('orthogonalize').node();
85845                     if (!wasChanged && !node) { return continueTo(rightClickHouse); }
85846
85847                     revealEditMenu(menuCoords,
85848                         t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
85849                         { duration: 0 }
85850                     );
85851                 });
85852
85853                 context.history().on('change.intro', function() {
85854                     wasChanged = true;
85855                     context.history().on('change.intro', null);
85856
85857                     // Something changed.  Wait for transition to complete and check undo annotation.
85858                     timeout(function() {
85859                         if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
85860                             continueTo(doneSquare);
85861                         } else {
85862                             continueTo(retryClickSquare);
85863                         }
85864                     }, 500);  // after transitioned actions
85865                 });
85866
85867                 function continueTo(nextStep) {
85868                     context.on('enter.intro', null);
85869                     context.map().on('move.intro drawn.intro', null);
85870                     context.history().on('change.intro', null);
85871                     nextStep();
85872                 }
85873             }
85874
85875
85876             function retryClickSquare() {
85877                 context.enter(modeBrowse(context));
85878
85879                 revealHouse(house, t('intro.buildings.retry_square'), {
85880                     buttonText: t('intro.ok'),
85881                     buttonCallback: function() { continueTo(rightClickHouse); }
85882                 });
85883
85884                 function continueTo(nextStep) {
85885                     nextStep();
85886                 }
85887             }
85888
85889
85890             function doneSquare() {
85891                 context.history().checkpoint('doneSquare');
85892
85893                 revealHouse(house, t('intro.buildings.done_square'), {
85894                     buttonText: t('intro.ok'),
85895                     buttonCallback: function() { continueTo(addTank); }
85896                 });
85897
85898                 function continueTo(nextStep) {
85899                     nextStep();
85900                 }
85901             }
85902
85903
85904             function addTank() {
85905                 context.enter(modeBrowse(context));
85906                 context.history().reset('doneSquare');
85907                 _tankID = null;
85908
85909                 var msec = transitionTime(tank, context.map().center());
85910                 if (msec) { reveal(null, null, { duration: 0 }); }
85911                 context.map().centerZoomEase(tank, 19.5, msec);
85912
85913                 timeout(function() {
85914                     reveal('button.add-area',
85915                         t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
85916                     );
85917
85918                     context.on('enter.intro', function(mode) {
85919                         if (mode.id !== 'add-area') return;
85920                         continueTo(startTank);
85921                     });
85922                 }, msec + 100);
85923
85924                 function continueTo(nextStep) {
85925                     context.on('enter.intro', null);
85926                     nextStep();
85927                 }
85928             }
85929
85930
85931             function startTank() {
85932                 if (context.mode().id !== 'add-area') {
85933                     return continueTo(addTank);
85934                 }
85935
85936                 _tankID = null;
85937
85938                 timeout(function() {
85939                     revealTank(tank, t('intro.buildings.start_tank'));
85940
85941                     context.map().on('move.intro drawn.intro', function() {
85942                         revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
85943                     });
85944
85945                     context.on('enter.intro', function(mode) {
85946                         if (mode.id !== 'draw-area') return chapter.restart();
85947                         continueTo(continueTank);
85948                     });
85949
85950                 }, 550);  // after easing
85951
85952                 function continueTo(nextStep) {
85953                     context.map().on('move.intro drawn.intro', null);
85954                     context.on('enter.intro', null);
85955                     nextStep();
85956                 }
85957             }
85958
85959
85960             function continueTank() {
85961                 if (context.mode().id !== 'draw-area') {
85962                     return continueTo(addTank);
85963                 }
85964
85965                 _tankID = null;
85966
85967                 revealTank(tank, t('intro.buildings.continue_tank'));
85968
85969                 context.map().on('move.intro drawn.intro', function() {
85970                     revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
85971                 });
85972
85973                 context.on('enter.intro', function(mode) {
85974                     if (mode.id === 'draw-area') {
85975                         return;
85976                     } else if (mode.id === 'select') {
85977                         _tankID = context.selectedIDs()[0];
85978                         return continueTo(searchPresetTank);
85979                     } else {
85980                         return continueTo(addTank);
85981                     }
85982                 });
85983
85984                 function continueTo(nextStep) {
85985                     context.map().on('move.intro drawn.intro', null);
85986                     context.on('enter.intro', null);
85987                     nextStep();
85988                 }
85989             }
85990
85991
85992             function searchPresetTank() {
85993                 if (!_tankID || !context.hasEntity(_tankID)) {
85994                     return addTank();
85995                 }
85996                 var ids = context.selectedIDs();
85997                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
85998                     context.enter(modeSelect(context, [_tankID]));
85999                 }
86000
86001                 // disallow scrolling
86002                 d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86003
86004                 timeout(function() {
86005                     // reset pane, in case user somehow happened to change it..
86006                     d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86007
86008                     d3_select('.preset-search-input')
86009                         .on('keydown.intro', null)
86010                         .on('keyup.intro', checkPresetSearch);
86011
86012                     reveal('.preset-search-input',
86013                         t('intro.buildings.search_tank', { preset: tankPreset.name() })
86014                     );
86015                 }, 400);  // after preset list pane visible..
86016
86017                 context.on('enter.intro', function(mode) {
86018                     if (!_tankID || !context.hasEntity(_tankID)) {
86019                         return continueTo(addTank);
86020                     }
86021
86022                     var ids = context.selectedIDs();
86023                     if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
86024                         // keep the user's area selected..
86025                         context.enter(modeSelect(context, [_tankID]));
86026
86027                         // reset pane, in case user somehow happened to change it..
86028                         d3_select('.inspector-wrap .panewrap').style('right', '-100%');
86029                         // disallow scrolling
86030                         d3_select('.inspector-wrap').on('wheel.intro', eventCancel);
86031
86032                         d3_select('.preset-search-input')
86033                             .on('keydown.intro', null)
86034                             .on('keyup.intro', checkPresetSearch);
86035
86036                         reveal('.preset-search-input',
86037                             t('intro.buildings.search_tank', { preset: tankPreset.name() })
86038                         );
86039
86040                         context.history().on('change.intro', null);
86041                     }
86042                 });
86043
86044                 function checkPresetSearch() {
86045                     var first = d3_select('.preset-list-item:first-child');
86046
86047                     if (first.classed('preset-man_made-storage_tank')) {
86048                         reveal(first.select('.preset-list-button').node(),
86049                             t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
86050                             { duration: 300 }
86051                         );
86052
86053                         d3_select('.preset-search-input')
86054                             .on('keydown.intro', eventCancel, true)
86055                             .on('keyup.intro', null);
86056
86057                         context.history().on('change.intro', function() {
86058                             continueTo(closeEditorTank);
86059                         });
86060                     }
86061                 }
86062
86063                 function continueTo(nextStep) {
86064                     d3_select('.inspector-wrap').on('wheel.intro', null);
86065                     context.on('enter.intro', null);
86066                     context.history().on('change.intro', null);
86067                     d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86068                     nextStep();
86069                 }
86070             }
86071
86072
86073             function closeEditorTank() {
86074                 if (!_tankID || !context.hasEntity(_tankID)) {
86075                     return addTank();
86076                 }
86077                 var ids = context.selectedIDs();
86078                 if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
86079                     context.enter(modeSelect(context, [_tankID]));
86080                 }
86081
86082                 context.history().checkpoint('hasTank');
86083
86084                 context.on('exit.intro', function() {
86085                     continueTo(rightClickTank);
86086                 });
86087
86088                 timeout(function() {
86089                     reveal('.entity-editor-pane',
86090                         t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
86091                     );
86092                 }, 500);
86093
86094                 function continueTo(nextStep) {
86095                     context.on('exit.intro', null);
86096                     nextStep();
86097                 }
86098             }
86099
86100
86101             function rightClickTank() {
86102                 if (!_tankID) return continueTo(addTank);
86103
86104                 context.enter(modeBrowse(context));
86105                 context.history().reset('hasTank');
86106                 context.map().centerEase(tank, 500);
86107
86108                 timeout(function() {
86109                     context.on('enter.intro', function(mode) {
86110                         if (mode.id !== 'select') return;
86111                         var ids = context.selectedIDs();
86112                         if (ids.length !== 1 || ids[0] !== _tankID) return;
86113
86114                         timeout(function() {
86115                             var node = selectMenuItem('circularize').node();
86116                             if (!node) return;
86117                             continueTo(clickCircle);
86118                         }, 300);  // after menu visible
86119                     });
86120
86121                     revealTank(tank, t('intro.buildings.rightclick_tank'));
86122
86123                     context.map().on('move.intro drawn.intro', function() {
86124                         revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
86125                     });
86126
86127                     context.history().on('change.intro', function() {
86128                         continueTo(rightClickTank);
86129                     });
86130
86131                 }, 600);
86132
86133                 function continueTo(nextStep) {
86134                     context.on('enter.intro', null);
86135                     context.map().on('move.intro drawn.intro', null);
86136                     context.history().on('change.intro', null);
86137                     nextStep();
86138                 }
86139             }
86140
86141
86142             function clickCircle() {
86143                 if (!_tankID) return chapter.restart();
86144                 var entity = context.hasEntity(_tankID);
86145                 if (!entity) return continueTo(rightClickTank);
86146
86147                 var node = selectMenuItem('circularize').node();
86148                 if (!node) { return continueTo(rightClickTank); }
86149
86150                 var wasChanged = false;
86151                 var menuCoords = context.map().mouseCoordinates();
86152
86153                 revealEditMenu(menuCoords,
86154                     t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
86155                 );
86156
86157                 context.on('enter.intro', function(mode) {
86158                     if (mode.id === 'browse') {
86159                         continueTo(rightClickTank);
86160                     } else if (mode.id === 'move' || mode.id === 'rotate') {
86161                         continueTo(retryClickCircle);
86162                     }
86163                 });
86164
86165                 context.map().on('move.intro drawn.intro', function() {
86166                     var node = selectMenuItem('circularize').node();
86167                     if (!wasChanged && !node) { return continueTo(rightClickTank); }
86168
86169                     revealEditMenu(menuCoords,
86170                         t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
86171                         { duration: 0 }
86172                     );
86173                 });
86174
86175                 context.history().on('change.intro', function() {
86176                     wasChanged = true;
86177                     context.history().on('change.intro', null);
86178
86179                     // Something changed.  Wait for transition to complete and check undo annotation.
86180                     timeout(function() {
86181                         if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
86182                             continueTo(play);
86183                         } else {
86184                             continueTo(retryClickCircle);
86185                         }
86186                     }, 500);  // after transitioned actions
86187                 });
86188
86189                 function continueTo(nextStep) {
86190                     context.on('enter.intro', null);
86191                     context.map().on('move.intro drawn.intro', null);
86192                     context.history().on('change.intro', null);
86193                     nextStep();
86194                 }
86195             }
86196
86197
86198             function retryClickCircle() {
86199                 context.enter(modeBrowse(context));
86200
86201                 revealTank(tank, t('intro.buildings.retry_circle'), {
86202                     buttonText: t('intro.ok'),
86203                     buttonCallback: function() { continueTo(rightClickTank); }
86204                 });
86205
86206                 function continueTo(nextStep) {
86207                     nextStep();
86208                 }
86209             }
86210
86211
86212             function play() {
86213                 dispatch$1.call('done');
86214                 reveal('#id-container',
86215                     t('intro.buildings.play', { next: t('intro.startediting.title') }), {
86216                         tooltipBox: '.intro-nav-wrap .chapter-startEditing',
86217                         buttonText: t('intro.ok'),
86218                         buttonCallback: function() { reveal('#id-container'); }
86219                     }
86220                 );
86221             }
86222
86223
86224             chapter.enter = function() {
86225                 addHouse();
86226             };
86227
86228
86229             chapter.exit = function() {
86230                 timeouts.forEach(window.clearTimeout);
86231                 context.on('enter.intro exit.intro', null);
86232                 context.map().on('move.intro drawn.intro', null);
86233                 context.history().on('change.intro', null);
86234                 d3_select('.inspector-wrap').on('wheel.intro', null);
86235                 d3_select('.preset-search-input').on('keydown.intro keyup.intro', null);
86236                 d3_select('.more-fields .combobox-input').on('click.intro', null);
86237             };
86238
86239
86240             chapter.restart = function() {
86241                 chapter.exit();
86242                 chapter.enter();
86243             };
86244
86245
86246             return utilRebind(chapter, dispatch$1, 'on');
86247         }
86248
86249         function uiIntroStartEditing(context, reveal) {
86250             var dispatch$1 = dispatch('done', 'startEditing');
86251             var modalSelection = d3_select(null);
86252
86253
86254             var chapter = {
86255                 title: 'intro.startediting.title'
86256             };
86257
86258             function showHelp() {
86259                 reveal('.map-control.help-control',
86260                     t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
86261                         buttonText: t('intro.ok'),
86262                         buttonCallback: function() { shortcuts(); }
86263                     }
86264                 );
86265             }
86266
86267             function shortcuts() {
86268                 reveal('.map-control.help-control',
86269                     t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
86270                         buttonText: t('intro.ok'),
86271                         buttonCallback: function() { showSave(); }
86272                     }
86273                 );
86274             }
86275
86276             function showSave() {
86277                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86278                 reveal('#bar button.save',
86279                     t('intro.startediting.save'), {
86280                         buttonText: t('intro.ok'),
86281                         buttonCallback: function() { showStart(); }
86282                     }
86283                 );
86284             }
86285
86286             function showStart() {
86287                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86288
86289                 modalSelection = uiModal(context.container());
86290
86291                 modalSelection.select('.modal')
86292                     .attr('class', 'modal-splash modal col6');
86293
86294                 modalSelection.selectAll('.close').remove();
86295
86296                 var startbutton = modalSelection.select('.content')
86297                     .attr('class', 'fillL')
86298                     .append('button')
86299                         .attr('class', 'modal-section huge-modal-button')
86300                         .on('click', function() {
86301                             modalSelection.remove();
86302                         });
86303
86304                     startbutton
86305                         .append('svg')
86306                         .attr('class', 'illustration')
86307                         .append('use')
86308                         .attr('xlink:href', '#iD-logo-walkthrough');
86309
86310                     startbutton
86311                         .append('h2')
86312                         .text(t('intro.startediting.start'));
86313
86314                 dispatch$1.call('startEditing');
86315             }
86316
86317
86318             chapter.enter = function() {
86319                 showHelp();
86320             };
86321
86322
86323             chapter.exit = function() {
86324                 modalSelection.remove();
86325                 d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
86326             };
86327
86328
86329             return utilRebind(chapter, dispatch$1, 'on');
86330         }
86331
86332         var chapterUi = {
86333             welcome: uiIntroWelcome,
86334             navigation: uiIntroNavigation,
86335             point: uiIntroPoint,
86336             area: uiIntroArea,
86337             line: uiIntroLine,
86338             building: uiIntroBuilding,
86339             startEditing: uiIntroStartEditing
86340         };
86341
86342         var chapterFlow = [
86343             'welcome',
86344             'navigation',
86345             'point',
86346             'area',
86347             'line',
86348             'building',
86349             'startEditing'
86350         ];
86351
86352
86353         function uiIntro(context) {
86354             var INTRO_IMAGERY = 'EsriWorldImageryClarity';
86355             var introGraph = {};
86356             var _currChapter;
86357
86358             // create entities for intro graph and localize names
86359             for (var id in dataIntroGraph) {
86360                 introGraph[id] = osmEntity(localize(dataIntroGraph[id]));
86361             }
86362
86363
86364             function intro(selection) {
86365                 context.enter(modeBrowse(context));
86366
86367                 // Save current map state
86368                 var osm = context.connection();
86369                 var history = context.history().toJSON();
86370                 var hash = window.location.hash;
86371                 var center = context.map().center();
86372                 var zoom = context.map().zoom();
86373                 var background = context.background().baseLayerSource();
86374                 var overlays = context.background().overlayLayerSources();
86375                 var opacity = d3_selectAll('#map .layer-background').style('opacity');
86376                 var caches = osm && osm.caches();
86377                 var baseEntities = context.history().graph().base().entities;
86378                 var countryCode = services$1.geocoder.countryCode;
86379
86380                 // Show sidebar and disable the sidebar resizing button
86381                 // (this needs to be before `context.inIntro(true)`)
86382                 context.ui().sidebar.expand();
86383                 d3_selectAll('button.sidebar-toggle').classed('disabled', true);
86384
86385                 // Block saving
86386                 context.inIntro(true);
86387
86388                 // Load semi-real data used in intro
86389                 if (osm) { osm.toggle(false).reset(); }
86390                 context.history().reset();
86391                 context.history().merge(Object.values(coreGraph().load(introGraph).entities));
86392                 context.history().checkpoint('initial');
86393
86394                 // Setup imagery
86395                 var imagery = context.background().findSource(INTRO_IMAGERY);
86396                 if (imagery) {
86397                     context.background().baseLayerSource(imagery);
86398                 } else {
86399                     context.background().bing();
86400                 }
86401                 overlays.forEach(function(d) {
86402                     context.background().toggleOverlayLayer(d);
86403                 });
86404
86405                 // Setup data layers (only OSM)
86406                 var layers = context.layers();
86407                 layers.all().forEach(function(item) {
86408                     // if the layer has the function `enabled`
86409                     if (typeof item.layer.enabled === 'function') {
86410                         item.layer.enabled(item.id === 'osm');
86411                     }
86412                 });
86413
86414                 // Mock geocoder
86415                 services$1.geocoder.countryCode = function(location, callback) {
86416                     callback(null, t('intro.graph.countrycode'));
86417                 };
86418
86419
86420                 d3_selectAll('#map .layer-background').style('opacity', 1);
86421
86422                 var curtain = uiCurtain();
86423                 selection.call(curtain);
86424
86425                 // Store that the user started the walkthrough..
86426                 context.storage('walkthrough_started', 'yes');
86427
86428                 // Restore previous walkthrough progress..
86429                 var storedProgress = context.storage('walkthrough_progress') || '';
86430                 var progress = storedProgress.split(';').filter(Boolean);
86431
86432                 var chapters = chapterFlow.map(function(chapter, i) {
86433                     var s = chapterUi[chapter](context, curtain.reveal)
86434                         .on('done', function() {
86435                             context.presets().init();  // clear away "recent" presets
86436
86437                             buttons.filter(function(d) {
86438                                 return d.title === s.title;
86439                             }).classed('finished', true);
86440
86441                             if (i < chapterFlow.length - 1) {
86442                                 var next = chapterFlow[i + 1];
86443                                 d3_select('button.chapter-' + next)
86444                                     .classed('next', true);
86445                             }
86446
86447                             // Store walkthrough progress..
86448                             progress.push(chapter);
86449                             context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86450                         });
86451                     return s;
86452                 });
86453
86454                 chapters[chapters.length - 1].on('startEditing', function() {
86455                     // Store walkthrough progress..
86456                     progress.push('startEditing');
86457                     context.storage('walkthrough_progress', utilArrayUniq(progress).join(';'));
86458
86459                     // Store if walkthrough is completed..
86460                     var incomplete = utilArrayDifference(chapterFlow, progress);
86461                     if (!incomplete.length) {
86462                         context.storage('walkthrough_completed', 'yes');
86463                     }
86464
86465                     curtain.remove();
86466                     navwrap.remove();
86467                     d3_selectAll('#map .layer-background').style('opacity', opacity);
86468                     d3_selectAll('button.sidebar-toggle').classed('disabled', false);
86469                     if (osm) { osm.toggle(true).reset().caches(caches); }
86470                     context.history().reset().merge(Object.values(baseEntities));
86471                     context.background().baseLayerSource(background);
86472                     overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
86473                     if (history) { context.history().fromJSON(history, false); }
86474                     context.map().centerZoom(center, zoom);
86475                     window.location.replace(hash);
86476                     services$1.geocoder.countryCode = countryCode;
86477                     context.inIntro(false);
86478                 });
86479
86480                 var navwrap = selection
86481                     .append('div')
86482                     .attr('class', 'intro-nav-wrap fillD');
86483
86484                 navwrap
86485                     .append('svg')
86486                     .attr('class', 'intro-nav-wrap-logo')
86487                     .append('use')
86488                     .attr('xlink:href', '#iD-logo-walkthrough');
86489
86490                 var buttonwrap = navwrap
86491                     .append('div')
86492                     .attr('class', 'joined')
86493                     .selectAll('button.chapter');
86494
86495                 var buttons = buttonwrap
86496                     .data(chapters)
86497                     .enter()
86498                     .append('button')
86499                     .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
86500                     .on('click', enterChapter);
86501
86502                 buttons
86503                     .append('span')
86504                     .text(function(d) { return t(d.title); });
86505
86506                 buttons
86507                     .append('span')
86508                     .attr('class', 'status')
86509                     .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
86510
86511                 enterChapter(chapters[0]);
86512
86513
86514                 function enterChapter(newChapter) {
86515                     if (_currChapter) { _currChapter.exit(); }
86516                     context.enter(modeBrowse(context));
86517
86518                     _currChapter = newChapter;
86519                     _currChapter.enter();
86520
86521                     buttons
86522                         .classed('next', false)
86523                         .classed('active', function(d) {
86524                             return d.title === _currChapter.title;
86525                         });
86526                 }
86527             }
86528
86529
86530             return intro;
86531         }
86532
86533         function uiShortcuts(context) {
86534             var detected = utilDetect();
86535             var _activeTab = 0;
86536             var _modalSelection;
86537             var _selection = d3_select(null);
86538
86539
86540             context.keybinding()
86541                 .on([t('shortcuts.toggle.key'), '?'], function () {
86542                     if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
86543                         if (_modalSelection) {
86544                             _modalSelection.close();
86545                             _modalSelection = null;
86546                         }
86547                     } else {
86548                         _modalSelection = uiModal(_selection);
86549                         shortcutsModal(_modalSelection);
86550                     }
86551                 });
86552
86553
86554             function shortcutsModal(_modalSelection) {
86555                 _modalSelection.select('.modal')
86556                     .classed('modal-shortcuts', true);
86557
86558                 var shortcutsModal = _modalSelection.select('.content');
86559
86560                 shortcutsModal
86561                     .append('div')
86562                     .attr('class', 'modal-section')
86563                     .append('h3')
86564                     .text(t('shortcuts.title'));
86565
86566                 shortcutsModal
86567                     .call(render);
86568             }
86569
86570
86571             function render(selection) {
86572                 var wrapper = selection
86573                     .selectAll('.wrapper')
86574                     .data([0]);
86575
86576                 var wrapperEnter = wrapper
86577                     .enter()
86578                     .append('div')
86579                     .attr('class', 'wrapper modal-section');
86580
86581                 var tabsBar = wrapperEnter
86582                     .append('div')
86583                     .attr('class', 'tabs-bar');
86584
86585                 var shortcutsList = wrapperEnter
86586                     .append('div')
86587                     .attr('class', 'shortcuts-list');
86588
86589                 wrapper = wrapper.merge(wrapperEnter);
86590
86591                 var tabs = tabsBar
86592                     .selectAll('.tab')
86593                     .data(dataShortcuts);
86594
86595                 var tabsEnter = tabs
86596                     .enter()
86597                     .append('div')
86598                     .attr('class', 'tab')
86599                     .on('click', function (d, i) {
86600                         _activeTab = i;
86601                         render(selection);
86602                     });
86603
86604                 tabsEnter
86605                     .append('span')
86606                     .text(function (d) { return t(d.text); });
86607
86608                 tabs = tabs
86609                     .merge(tabsEnter);
86610
86611                 // Update
86612                 wrapper.selectAll('.tab')
86613                     .classed('active', function (d, i) {
86614                         return i === _activeTab;
86615                     });
86616
86617
86618                 var shortcuts = shortcutsList
86619                     .selectAll('.shortcut-tab')
86620                     .data(dataShortcuts);
86621
86622                 var shortcutsEnter = shortcuts
86623                     .enter()
86624                     .append('div')
86625                     .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
86626
86627                 var columnsEnter = shortcutsEnter
86628                     .selectAll('.shortcut-column')
86629                     .data(function (d) { return d.columns; })
86630                     .enter()
86631                     .append('table')
86632                     .attr('class', 'shortcut-column');
86633
86634                 var rowsEnter = columnsEnter
86635                     .selectAll('.shortcut-row')
86636                     .data(function (d) { return d.rows; })
86637                     .enter()
86638                     .append('tr')
86639                     .attr('class', 'shortcut-row');
86640
86641
86642                 var sectionRows = rowsEnter
86643                     .filter(function (d) { return !d.shortcuts; });
86644
86645                 sectionRows
86646                     .append('td');
86647
86648                 sectionRows
86649                     .append('td')
86650                     .attr('class', 'shortcut-section')
86651                     .append('h3')
86652                     .text(function (d) { return t(d.text); });
86653
86654
86655                 var shortcutRows = rowsEnter
86656                     .filter(function (d) { return d.shortcuts; });
86657
86658                 var shortcutKeys = shortcutRows
86659                     .append('td')
86660                     .attr('class', 'shortcut-keys');
86661
86662                 var modifierKeys = shortcutKeys
86663                     .filter(function (d) { return d.modifiers; });
86664
86665                 modifierKeys
86666                     .selectAll('kbd.modifier')
86667                     .data(function (d) {
86668                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86669                             return ['⌘'];
86670                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86671                             return [];
86672                         } else {
86673                             return d.modifiers;
86674                         }
86675                     })
86676                     .enter()
86677                     .each(function () {
86678                         var selection = d3_select(this);
86679
86680                         selection
86681                             .append('kbd')
86682                             .attr('class', 'modifier')
86683                             .text(function (d) { return uiCmd.display(d); });
86684
86685                         selection
86686                             .append('span')
86687                             .text('+');
86688                     });
86689
86690
86691                 shortcutKeys
86692                     .selectAll('kbd.shortcut')
86693                     .data(function (d) {
86694                         var arr = d.shortcuts;
86695                         if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
86696                             arr = ['Y'];
86697                         } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
86698                             arr = ['F11'];
86699                         }
86700
86701                         // replace translations
86702                         arr = arr.map(function(s) {
86703                             return uiCmd.display(s.indexOf('.') !== -1 ? t(s) : s);
86704                         });
86705
86706                         return utilArrayUniq(arr).map(function(s) {
86707                             return {
86708                                 shortcut: s,
86709                                 separator: d.separator,
86710                                 suffix: d.suffix
86711                             };
86712                         });
86713                     })
86714                     .enter()
86715                     .each(function (d, i, nodes) {
86716                         var selection = d3_select(this);
86717                         var click = d.shortcut.toLowerCase().match(/(.*).click/);
86718
86719                         if (click && click[1]) {   // replace "left_click", "right_click" with mouse icon
86720                             selection
86721                                 .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
86722                         } else {
86723                             selection
86724                                 .append('kbd')
86725                                 .attr('class', 'shortcut')
86726                                 .text(function (d) { return d.shortcut; });
86727                         }
86728
86729                         if (i < nodes.length - 1) {
86730                             selection
86731                                 .append('span')
86732                                 .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
86733                         } else if (i === nodes.length - 1 && d.suffix) {
86734                             selection
86735                                 .append('span')
86736                                 .text(d.suffix);
86737                         }
86738                     });
86739
86740
86741                 shortcutKeys
86742                     .filter(function(d) { return d.gesture; })
86743                     .each(function () {
86744                         var selection = d3_select(this);
86745
86746                         selection
86747                             .append('span')
86748                             .text('+');
86749
86750                         selection
86751                             .append('span')
86752                             .attr('class', 'gesture')
86753                             .text(function (d) { return t(d.gesture); });
86754                     });
86755
86756
86757                 shortcutRows
86758                     .append('td')
86759                     .attr('class', 'shortcut-desc')
86760                     .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
86761
86762
86763                 shortcuts = shortcuts
86764                     .merge(shortcutsEnter);
86765
86766                 // Update
86767                 wrapper.selectAll('.shortcut-tab')
86768                     .style('display', function (d, i) {
86769                         return i === _activeTab ? 'flex' : 'none';
86770                     });
86771             }
86772
86773
86774             return function(selection, show) {
86775                 _selection = selection;
86776                 if (show) {
86777                     _modalSelection = uiModal(selection);
86778                     shortcutsModal(_modalSelection);
86779                 }
86780             };
86781         }
86782
86783         function uiHelp(context) {
86784             var key = t('help.key');
86785
86786             var _pane = d3_select(null), _toggleButton = d3_select(null);
86787
86788             var docKeys = [
86789                 ['help', [
86790                     'welcome',
86791                     'open_data_h',
86792                     'open_data',
86793                     'before_start_h',
86794                     'before_start',
86795                     'open_source_h',
86796                     'open_source',
86797                     'open_source_help'
86798                 ]],
86799                 ['overview', [
86800                     'navigation_h',
86801                     'navigation_drag',
86802                     'navigation_zoom',
86803                     'features_h',
86804                     'features',
86805                     'nodes_ways'
86806                 ]],
86807                 ['editing', [
86808                     'select_h',
86809                     'select_left_click',
86810                     'select_right_click',
86811                     'multiselect_h',
86812                     'multiselect_shift_click',
86813                     'multiselect_lasso',
86814                     'undo_redo_h',
86815                     'undo_redo',
86816                     'save_h',
86817                     'save',
86818                     'save_validation',
86819                     'upload_h',
86820                     'upload',
86821                     'backups_h',
86822                     'backups',
86823                     'keyboard_h',
86824                     'keyboard'
86825                 ]],
86826                 ['feature_editor', [
86827                     'intro',
86828                     'definitions',
86829                     'type_h',
86830                     'type',
86831                     'type_picker',
86832                     'fields_h',
86833                     'fields_all_fields',
86834                     'fields_example',
86835                     'fields_add_field',
86836                     'tags_h',
86837                     'tags_all_tags',
86838                     'tags_resources'
86839                 ]],
86840                 ['points', [
86841                     'intro',
86842                     'add_point_h',
86843                     'add_point',
86844                     'add_point_finish',
86845                     'move_point_h',
86846                     'move_point',
86847                     'delete_point_h',
86848                     'delete_point',
86849                     'delete_point_command'
86850                 ]],
86851                 ['lines', [
86852                     'intro',
86853                     'add_line_h',
86854                     'add_line',
86855                     'add_line_draw',
86856                     'add_line_finish',
86857                     'modify_line_h',
86858                     'modify_line_dragnode',
86859                     'modify_line_addnode',
86860                     'connect_line_h',
86861                     'connect_line',
86862                     'connect_line_display',
86863                     'connect_line_drag',
86864                     'connect_line_tag',
86865                     'disconnect_line_h',
86866                     'disconnect_line_command',
86867                     'move_line_h',
86868                     'move_line_command',
86869                     'move_line_connected',
86870                     'delete_line_h',
86871                     'delete_line',
86872                     'delete_line_command'
86873                 ]],
86874                 ['areas', [
86875                     'intro',
86876                     'point_or_area_h',
86877                     'point_or_area',
86878                     'add_area_h',
86879                     'add_area_command',
86880                     'add_area_draw',
86881                     'add_area_finish',
86882                     'square_area_h',
86883                     'square_area_command',
86884                     'modify_area_h',
86885                     'modify_area_dragnode',
86886                     'modify_area_addnode',
86887                     'delete_area_h',
86888                     'delete_area',
86889                     'delete_area_command'
86890                 ]],
86891                 ['relations', [
86892                     'intro',
86893                     'edit_relation_h',
86894                     'edit_relation',
86895                     'edit_relation_add',
86896                     'edit_relation_delete',
86897                     'maintain_relation_h',
86898                     'maintain_relation',
86899                     'relation_types_h',
86900                     'multipolygon_h',
86901                     'multipolygon',
86902                     'multipolygon_create',
86903                     'multipolygon_merge',
86904                     'turn_restriction_h',
86905                     'turn_restriction',
86906                     'turn_restriction_field',
86907                     'turn_restriction_editing',
86908                     'route_h',
86909                     'route',
86910                     'route_add',
86911                     'boundary_h',
86912                     'boundary',
86913                     'boundary_add'
86914                 ]],
86915                 ['notes', [
86916                     'intro',
86917                     'add_note_h',
86918                     'add_note',
86919                     'move_note',
86920                     'update_note_h',
86921                     'update_note',
86922                     'save_note_h',
86923                     'save_note'
86924                 ]],
86925
86926                 ['imagery', [
86927                     'intro',
86928                     'sources_h',
86929                     'choosing',
86930                     'sources',
86931                     'offsets_h',
86932                     'offset',
86933                     'offset_change'
86934                 ]],
86935                 ['streetlevel', [
86936                     'intro',
86937                     'using_h',
86938                     'using',
86939                     'photos',
86940                     'viewer'
86941                 ]],
86942                 ['gps', [
86943                     'intro',
86944                     'survey',
86945                     'using_h',
86946                     'using',
86947                     'tracing',
86948                     'upload'
86949                 ]],
86950                 ['qa', [
86951                     'intro',
86952                     'tools_h',
86953                     'tools',
86954                     'issues_h',
86955                     'issues'
86956                 ]]
86957             ];
86958
86959             var headings = {
86960                 'help.help.open_data_h': 3,
86961                 'help.help.before_start_h': 3,
86962                 'help.help.open_source_h': 3,
86963                 'help.overview.navigation_h': 3,
86964                 'help.overview.features_h': 3,
86965                 'help.editing.select_h': 3,
86966                 'help.editing.multiselect_h': 3,
86967                 'help.editing.undo_redo_h': 3,
86968                 'help.editing.save_h': 3,
86969                 'help.editing.upload_h': 3,
86970                 'help.editing.backups_h': 3,
86971                 'help.editing.keyboard_h': 3,
86972                 'help.feature_editor.type_h': 3,
86973                 'help.feature_editor.fields_h': 3,
86974                 'help.feature_editor.tags_h': 3,
86975                 'help.points.add_point_h': 3,
86976                 'help.points.move_point_h': 3,
86977                 'help.points.delete_point_h': 3,
86978                 'help.lines.add_line_h': 3,
86979                 'help.lines.modify_line_h': 3,
86980                 'help.lines.connect_line_h': 3,
86981                 'help.lines.disconnect_line_h': 3,
86982                 'help.lines.move_line_h': 3,
86983                 'help.lines.delete_line_h': 3,
86984                 'help.areas.point_or_area_h': 3,
86985                 'help.areas.add_area_h': 3,
86986                 'help.areas.square_area_h': 3,
86987                 'help.areas.modify_area_h': 3,
86988                 'help.areas.delete_area_h': 3,
86989                 'help.relations.edit_relation_h': 3,
86990                 'help.relations.maintain_relation_h': 3,
86991                 'help.relations.relation_types_h': 2,
86992                 'help.relations.multipolygon_h': 3,
86993                 'help.relations.turn_restriction_h': 3,
86994                 'help.relations.route_h': 3,
86995                 'help.relations.boundary_h': 3,
86996                 'help.notes.add_note_h': 3,
86997                 'help.notes.update_note_h': 3,
86998                 'help.notes.save_note_h': 3,
86999                 'help.imagery.sources_h': 3,
87000                 'help.imagery.offsets_h': 3,
87001                 'help.streetlevel.using_h': 3,
87002                 'help.gps.using_h': 3,
87003                 'help.qa.tools_h': 3,
87004                 'help.qa.issues_h': 3
87005             };
87006
87007             var replacements = {
87008                 point: icon('#iD-icon-point', 'pre-text'),
87009                 line: icon('#iD-icon-line', 'pre-text'),
87010                 area: icon('#iD-icon-area', 'pre-text'),
87011                 note: icon('#iD-icon-note', 'pre-text add-note'),
87012                 plus: icon('#iD-icon-plus', 'pre-text'),
87013                 minus: icon('#iD-icon-minus', 'pre-text'),
87014                 orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
87015                 disconnect: icon('#iD-operation-disconnect', 'pre-text'),
87016                 layers: icon('#iD-icon-layers', 'pre-text'),
87017                 data: icon('#iD-icon-data', 'pre-text'),
87018                 inspect: icon('#iD-icon-inspect', 'pre-text'),
87019                 move: icon('#iD-operation-move', 'pre-text'),
87020                 merge: icon('#iD-operation-merge', 'pre-text'),
87021                 delete: icon('#iD-operation-delete', 'pre-text'),
87022                 close: icon('#iD-icon-close', 'pre-text'),
87023                 undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
87024                 redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
87025                 save: icon('#iD-icon-save', 'pre-text'),
87026                 leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
87027                 rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
87028                 shift: uiCmd.display('⇧'),
87029                 alt: uiCmd.display('⌥'),
87030                 return: uiCmd.display('↵'),
87031                 version: context.version
87032             };
87033
87034             // For each section, squash all the texts into a single markdown document
87035             var docs = docKeys.map(function(key) {
87036                 var helpkey = 'help.' + key[0];
87037                 var text = key[1].reduce(function(all, part) {
87038                     var subkey = helpkey + '.' + part;
87039                     var depth = headings[subkey];                              // is this subkey a heading?
87040                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
87041                     return all + hhh + t(subkey, replacements) + '\n\n';
87042                 }, '');
87043
87044                 return {
87045                     title: t(helpkey + '.title'),
87046                     html: marked(text.trim())
87047                 };
87048             });
87049
87050             var paneTooltip = tooltip()
87051                 .placement((textDirection === 'rtl') ? 'right' : 'left')
87052                 .html(true)
87053                 .title(uiTooltipHtml(t('help.title'), key));
87054
87055             function hidePane() {
87056                 context.ui().togglePanes();
87057             }
87058
87059             uiHelp.togglePane = function() {
87060                 if (event) event.preventDefault();
87061                 paneTooltip.hide(_toggleButton);
87062                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
87063             };
87064
87065             uiHelp.renderToggleButton = function(selection) {
87066
87067                 _toggleButton = selection.append('button')
87068                     .attr('tabindex', -1)
87069                     .on('click', uiHelp.togglePane)
87070                     .call(svgIcon('#iD-icon-help', 'light'))
87071                     .call(paneTooltip);
87072             };
87073
87074
87075             uiHelp.renderPane = function(selection) {
87076
87077                 function clickHelp(d, i) {
87078                     var rtl = (textDirection === 'rtl');
87079                     content.property('scrollTop', 0);
87080                     doctitle.html(d.title);
87081
87082                     body.html(d.html);
87083                     body.selectAll('a')
87084                         .attr('target', '_blank');
87085                     menuItems.classed('selected', function(m) {
87086                         return m.title === d.title;
87087                     });
87088
87089                     nav.html('');
87090                     if (rtl) {
87091                         nav.call(drawNext).call(drawPrevious);
87092                     } else {
87093                         nav.call(drawPrevious).call(drawNext);
87094                     }
87095
87096
87097                     function drawNext(selection) {
87098                         if (i < docs.length - 1) {
87099                             var nextLink = selection
87100                                 .append('a')
87101                                 .attr('class', 'next')
87102                                 .on('click', function() {
87103                                     clickHelp(docs[i + 1], i + 1);
87104                                 });
87105
87106                             nextLink
87107                                 .append('span')
87108                                 .text(docs[i + 1].title)
87109                                 .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
87110                         }
87111                     }
87112
87113
87114                     function drawPrevious(selection) {
87115                         if (i > 0) {
87116                             var prevLink = selection
87117                                 .append('a')
87118                                 .attr('class', 'previous')
87119                                 .on('click', function() {
87120                                     clickHelp(docs[i - 1], i - 1);
87121                                 });
87122
87123                             prevLink
87124                                 .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
87125                                 .append('span')
87126                                 .text(docs[i - 1].title);
87127                         }
87128                     }
87129                 }
87130
87131
87132                 function clickWalkthrough() {
87133                     if (context.inIntro()) return;
87134                     context.container().call(uiIntro(context));
87135                     context.ui().togglePanes();
87136                 }
87137
87138
87139                 function clickShortcuts() {
87140                     context.container().call(uiShortcuts(context), true);
87141                 }
87142
87143
87144                 _pane = selection.append('div')
87145                     .attr('class', 'help-wrap map-pane fillL hide')
87146                     .attr('pane', 'help');
87147
87148                 var heading = _pane
87149                     .append('div')
87150                     .attr('class', 'pane-heading');
87151
87152                 var doctitle = heading
87153                     .append('h2')
87154                     .text(t('help.title'));
87155
87156                 heading
87157                     .append('button')
87158                     .on('click', hidePane)
87159                     .call(svgIcon('#iD-icon-close'));
87160
87161
87162                 var content = _pane
87163                     .append('div')
87164                     .attr('class', 'pane-content');
87165
87166                 var toc = content
87167                     .append('ul')
87168                     .attr('class', 'toc');
87169
87170                 var menuItems = toc.selectAll('li')
87171                     .data(docs)
87172                     .enter()
87173                     .append('li')
87174                     .append('a')
87175                     .html(function(d) { return d.title; })
87176                     .on('click', clickHelp);
87177
87178                 var shortcuts = toc
87179                     .append('li')
87180                     .attr('class', 'shortcuts')
87181                     .call(tooltip()
87182                         .html(true)
87183                         .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
87184                         .placement('top')
87185                     )
87186                     .append('a')
87187                     .on('click', clickShortcuts);
87188
87189                 shortcuts
87190                     .append('div')
87191                     .text(t('shortcuts.title'));
87192
87193                 var walkthrough = toc
87194                     .append('li')
87195                     .attr('class', 'walkthrough')
87196                     .append('a')
87197                     .on('click', clickWalkthrough);
87198
87199                 walkthrough
87200                     .append('svg')
87201                     .attr('class', 'logo logo-walkthrough')
87202                     .append('use')
87203                     .attr('xlink:href', '#iD-logo-walkthrough');
87204
87205                 walkthrough
87206                     .append('div')
87207                     .text(t('splash.walkthrough'));
87208
87209
87210                 var helpContent = content
87211                     .append('div')
87212                     .attr('class', 'left-content');
87213
87214                 var body = helpContent
87215                     .append('div')
87216                     .attr('class', 'body');
87217
87218                 var nav = helpContent
87219                     .append('div')
87220                     .attr('class', 'nav');
87221
87222                 clickHelp(docs[0], 0);
87223
87224                 context.keybinding()
87225                     .on(key, uiHelp.togglePane);
87226
87227             };
87228
87229             return uiHelp;
87230         }
87231
87232         function uiPanelBackground(context) {
87233             var background = context.background();
87234             var currSourceName = null;
87235             var metadata = {};
87236             var metadataKeys = [
87237                 'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
87238             ];
87239
87240             var debouncedRedraw = debounce(redraw, 250);
87241
87242             function redraw(selection) {
87243                 var source = background.baseLayerSource();
87244                 var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
87245
87246                 if (currSourceName !== source.name()) {
87247                     currSourceName = source.name();
87248                     metadata = {};
87249                 }
87250
87251                 selection.html('');
87252
87253                 var list = selection
87254                     .append('ul')
87255                     .attr('class', 'background-info');
87256
87257                 list
87258                     .append('li')
87259                     .text(currSourceName);
87260
87261                 metadataKeys.forEach(function(k) {
87262                     // DigitalGlobe vintage is available in raster layers for now.
87263                     if (isDG && k === 'vintage') return;
87264
87265                     list
87266                         .append('li')
87267                         .attr('class', 'background-info-list-' + k)
87268                         .classed('hide', !metadata[k])
87269                         .text(t('info_panels.background.' + k) + ':')
87270                         .append('span')
87271                         .attr('class', 'background-info-span-' + k)
87272                         .text(metadata[k]);
87273                 });
87274
87275                 debouncedGetMetadata(selection);
87276
87277                 var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
87278
87279                 selection
87280                     .append('a')
87281                     .text(t('info_panels.background.' + toggleTiles))
87282                     .attr('href', '#')
87283                     .attr('class', 'button button-toggle-tiles')
87284                     .on('click', function() {
87285                         event.preventDefault();
87286                         context.setDebug('tile', !context.getDebug('tile'));
87287                         selection.call(redraw);
87288                     });
87289
87290                 if (isDG) {
87291                     var key = source.id + '-vintage';
87292                     var sourceVintage = context.background().findSource(key);
87293                     var showsVintage = context.background().showsLayer(sourceVintage);
87294                     var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
87295                     selection
87296                         .append('a')
87297                         .text(t('info_panels.background.' + toggleVintage))
87298                         .attr('href', '#')
87299                         .attr('class', 'button button-toggle-vintage')
87300                         .on('click', function() {
87301                             event.preventDefault();
87302                             context.background().toggleOverlayLayer(sourceVintage);
87303                             selection.call(redraw);
87304                         });
87305                 }
87306
87307                 // disable if necessary
87308                 ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
87309                     if (source.id !== layerId) {
87310                         var key = layerId + '-vintage';
87311                         var sourceVintage = context.background().findSource(key);
87312                         if (context.background().showsLayer(sourceVintage)) {
87313                             context.background().toggleOverlayLayer(sourceVintage);
87314                         }
87315                     }
87316                 });
87317             }
87318
87319
87320             var debouncedGetMetadata = debounce(getMetadata, 250);
87321
87322             function getMetadata(selection) {
87323                 var tile = d3_select('.layer-background img.tile-center');   // tile near viewport center
87324                 if (tile.empty()) return;
87325
87326                 var sourceName = currSourceName;
87327                 var d = tile.datum();
87328                 var zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom());
87329                 var center = context.map().center();
87330
87331                 // update zoom
87332                 metadata.zoom = String(zoom);
87333                 selection.selectAll('.background-info-list-zoom')
87334                     .classed('hide', false)
87335                     .selectAll('.background-info-span-zoom')
87336                     .text(metadata.zoom);
87337
87338                 if (!d || !d.length >= 3) return;
87339
87340                 background.baseLayerSource().getMetadata(center, d, function(err, result) {
87341                     if (err || currSourceName !== sourceName) return;
87342
87343                     // update vintage
87344                     var vintage = result.vintage;
87345                     metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
87346                     selection.selectAll('.background-info-list-vintage')
87347                         .classed('hide', false)
87348                         .selectAll('.background-info-span-vintage')
87349                         .text(metadata.vintage);
87350
87351                     // update other metdata
87352                     metadataKeys.forEach(function(k) {
87353                         if (k === 'zoom' || k === 'vintage') return;  // done already
87354                         var val = result[k];
87355                         metadata[k] = val;
87356                         selection.selectAll('.background-info-list-' + k)
87357                             .classed('hide', !val)
87358                             .selectAll('.background-info-span-' + k)
87359                             .text(val);
87360                     });
87361                 });
87362             }
87363
87364
87365             var panel = function(selection) {
87366                 selection.call(redraw);
87367
87368                 context.map()
87369                     .on('drawn.info-background', function() {
87370                         selection.call(debouncedRedraw);
87371                     })
87372                     .on('move.info-background', function() {
87373                         selection.call(debouncedGetMetadata);
87374                     });
87375
87376             };
87377
87378             panel.off = function() {
87379                 context.map()
87380                     .on('drawn.info-background', null)
87381                     .on('move.info-background', null);
87382             };
87383
87384             panel.id = 'background';
87385             panel.title = t('info_panels.background.title');
87386             panel.key = t('info_panels.background.key');
87387
87388
87389             return panel;
87390         }
87391
87392         function uiPanelHistory(context) {
87393             var osm;
87394
87395             function displayTimestamp(timestamp) {
87396                 if (!timestamp) return t('info_panels.history.unknown');
87397                 var detected = utilDetect();
87398                 var options = {
87399                     day: 'numeric', month: 'short', year: 'numeric',
87400                     hour: 'numeric', minute: 'numeric', second: 'numeric'
87401                 };
87402                 var d = new Date(timestamp);
87403                 if (isNaN(d.getTime())) return t('info_panels.history.unknown');
87404                 return d.toLocaleString(detected.locale, options);
87405             }
87406
87407
87408             function displayUser(selection, userName) {
87409                 if (!userName) {
87410                     selection
87411                         .append('span')
87412                         .text(t('info_panels.history.unknown'));
87413                     return;
87414                 }
87415
87416                 selection
87417                     .append('span')
87418                     .attr('class', 'user-name')
87419                     .text(userName);
87420
87421                 var links = selection
87422                     .append('div')
87423                     .attr('class', 'links');
87424
87425                 if (osm) {
87426                     links
87427                         .append('a')
87428                         .attr('class', 'user-osm-link')
87429                         .attr('href', osm.userURL(userName))
87430                         .attr('target', '_blank')
87431                         .attr('tabindex', -1)
87432                         .text('OSM');
87433                 }
87434
87435                 links
87436                     .append('a')
87437                     .attr('class', 'user-hdyc-link')
87438                     .attr('href', 'https://hdyc.neis-one.org/?' + userName)
87439                     .attr('target', '_blank')
87440                     .attr('tabindex', -1)
87441                     .text('HDYC');
87442             }
87443
87444
87445             function displayChangeset(selection, changeset) {
87446                 if (!changeset) {
87447                     selection
87448                         .append('span')
87449                         .text(t('info_panels.history.unknown'));
87450                     return;
87451                 }
87452
87453                 selection
87454                     .append('span')
87455                     .attr('class', 'changeset-id')
87456                     .text(changeset);
87457
87458                 var links = selection
87459                     .append('div')
87460                     .attr('class', 'links');
87461
87462                 if (osm) {
87463                     links
87464                         .append('a')
87465                         .attr('class', 'changeset-osm-link')
87466                         .attr('href', osm.changesetURL(changeset))
87467                         .attr('target', '_blank')
87468                         .attr('tabindex', -1)
87469                         .text('OSM');
87470                 }
87471
87472                 links
87473                     .append('a')
87474                     .attr('class', 'changeset-osmcha-link')
87475                     .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
87476                     .attr('target', '_blank')
87477                     .attr('tabindex', -1)
87478                     .text('OSMCha');
87479             }
87480
87481
87482             function redraw(selection) {
87483                 var selectedNoteID = context.selectedNoteID();
87484                 osm = context.connection();
87485
87486                 var selected, note, entity;
87487                 if (selectedNoteID && osm) {       // selected 1 note
87488                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87489                     note = osm.getNote(selectedNoteID);
87490                 } else {                           // selected 1..n entities
87491                     selected = context.selectedIDs()
87492                         .filter(function(e) { return context.hasEntity(e); });
87493                     if (selected.length) {
87494                         entity = context.entity(selected[0]);
87495                     }
87496                 }
87497
87498                 var singular = selected.length === 1 ? selected[0] : null;
87499
87500                 selection.html('');
87501
87502                 selection
87503                     .append('h4')
87504                     .attr('class', 'history-heading')
87505                     .text(singular || t('info_panels.history.selected', { n: selected.length }));
87506
87507                 if (!singular) return;
87508
87509                 if (entity) {
87510                     selection.call(redrawEntity, entity);
87511                 } else if (note) {
87512                     selection.call(redrawNote, note);
87513                 }
87514             }
87515
87516
87517             function redrawNote(selection, note) {
87518                 if (!note || note.isNew()) {
87519                     selection
87520                         .append('div')
87521                         .text(t('info_panels.history.note_no_history'));
87522                     return;
87523                 }
87524
87525                 var list = selection
87526                     .append('ul');
87527
87528                 list
87529                     .append('li')
87530                     .text(t('info_panels.history.note_comments') + ':')
87531                     .append('span')
87532                     .text(note.comments.length);
87533
87534                 if (note.comments.length) {
87535                     list
87536                         .append('li')
87537                         .text(t('info_panels.history.note_created_date') + ':')
87538                         .append('span')
87539                         .text(displayTimestamp(note.comments[0].date));
87540
87541                     list
87542                         .append('li')
87543                         .text(t('info_panels.history.note_created_user') + ':')
87544                         .call(displayUser, note.comments[0].user);
87545                 }
87546
87547                 if (osm) {
87548                     selection
87549                         .append('a')
87550                         .attr('class', 'view-history-on-osm')
87551                         .attr('target', '_blank')
87552                         .attr('tabindex', -1)
87553                         .attr('href', osm.noteURL(note))
87554                         .call(svgIcon('#iD-icon-out-link', 'inline'))
87555                         .append('span')
87556                         .text(t('info_panels.history.note_link_text'));
87557                 }
87558             }
87559
87560
87561             function redrawEntity(selection, entity) {
87562                 if (!entity || entity.isNew()) {
87563                     selection
87564                         .append('div')
87565                         .text(t('info_panels.history.no_history'));
87566                     return;
87567                 }
87568
87569                 var links = selection
87570                     .append('div')
87571                     .attr('class', 'links');
87572
87573                 if (osm) {
87574                     links
87575                         .append('a')
87576                         .attr('class', 'view-history-on-osm')
87577                         .attr('href', osm.historyURL(entity))
87578                         .attr('target', '_blank')
87579                         .attr('tabindex', -1)
87580                         .attr('title', t('info_panels.history.link_text'))
87581                         .text('OSM');
87582                 }
87583                 links
87584                     .append('a')
87585                     .attr('class', 'pewu-history-viewer-link')
87586                     .attr('href', 'https://pewu.github.io/osm-history/#/' + entity.type + '/' + entity.osmId())
87587                     .attr('target', '_blank')
87588                     .attr('tabindex', -1)
87589                     .text('PeWu');
87590
87591                 var list = selection
87592                     .append('ul');
87593
87594                 list
87595                     .append('li')
87596                     .text(t('info_panels.history.version') + ':')
87597                     .append('span')
87598                     .text(entity.version);
87599
87600                 list
87601                     .append('li')
87602                     .text(t('info_panels.history.last_edit') + ':')
87603                     .append('span')
87604                     .text(displayTimestamp(entity.timestamp));
87605
87606                 list
87607                     .append('li')
87608                     .text(t('info_panels.history.edited_by') + ':')
87609                     .call(displayUser, entity.user);
87610
87611                 list
87612                     .append('li')
87613                     .text(t('info_panels.history.changeset') + ':')
87614                     .call(displayChangeset, entity.changeset);
87615             }
87616
87617
87618             var panel = function(selection) {
87619                 selection.call(redraw);
87620
87621                 context.map()
87622                     .on('drawn.info-history', function() {
87623                         selection.call(redraw);
87624                     });
87625
87626                 context
87627                     .on('enter.info-history', function() {
87628                         selection.call(redraw);
87629                     });
87630             };
87631
87632             panel.off = function() {
87633                 context.map().on('drawn.info-history', null);
87634                 context.on('enter.info-history', null);
87635             };
87636
87637             panel.id = 'history';
87638             panel.title = t('info_panels.history.title');
87639             panel.key = t('info_panels.history.key');
87640
87641
87642             return panel;
87643         }
87644
87645         var OSM_PRECISION = 7;
87646         var locale$2 = utilDetect().locale;
87647
87648         /**
87649          * Returns a localized representation of the given length measurement.
87650          *
87651          * @param {Number} m area in meters
87652          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87653          */
87654         function displayLength(m, isImperial) {
87655             var d = m * (isImperial ? 3.28084 : 1);
87656             var unit;
87657
87658             if (isImperial) {
87659                 if (d >= 5280) {
87660                     d /= 5280;
87661                     unit = 'miles';
87662                 } else {
87663                     unit = 'feet';
87664                 }
87665             } else {
87666                 if (d >= 1000) {
87667                     d /= 1000;
87668                     unit = 'kilometers';
87669                 } else {
87670                     unit = 'meters';
87671                 }
87672             }
87673
87674             return t('units.' + unit, {
87675                 quantity: d.toLocaleString(locale$2, {
87676                     maximumSignificantDigits: 4
87677                 })
87678             });
87679         }
87680
87681         /**
87682          * Returns a localized representation of the given area measurement.
87683          *
87684          * @param {Number} m2 area in square meters
87685          * @param {Boolean} isImperial true for U.S. customary units; false for metric
87686          */
87687         function displayArea(m2, isImperial) {
87688             var d = m2 * (isImperial ? 10.7639111056 : 1);
87689             var d1, d2, area;
87690             var unit1 = '';
87691             var unit2 = '';
87692
87693             if (isImperial) {
87694                 if (d >= 6969600) { // > 0.25mi² show mi²
87695                     d1 = d / 27878400;
87696                     unit1 = 'square_miles';
87697                 } else {
87698                     d1 = d;
87699                     unit1 = 'square_feet';
87700                 }
87701
87702                 if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
87703                     d2 = d / 43560;
87704                     unit2 = 'acres';
87705                 }
87706
87707             } else {
87708                 if (d >= 250000) { // > 0.25km² show km²
87709                     d1 = d / 1000000;
87710                     unit1 = 'square_kilometers';
87711                 } else {
87712                     d1 = d;
87713                     unit1 = 'square_meters';
87714                 }
87715
87716                 if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
87717                     d2 = d / 10000;
87718                     unit2 = 'hectares';
87719                 }
87720             }
87721
87722             area = t('units.' + unit1, {
87723                 quantity: d1.toLocaleString(locale$2, {
87724                     maximumSignificantDigits: 4
87725                 })
87726             });
87727
87728             if (d2) {
87729                 return t('units.area_pair', {
87730                     area1: area,
87731                     area2: t('units.' + unit2, {
87732                         quantity: d2.toLocaleString(locale$2, {
87733                             maximumSignificantDigits: 2
87734                         })
87735                     })
87736                 });
87737             } else {
87738                 return area;
87739             }
87740         }
87741
87742         function wrap(x, min, max) {
87743             var d = max - min;
87744             return ((x - min) % d + d) % d + min;
87745         }
87746
87747         function clamp$1(x, min, max) {
87748             return Math.max(min, Math.min(x, max));
87749         }
87750
87751         function displayCoordinate(deg, pos, neg) {
87752             var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
87753             var sec = (min - Math.floor(min)) * 60;
87754             var displayDegrees = t('units.arcdegrees', {
87755                 quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
87756             });
87757             var displayCoordinate;
87758
87759             if (Math.floor(sec) > 0) {
87760                 displayCoordinate = displayDegrees +
87761                     t('units.arcminutes', {
87762                         quantity: Math.floor(min).toLocaleString(locale$2)
87763                     }) +
87764                     t('units.arcseconds', {
87765                         quantity: Math.round(sec).toLocaleString(locale$2)
87766                     });
87767             } else if (Math.floor(min) > 0) {
87768                 displayCoordinate = displayDegrees +
87769                     t('units.arcminutes', {
87770                         quantity: Math.round(min).toLocaleString(locale$2)
87771                     });
87772             } else {
87773                 displayCoordinate = t('units.arcdegrees', {
87774                     quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
87775                 });
87776             }
87777
87778             if (deg === 0) {
87779                 return displayCoordinate;
87780             } else {
87781                 return t('units.coordinate', {
87782                     coordinate: displayCoordinate,
87783                     direction: t('units.' + (deg > 0 ? pos : neg))
87784                 });
87785             }
87786         }
87787
87788         /**
87789          * Returns given coordinate pair in degree-minute-second format.
87790          *
87791          * @param {Array<Number>} coord longitude and latitude
87792          */
87793         function dmsCoordinatePair(coord) {
87794             return t('units.coordinate_pair', {
87795                 latitude: displayCoordinate(clamp$1(coord[1], -90, 90), 'north', 'south'),
87796                 longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
87797             });
87798         }
87799
87800         /**
87801          * Returns the given coordinate pair in decimal format.
87802          * note: unlocalized to avoid comma ambiguity - see #4765
87803          *
87804          * @param {Array<Number>} coord longitude and latitude
87805          */
87806         function decimalCoordinatePair(coord) {
87807             return t('units.coordinate_pair', {
87808                 latitude: clamp$1(coord[1], -90, 90).toFixed(OSM_PRECISION),
87809                 longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
87810             });
87811         }
87812
87813         function uiPanelLocation(context) {
87814             var currLocation = '';
87815
87816
87817             function redraw(selection) {
87818                 selection.html('');
87819
87820                 var list = selection
87821                     .append('ul');
87822
87823                 // Mouse coordinates
87824                 var coord = context.map().mouseCoordinates();
87825                 if (coord.some(isNaN)) {
87826                     coord = context.map().center();
87827                 }
87828
87829                 list
87830                     .append('li')
87831                     .text(dmsCoordinatePair(coord))
87832                     .append('li')
87833                     .text(decimalCoordinatePair(coord));
87834
87835                 // Location Info
87836                 selection
87837                     .append('div')
87838                     .attr('class', 'location-info')
87839                     .text(currLocation || ' ');
87840
87841                 debouncedGetLocation(selection, coord);
87842             }
87843
87844
87845             var debouncedGetLocation = debounce(getLocation, 250);
87846             function getLocation(selection, coord) {
87847                 if (!services$1.geocoder) {
87848                     currLocation = t('info_panels.location.unknown_location');
87849                     selection.selectAll('.location-info')
87850                         .text(currLocation);
87851                 } else {
87852                     services$1.geocoder.reverse(coord, function(err, result) {
87853                         currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
87854                         selection.selectAll('.location-info')
87855                             .text(currLocation);
87856                     });
87857                 }
87858             }
87859
87860
87861             var panel = function(selection) {
87862                 selection.call(redraw);
87863
87864                 context.surface()
87865                     .on('mousemove.info-location', function() {
87866                         selection.call(redraw);
87867                     });
87868             };
87869
87870             panel.off = function() {
87871                 context.surface()
87872                     .on('mousemove.info-location', null);
87873             };
87874
87875             panel.id = 'location';
87876             panel.title = t('info_panels.location.title');
87877             panel.key = t('info_panels.location.key');
87878
87879
87880             return panel;
87881         }
87882
87883         function uiPanelMeasurement(context) {
87884             var locale = utilDetect().locale;
87885             var isImperial = (locale.toLowerCase() === 'en-us');
87886
87887
87888             function radiansToMeters(r) {
87889                 // using WGS84 authalic radius (6371007.1809 m)
87890                 return r * 6371007.1809;
87891             }
87892
87893             function steradiansToSqmeters(r) {
87894                 // http://gis.stackexchange.com/a/124857/40446
87895                 return r / (4 * Math.PI) * 510065621724000;
87896             }
87897
87898
87899             function toLineString(feature) {
87900                 if (feature.type === 'LineString') return feature;
87901
87902                 var result = { type: 'LineString', coordinates: [] };
87903                 if (feature.type === 'Polygon') {
87904                     result.coordinates = feature.coordinates[0];
87905                 } else if (feature.type === 'MultiPolygon') {
87906                     result.coordinates = feature.coordinates[0][0];
87907                 }
87908
87909                 return result;
87910             }
87911
87912
87913             function nodeCount(feature) {
87914               if (feature.type === 'LineString') return feature.coordinates.length;
87915               if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
87916             }
87917
87918
87919             function redraw(selection) {
87920                 var resolver = context.graph();
87921                 var selectedNoteID = context.selectedNoteID();
87922                 var osm = services$1.osm;
87923
87924                 var selected, center, entity, note, geometry;
87925
87926                 if (selectedNoteID && osm) {       // selected 1 note
87927                     selected = [ t('note.note') + ' ' + selectedNoteID ];
87928                     note = osm.getNote(selectedNoteID);
87929                     center = note.loc;
87930                     geometry = 'note';
87931
87932                 } else {                           // selected 1..n entities
87933                     var extent = geoExtent();
87934                     selected = context.selectedIDs()
87935                         .filter(function(e) { return context.hasEntity(e); });
87936                     if (selected.length) {
87937                         for (var i = 0; i < selected.length; i++) {
87938                             entity = context.entity(selected[i]);
87939                             extent._extend(entity.extent(resolver));
87940                         }
87941                         center = extent.center();
87942                         geometry = entity.geometry(resolver);
87943                     }
87944                 }
87945
87946                 var singular = selected.length === 1 ? selected[0] : null;
87947
87948                 selection.html('');
87949
87950                 selection
87951                     .append('h4')
87952                     .attr('class', 'measurement-heading')
87953                     .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
87954
87955                 if (!selected.length) return;
87956
87957
87958                 var list = selection
87959                     .append('ul');
87960                 var coordItem;
87961
87962                 // multiple selected features, just display extent center..
87963                 if (!singular) {
87964                     coordItem = list
87965                         .append('li')
87966                         .text(t('info_panels.measurement.center') + ':');
87967                     coordItem.append('span')
87968                         .text(dmsCoordinatePair(center));
87969                     coordItem.append('span')
87970                         .text(decimalCoordinatePair(center));
87971                     return;
87972                 }
87973
87974                 // single selected feature, display details..
87975                 if (geometry === 'line' || geometry === 'area') {
87976                     var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
87977                     var feature = entity.asGeoJSON(resolver);
87978                     var length = radiansToMeters(d3_geoLength(toLineString(feature)));
87979                     var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
87980                     var centroid = d3_geoCentroid(feature);
87981
87982                     list
87983                         .append('li')
87984                         .text(t('info_panels.measurement.geometry') + ':')
87985                         .append('span')
87986                         .text(
87987                             closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
87988                         );
87989
87990                     if (entity.type !== 'relation') {
87991                         list
87992                             .append('li')
87993                             .text(t('info_panels.measurement.node_count') + ':')
87994                             .append('span')
87995                             .text(nodeCount(feature).toLocaleString(locale));
87996                     }
87997
87998                     if (closed) {
87999                         var area = steradiansToSqmeters(entity.area(resolver));
88000                         list
88001                             .append('li')
88002                             .text(t('info_panels.measurement.area') + ':')
88003                             .append('span')
88004                             .text(displayArea(area, isImperial));
88005                     }
88006
88007
88008                     list
88009                         .append('li')
88010                         .text(lengthLabel + ':')
88011                         .append('span')
88012                         .text(displayLength(length, isImperial));
88013
88014                     coordItem = list
88015                         .append('li')
88016                         .text(t('info_panels.measurement.centroid') + ':');
88017                     coordItem.append('span')
88018                         .text(dmsCoordinatePair(centroid));
88019                     coordItem.append('span')
88020                         .text(decimalCoordinatePair(centroid));
88021
88022                     var toggle  = isImperial ? 'imperial' : 'metric';
88023
88024                     selection
88025                         .append('a')
88026                         .text(t('info_panels.measurement.' + toggle))
88027                         .attr('href', '#')
88028                         .attr('class', 'button button-toggle-units')
88029                         .on('click', function() {
88030                             event.preventDefault();
88031                             isImperial = !isImperial;
88032                             selection.call(redraw);
88033                         });
88034
88035                 } else {
88036                     var centerLabel = t('info_panels.measurement.' +
88037                         (note || entity.type === 'node' ? 'location' : 'center'));
88038
88039                     list
88040                         .append('li')
88041                         .text(t('info_panels.measurement.geometry') + ':')
88042                         .append('span')
88043                         .text(t('geometry.' + geometry));
88044
88045                     coordItem = list
88046                         .append('li')
88047                         .text(centerLabel + ':');
88048                     coordItem.append('span')
88049                         .text(dmsCoordinatePair(center));
88050                     coordItem.append('span')
88051                         .text(decimalCoordinatePair(center));
88052                 }
88053             }
88054
88055
88056             var panel = function(selection) {
88057                 selection.call(redraw);
88058
88059                 context.map()
88060                     .on('drawn.info-measurement', function() {
88061                         selection.call(redraw);
88062                     });
88063
88064                 context
88065                     .on('enter.info-measurement', function() {
88066                         selection.call(redraw);
88067                     });
88068             };
88069
88070             panel.off = function() {
88071                 context.map().on('drawn.info-measurement', null);
88072                 context.on('enter.info-measurement', null);
88073             };
88074
88075             panel.id = 'measurement';
88076             panel.title = t('info_panels.measurement.title');
88077             panel.key = t('info_panels.measurement.key');
88078
88079
88080             return panel;
88081         }
88082
88083         var uiInfoPanels = {
88084             background: uiPanelBackground,
88085             history: uiPanelHistory,
88086             location: uiPanelLocation,
88087             measurement: uiPanelMeasurement,
88088         };
88089
88090         function uiInfo(context) {
88091             var ids = Object.keys(uiInfoPanels);
88092             var wasActive = ['measurement'];
88093             var panels = {};
88094             var active = {};
88095
88096             // create panels
88097             ids.forEach(function(k) {
88098                 if (!panels[k]) {
88099                     panels[k] = uiInfoPanels[k](context);
88100                     active[k] = false;
88101                 }
88102             });
88103
88104
88105             function info(selection) {
88106
88107                 function redraw() {
88108                     var activeids = ids.filter(function(k) { return active[k]; }).sort();
88109
88110                     var containers = infoPanels.selectAll('.panel-container')
88111                         .data(activeids, function(k) { return k; });
88112
88113                     containers.exit()
88114                         .style('opacity', 1)
88115                         .transition()
88116                         .duration(200)
88117                         .style('opacity', 0)
88118                         .on('end', function(d) {
88119                             d3_select(this)
88120                                 .call(panels[d].off)
88121                                 .remove();
88122                         });
88123
88124                     var enter = containers.enter()
88125                         .append('div')
88126                         .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
88127
88128                     enter
88129                         .style('opacity', 0)
88130                         .transition()
88131                         .duration(200)
88132                         .style('opacity', 1);
88133
88134                     var title = enter
88135                         .append('div')
88136                         .attr('class', 'panel-title fillD2');
88137
88138                     title
88139                         .append('h3')
88140                         .text(function(d) { return panels[d].title; });
88141
88142                     title
88143                         .append('button')
88144                         .attr('class', 'close')
88145                         .on('click', function (d) { toggle(d); })
88146                         .call(svgIcon('#iD-icon-close'));
88147
88148                     enter
88149                         .append('div')
88150                         .attr('class', function(d) { return 'panel-content panel-content-' + d; });
88151
88152
88153                     // redraw the panels
88154                     infoPanels.selectAll('.panel-content')
88155                         .each(function(d) {
88156                             d3_select(this).call(panels[d]);
88157                         });
88158                 }
88159
88160
88161                 function toggle(which) {
88162                     if (event) {
88163                         event.stopImmediatePropagation();
88164                         event.preventDefault();
88165                     }
88166
88167                     var activeids = ids.filter(function(k) { return active[k]; });
88168
88169                     if (which) {  // toggle one
88170                         active[which] = !active[which];
88171                         if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
88172                             wasActive = [which];
88173                         }
88174                     } else {      // toggle all
88175                         if (activeids.length) {
88176                             wasActive = activeids;
88177                             activeids.forEach(function(k) { active[k] = false; });
88178                         } else {
88179                             wasActive.forEach(function(k) { active[k] = true; });
88180                         }
88181                     }
88182
88183                     redraw();
88184                 }
88185
88186
88187                 var infoPanels = selection.selectAll('.info-panels')
88188                     .data([0]);
88189
88190                 infoPanels = infoPanels.enter()
88191                     .append('div')
88192                     .attr('class', 'info-panels')
88193                     .merge(infoPanels);
88194
88195                 redraw();
88196
88197                 context.keybinding()
88198                     .on(uiCmd('⌘' + t('info_panels.key')), toggle);
88199
88200                 ids.forEach(function(k) {
88201                     var key = t('info_panels.' + k + '.key', { default: null });
88202                     if (!key) return;
88203                     context.keybinding()
88204                         .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
88205                 });
88206             }
88207
88208             return info;
88209         }
88210
88211         function uiIssues(context) {
88212             var key = t('issues.key');
88213
88214             var MINSQUARE = 0;
88215             var MAXSQUARE = 20;
88216             var DEFAULTSQUARE = 5;  // see also unsquare_way.js
88217
88218             var _errorsSelection = d3_select(null);
88219             var _warningsSelection = d3_select(null);
88220             var _rulesList = d3_select(null);
88221             var _pane = d3_select(null);
88222             var _toggleButton = d3_select(null);
88223
88224             var _errors = [];
88225             var _warnings = [];
88226             var _options = {
88227                 what: context.storage('validate-what') || 'edited',    // 'all', 'edited'
88228                 where: context.storage('validate-where') || 'all'  // 'all', 'visible'
88229             };
88230
88231             // listeners
88232             context.validator().on('validated.uiIssues',
88233                 function() { window.requestIdleCallback(update); }
88234             );
88235             context.map().on('move.uiIssues',
88236                 debounce(function() { window.requestIdleCallback(update); }, 1000)
88237             );
88238
88239
88240             function addNotificationBadge(selection) {
88241                 var d = 10;
88242                 selection.selectAll('svg.notification-badge')
88243                     .data([0])
88244                     .enter()
88245                     .append('svg')
88246                     .attr('viewbox', '0 0 ' + d + ' ' + d)
88247                     .attr('class', 'notification-badge hide')
88248                     .append('circle')
88249                     .attr('cx', d / 2)
88250                     .attr('cy', d / 2)
88251                     .attr('r', (d / 2) - 1)
88252                     .attr('fill', 'currentColor');
88253             }
88254
88255
88256             function renderErrorsList(selection) {
88257                 _errorsSelection = selection
88258                     .call(drawIssuesList, 'errors', _errors);
88259             }
88260
88261
88262             function renderWarningsList(selection) {
88263                 _warningsSelection = selection
88264                     .call(drawIssuesList, 'warnings', _warnings);
88265             }
88266
88267
88268             function drawIssuesList(selection, which, issues) {
88269                 var list = selection.selectAll('.issues-list')
88270                     .data([0]);
88271
88272                 list = list.enter()
88273                     .append('ul')
88274                     .attr('class', 'layer-list issues-list ' + which + '-list')
88275                     .merge(list);
88276
88277
88278                 var items = list.selectAll('li')
88279                     .data(issues, function(d) { return d.id; });
88280
88281                 // Exit
88282                 items.exit()
88283                     .remove();
88284
88285                 // Enter
88286                 var itemsEnter = items.enter()
88287                     .append('li')
88288                     .attr('class', function (d) { return 'issue severity-' + d.severity; })
88289                     .on('click', function(d) {
88290                         context.validator().focusIssue(d);
88291                     })
88292                     .on('mouseover', function(d) {
88293                         utilHighlightEntities(d.entityIds, true, context);
88294                     })
88295                     .on('mouseout', function(d) {
88296                         utilHighlightEntities(d.entityIds, false, context);
88297                     });
88298
88299
88300                 var labelsEnter = itemsEnter
88301                     .append('div')
88302                     .attr('class', 'issue-label');
88303
88304                 var textEnter = labelsEnter
88305                     .append('span')
88306                     .attr('class', 'issue-text');
88307
88308                 textEnter
88309                     .append('span')
88310                     .attr('class', 'issue-icon')
88311                     .each(function(d) {
88312                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
88313                         d3_select(this)
88314                             .call(svgIcon(iconName));
88315                     });
88316
88317                 textEnter
88318                     .append('span')
88319                     .attr('class', 'issue-message');
88320
88321
88322                 labelsEnter
88323                     .append('span')
88324                     .attr('class', 'issue-autofix')
88325                     .each(function(d) {
88326                         if (!d.autoFix) return;
88327
88328                         d3_select(this)
88329                             .append('button')
88330                             .attr('title', t('issues.fix_one.title'))
88331                             .datum(d.autoFix)  // set button datum to the autofix
88332                             .attr('class', 'autofix action')
88333                             .on('click', function(d) {
88334                                 event.preventDefault();
88335                                 event.stopPropagation();
88336
88337                                 var issuesEntityIDs = d.issue.entityIds;
88338                                 utilHighlightEntities(issuesEntityIDs.concat(d.entityIds), false, context);
88339
88340                                 context.perform.apply(context, d.autoArgs);
88341                                 context.validator().validate();
88342                             })
88343                             .call(svgIcon('#iD-icon-wrench'));
88344                     });
88345
88346
88347                 // Update
88348                 items = items
88349                     .merge(itemsEnter)
88350                     .order();
88351
88352                 items.selectAll('.issue-message')
88353                     .text(function(d) {
88354                         return d.message();
88355                     });
88356
88357
88358                 // autofix
88359                 var canAutoFix = issues.filter(function(issue) { return issue.autoFix; });
88360
88361                 var autoFixAll = selection.selectAll('.autofix-all')
88362                     .data(canAutoFix.length ? [0] : []);
88363
88364                 // exit
88365                 autoFixAll.exit()
88366                     .remove();
88367
88368                 // enter
88369                 var autoFixAllEnter = autoFixAll.enter()
88370                     .insert('div', '.issues-list')
88371                     .attr('class', 'autofix-all');
88372
88373                 var linkEnter = autoFixAllEnter
88374                     .append('a')
88375                     .attr('class', 'autofix-all-link')
88376                     .attr('href', '#');
88377
88378                 linkEnter
88379                     .append('span')
88380                     .attr('class', 'autofix-all-link-text')
88381                     .text(t('issues.fix_all.title'));
88382
88383                 linkEnter
88384                     .append('span')
88385                     .attr('class', 'autofix-all-link-icon')
88386                     .call(svgIcon('#iD-icon-wrench'));
88387
88388                 if (which === 'warnings') {
88389                     renderIgnoredIssuesReset(selection);
88390                 }
88391
88392                 // update
88393                 autoFixAll = autoFixAll
88394                     .merge(autoFixAllEnter);
88395
88396                 autoFixAll.selectAll('.autofix-all-link')
88397                     .on('click', function() {
88398                         context.pauseChangeDispatch();
88399                         context.perform(actionNoop());
88400                         canAutoFix.forEach(function(issue) {
88401                             var args = issue.autoFix.autoArgs.slice();  // copy
88402                             if (typeof args[args.length - 1] !== 'function') {
88403                                 args.pop();
88404                             }
88405                             args.push(t('issues.fix_all.annotation'));
88406                             context.replace.apply(context, args);
88407                         });
88408                         context.resumeChangeDispatch();
88409                         context.validator().validate();
88410                     });
88411             }
88412
88413
88414             function updateOptionValue(d, val) {
88415                 if (!val && event && event.target) {
88416                     val = event.target.value;
88417                 }
88418
88419                 _options[d] = val;
88420                 context.storage('validate-' + d, val);
88421                 update();
88422             }
88423
88424
88425             function renderIssuesOptions(selection) {
88426                 var container = selection.selectAll('.issues-options-container')
88427                     .data([0]);
88428
88429                 container = container.enter()
88430                     .append('div')
88431                     .attr('class', 'issues-options-container')
88432                     .merge(container);
88433
88434                 var data = [
88435                     { key: 'what', values: ['edited', 'all'] },
88436                     { key: 'where', values: ['visible', 'all'] }
88437                 ];
88438
88439                 var options = container.selectAll('.issues-option')
88440                     .data(data, function(d) { return d.key; });
88441
88442                 var optionsEnter = options.enter()
88443                     .append('div')
88444                     .attr('class', function(d) { return 'issues-option issues-option-' + d.key; });
88445
88446                 optionsEnter
88447                     .append('div')
88448                     .attr('class', 'issues-option-title')
88449                     .text(function(d) { return t('issues.options.' + d.key + '.title'); });
88450
88451                 var valuesEnter = optionsEnter.selectAll('label')
88452                     .data(function(d) {
88453                         return d.values.map(function(val) { return { value: val, key: d.key }; });
88454                     })
88455                     .enter()
88456                     .append('label');
88457
88458                 valuesEnter
88459                     .append('input')
88460                     .attr('type', 'radio')
88461                     .attr('name', function(d) { return 'issues-option-' + d.key; })
88462                     .attr('value', function(d) { return d.value; })
88463                     .property('checked', function(d) { return _options[d.key] === d.value; })
88464                     .on('change', function(d) { updateOptionValue(d.key, d.value); });
88465
88466                 valuesEnter
88467                     .append('span')
88468                     .text(function(d) { return t('issues.options.' + d.key + '.' + d.value); });
88469             }
88470
88471
88472             function renderNoIssuesBox(selection) {
88473
88474                 var box = selection.append('div')
88475                     .attr('class', 'box');
88476
88477                 box
88478                     .append('div')
88479                     .call(svgIcon('#iD-icon-apply', 'pre-text'));
88480
88481                 var noIssuesMessage = box
88482                     .append('span');
88483
88484                 noIssuesMessage
88485                     .append('strong')
88486                     .attr('class', 'message');
88487
88488                 noIssuesMessage
88489                     .append('br');
88490
88491                 noIssuesMessage
88492                     .append('span')
88493                     .attr('class', 'details');
88494             }
88495
88496             function renderIgnoredIssuesReset(selection) {
88497
88498                 var ignoredIssues = context.validator()
88499                     .getIssues(Object.assign({ includeIgnored: 'only' }, _options));
88500
88501                 var resetIgnored = selection.selectAll('.reset-ignored')
88502                     .data(ignoredIssues.length ? [0] : []);
88503
88504                 // exit
88505                 resetIgnored.exit()
88506                     .remove();
88507
88508                 // enter
88509                 var resetIgnoredEnter = resetIgnored.enter()
88510                     .append('div')
88511                     .attr('class', 'reset-ignored section-footer');
88512
88513                 resetIgnoredEnter
88514                     .append('a')
88515                     .attr('href', '#');
88516
88517                 // update
88518                 resetIgnored = resetIgnored
88519                     .merge(resetIgnoredEnter);
88520
88521                 resetIgnored.select('a')
88522                     .text(t('issues.reset_ignored', { count: ignoredIssues.length.toString() }));
88523
88524                 resetIgnored.on('click', function() {
88525                         context.validator().resetIgnoredIssues();
88526                     });
88527             }
88528
88529
88530             function renderRulesList(selection) {
88531                 var container = selection.selectAll('.issues-rulelist-container')
88532                     .data([0]);
88533
88534                 var containerEnter = container.enter()
88535                     .append('div')
88536                     .attr('class', 'issues-rulelist-container');
88537
88538                 containerEnter
88539                     .append('ul')
88540                     .attr('class', 'layer-list issue-rules-list');
88541
88542                 var ruleLinks = containerEnter
88543                     .append('div')
88544                     .attr('class', 'issue-rules-links section-footer');
88545
88546                 ruleLinks
88547                     .append('a')
88548                     .attr('class', 'issue-rules-link')
88549                     .attr('href', '#')
88550                     .text(t('issues.enable_all'))
88551                     .on('click', function() {
88552                         context.validator().disableRules([]);
88553                     });
88554
88555                 ruleLinks
88556                     .append('a')
88557                     .attr('class', 'issue-rules-link')
88558                     .attr('href', '#')
88559                     .text(t('issues.disable_all'))
88560                     .on('click', function() {
88561                         var keys = context.validator().getRuleKeys();
88562                         context.validator().disableRules(keys);
88563                     });
88564
88565
88566                 // Update
88567                 container = container
88568                     .merge(containerEnter);
88569
88570                 _rulesList = container.selectAll('.issue-rules-list');
88571
88572                 updateRulesList();
88573             }
88574
88575
88576             function updateRulesList() {
88577                 var ruleKeys = context.validator().getRuleKeys();
88578                 _rulesList
88579                     .call(drawListItems, ruleKeys, 'checkbox', 'rule', toggleRule, isRuleEnabled);
88580             }
88581
88582
88583             function isRuleEnabled(d) {
88584                 return context.validator().isRuleEnabled(d);
88585             }
88586
88587
88588             function toggleRule(d) {
88589                 context.validator().toggleRule(d);
88590             }
88591
88592             function setNoIssuesText() {
88593
88594                 function checkForHiddenIssues(cases) {
88595                     for (var type in cases) {
88596                         var opts = cases[type];
88597                         var hiddenIssues = context.validator().getIssues(opts);
88598                         if (hiddenIssues.length) {
88599                             _pane.select('.issues-none .details')
88600                                 .text(t(
88601                                     'issues.no_issues.hidden_issues.' + type,
88602                                     { count: hiddenIssues.length.toString() }
88603                                 ));
88604                             return;
88605                         }
88606                     }
88607                     _pane.select('.issues-none .details')
88608                         .text(t('issues.no_issues.hidden_issues.none'));
88609                 }
88610
88611                 var messageType;
88612
88613                 if (_options.what === 'edited' && _options.where === 'visible') {
88614
88615                     messageType = 'edits_in_view';
88616
88617                     checkForHiddenIssues({
88618                         elsewhere: { what: 'edited', where: 'all' },
88619                         other_features: { what: 'all', where: 'visible' },
88620                         disabled_rules: { what: 'edited', where: 'visible', includeDisabledRules: 'only' },
88621                         other_features_elsewhere: { what: 'all', where: 'all' },
88622                         disabled_rules_elsewhere: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88623                         ignored_issues: { what: 'edited', where: 'visible', includeIgnored: 'only' },
88624                         ignored_issues_elsewhere: { what: 'edited', where: 'all', includeIgnored: 'only' }
88625                     });
88626
88627                 } else if (_options.what === 'edited' && _options.where === 'all') {
88628
88629                     messageType = 'edits';
88630
88631                     checkForHiddenIssues({
88632                         other_features: { what: 'all', where: 'all' },
88633                         disabled_rules: { what: 'edited', where: 'all', includeDisabledRules: 'only' },
88634                         ignored_issues: { what: 'edited', where: 'all', includeIgnored: 'only' }
88635                     });
88636
88637                 } else if (_options.what === 'all' && _options.where === 'visible') {
88638
88639                     messageType = 'everything_in_view';
88640
88641                     checkForHiddenIssues({
88642                         elsewhere: { what: 'all', where: 'all' },
88643                         disabled_rules: { what: 'all', where: 'visible', includeDisabledRules: 'only' },
88644                         disabled_rules_elsewhere: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88645                         ignored_issues: { what: 'all', where: 'visible', includeIgnored: 'only' },
88646                         ignored_issues_elsewhere: { what: 'all', where: 'all', includeIgnored: 'only' }
88647                     });
88648                 } else if (_options.what === 'all' && _options.where === 'all') {
88649
88650                     messageType = 'everything';
88651
88652                     checkForHiddenIssues({
88653                         disabled_rules: { what: 'all', where: 'all', includeDisabledRules: 'only' },
88654                         ignored_issues: { what: 'all', where: 'all', includeIgnored: 'only' }
88655                     });
88656                 }
88657
88658                 _pane.select('.issues-none .message')
88659                     .text(t('issues.no_issues.message.' + messageType));
88660
88661             }
88662
88663
88664             function update() {
88665                 var issuesBySeverity = context.validator().getIssuesBySeverity(_options);
88666
88667                 // sort issues by distance away from the center of the map
88668                 var center = context.map().center();
88669                 var graph = context.graph();
88670                 _errors = issuesBySeverity.error.map(withDistance).sort(byDistance);
88671                 _warnings = issuesBySeverity.warning.map(withDistance).sort(byDistance);
88672
88673                 // cut off at 1000
88674                 var errorCount = _errors.length > 1000 ? '1000+' : String(_errors.length);
88675                 var warningCount = _warnings.length > 1000 ? '1000+' : String(_warnings.length);
88676                 _errors = _errors.slice(0, 1000);
88677                 _warnings = _warnings.slice(0, 1000);
88678
88679
88680                 _toggleButton.selectAll('.notification-badge')
88681                     .classed('error', (_errors.length > 0))
88682                     .classed('warning', (_errors.length === 0 && _warnings.length > 0))
88683                     .classed('hide', (_errors.length === 0 && _warnings.length === 0));
88684
88685
88686                 _pane.selectAll('.issues-errors')
88687                     .classed('hide', _errors.length === 0);
88688
88689                 if (_errors.length > 0) {
88690                     _pane.selectAll('.hide-toggle-issues_errors .hide-toggle-text')
88691                         .text(t('issues.errors.list_title', { count: errorCount }));
88692                     if (!_pane.select('.disclosure-wrap-issues_errors').classed('hide')) {
88693                         _errorsSelection
88694                             .call(drawIssuesList, 'errors', _errors);
88695                     }
88696                 }
88697
88698                 _pane.selectAll('.issues-warnings')
88699                     .classed('hide', _warnings.length === 0);
88700
88701                 if (_warnings.length > 0) {
88702                     _pane.selectAll('.hide-toggle-issues_warnings .hide-toggle-text')
88703                         .text(t('issues.warnings.list_title', { count: warningCount }));
88704                     if (!_pane.select('.disclosure-wrap-issues_warnings').classed('hide')) {
88705                         _warningsSelection
88706                             .call(drawIssuesList, 'warnings', _warnings);
88707                     }
88708                 }
88709
88710                 var hasIssues = _warnings.length > 0 || _errors.length > 0;
88711
88712                 var issuesNone = _pane.select('.issues-none');
88713                 issuesNone.classed('hide', hasIssues);
88714                 if (!hasIssues) {
88715                     renderIgnoredIssuesReset(issuesNone);
88716                     setNoIssuesText();
88717                 }
88718
88719                 if (!_pane.select('.disclosure-wrap-issues_rules').classed('hide')) {
88720                     updateRulesList();
88721                 }
88722
88723
88724                 function byDistance(a, b) {
88725                     return a.dist - b.dist;
88726                 }
88727
88728                 function withDistance(issue) {
88729                     var extent = issue.extent(graph);
88730                     var dist = extent ? geoSphericalDistance(center, extent.center()) : 0;
88731                     return Object.assign(issue, { dist: dist });
88732                 }
88733             }
88734
88735
88736             function drawListItems(selection, data, type, name, change, active) {
88737                 var items = selection.selectAll('li')
88738                     .data(data);
88739
88740                 // Exit
88741                 items.exit()
88742                     .remove();
88743
88744                 // Enter
88745                 var enter = items.enter()
88746                     .append('li');
88747
88748                 if (name === 'rule') {
88749                     enter
88750                         .call(tooltip()
88751                             .title(function(d) { return t('issues.' + d + '.tip'); })
88752                             .placement('top')
88753                         );
88754                 }
88755
88756                 var label = enter
88757                     .append('label');
88758
88759                 label
88760                     .append('input')
88761                     .attr('type', type)
88762                     .attr('name', name)
88763                     .on('change', change);
88764
88765                 label
88766                     .append('span')
88767                     .html(function(d) {
88768                         var params = {};
88769                         if (d === 'unsquare_way') {
88770                             params.val = '<span class="square-degrees"></span>';
88771                         }
88772                         return t('issues.' + d + '.title', params);
88773                     });
88774
88775                 // Update
88776                 items = items
88777                     .merge(enter);
88778
88779                 items
88780                     .classed('active', active)
88781                     .selectAll('input')
88782                     .property('checked', active)
88783                     .property('indeterminate', false);
88784
88785
88786                 // user-configurable square threshold
88787                 var degStr = context.storage('validate-square-degrees');
88788                 if (degStr === null) {
88789                     degStr = '' + DEFAULTSQUARE;
88790                 }
88791
88792                 var span = items.selectAll('.square-degrees');
88793                 var input = span.selectAll('.square-degrees-input')
88794                     .data([0]);
88795
88796                 // enter / update
88797                 input.enter()
88798                     .append('input')
88799                     .attr('type', 'number')
88800                     .attr('min', '' + MINSQUARE)
88801                     .attr('max', '' + MAXSQUARE)
88802                     .attr('step', '0.5')
88803                     .attr('class', 'square-degrees-input')
88804                     .call(utilNoAuto)
88805                     .on('input', function() {
88806                         this.style.width = (this.value.length + 2.5) + 'ch';   // resize
88807                     })
88808                     .on('click', function () {
88809                         event.preventDefault();
88810                         event.stopPropagation();
88811                         this.select();
88812                     })
88813                     .on('keyup', function () {
88814                         if (event.keyCode === 13) { // enter
88815                             this.blur();
88816                             this.select();
88817                         }
88818                     })
88819                     .on('blur', changeSquare)
88820                     .merge(input)
88821                     .property('value', degStr)
88822                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88823             }
88824
88825
88826             function changeSquare() {
88827                 var input = d3_select(this);
88828                 var degStr = utilGetSetValue(input).trim();
88829                 var degNum = parseFloat(degStr, 10);
88830
88831                 if (!isFinite(degNum)) {
88832                     degNum = DEFAULTSQUARE;
88833                 } else if (degNum > MAXSQUARE) {
88834                     degNum = MAXSQUARE;
88835                 } else if (degNum < MINSQUARE) {
88836                     degNum = MINSQUARE;
88837                 }
88838
88839                 degNum = Math.round(degNum * 10 ) / 10;   // round to 1 decimal
88840                 degStr = '' + degNum;
88841
88842                 input
88843                     .property('value', degStr)
88844                     .style('width', (degStr.length + 2.5) + 'ch');   // resize
88845
88846                 context.storage('validate-square-degrees', degStr);
88847                 context.validator().changeSquareThreshold(degNum);
88848             }
88849
88850
88851             function hidePane() {
88852                 context.ui().togglePanes();
88853             }
88854
88855
88856
88857             var paneTooltip = tooltip()
88858                 .placement((textDirection === 'rtl') ? 'right' : 'left')
88859                 .html(true)
88860                 .title(uiTooltipHtml(t('issues.title'), key));
88861
88862
88863
88864             uiIssues.togglePane = function() {
88865                 if (event) event.preventDefault();
88866                 paneTooltip.hide(_toggleButton);
88867                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
88868             };
88869
88870
88871             uiIssues.renderToggleButton = function(selection) {
88872                 _toggleButton = selection
88873                     .append('button')
88874                     .attr('tabindex', -1)
88875                     .on('click', uiIssues.togglePane)
88876                     .call(svgIcon('#iD-icon-alert', 'light'))
88877                     .call(addNotificationBadge)
88878                     .call(paneTooltip);
88879             };
88880
88881
88882             uiIssues.renderPane = function(selection) {
88883                 _pane = selection
88884                     .append('div')
88885                     .attr('class', 'fillL map-pane issues-pane hide')
88886                     .attr('pane', 'map-issues');
88887
88888                 var heading = _pane
88889                     .append('div')
88890                     .attr('class', 'pane-heading');
88891
88892                 heading
88893                     .append('h2')
88894                     .text(t('issues.title'));
88895
88896                 heading
88897                     .append('button')
88898                     .on('click', hidePane)
88899                     .call(svgIcon('#iD-icon-close'));
88900
88901                 var content = _pane
88902                     .append('div')
88903                     .attr('class', 'pane-content');
88904
88905                 content
88906                     .append('div')
88907                     .attr('class', 'issues-options')
88908                     .call(renderIssuesOptions);
88909
88910                 content
88911                     .append('div')
88912                     .attr('class', 'issues-none')
88913                     .call(renderNoIssuesBox);
88914
88915                 // errors
88916                 content
88917                     .append('div')
88918                     .attr('class', 'issues-errors')
88919                     .call(uiDisclosure(context, 'issues_errors', true)
88920                         .content(renderErrorsList)
88921                     );
88922
88923                 // warnings
88924                 content
88925                     .append('div')
88926                     .attr('class', 'issues-warnings')
88927                     .call(uiDisclosure(context, 'issues_warnings', true)
88928                         .content(renderWarningsList)
88929                     );
88930
88931                 // rules
88932                 content
88933                     .append('div')
88934                     .attr('class', 'issues-rules')
88935                     .call(uiDisclosure(context, 'issues_rules', false)
88936                         .title(t('issues.rules.title'))
88937                         .content(renderRulesList)
88938                     );
88939
88940                 // update();
88941
88942                 context.keybinding()
88943                     .on(key, uiIssues.togglePane);
88944             };
88945
88946             return uiIssues;
88947         }
88948
88949         function uiSettingsCustomData(context) {
88950             var dispatch$1 = dispatch('change');
88951
88952             function render(selection) {
88953                 var dataLayer = context.layers().layer('data');
88954
88955                 // keep separate copies of original and current settings
88956                 var _origSettings = {
88957                     fileList: (dataLayer && dataLayer.fileList()) || null,
88958                     url: context.storage('settings-custom-data-url')
88959                 };
88960                 var _currSettings = {
88961                     fileList: (dataLayer && dataLayer.fileList()) || null,
88962                     url: context.storage('settings-custom-data-url')
88963                 };
88964
88965                 // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
88966                 var modal = uiConfirm(selection).okButton();
88967
88968                 modal
88969                     .classed('settings-modal settings-custom-data', true);
88970
88971                 modal.select('.modal-section.header')
88972                     .append('h3')
88973                     .text(t('settings.custom_data.header'));
88974
88975
88976                 var textSection = modal.select('.modal-section.message-text');
88977
88978                 textSection
88979                     .append('pre')
88980                     .attr('class', 'instructions-file')
88981                     .text(t('settings.custom_data.file.instructions'));
88982
88983                 textSection
88984                     .append('input')
88985                     .attr('class', 'field-file')
88986                     .attr('type', 'file')
88987                     .property('files', _currSettings.fileList)  // works for all except IE11
88988                     .on('change', function() {
88989                         var files = event.target.files;
88990                         if (files && files.length) {
88991                             _currSettings.url = '';
88992                             textSection.select('.field-url').property('value', '');
88993                             _currSettings.fileList = files;
88994                         } else {
88995                             _currSettings.fileList = null;
88996                         }
88997                     });
88998
88999                 textSection
89000                     .append('h4')
89001                     .text(t('settings.custom_data.or'));
89002
89003                 textSection
89004                     .append('pre')
89005                     .attr('class', 'instructions-url')
89006                     .text(t('settings.custom_data.url.instructions'));
89007
89008                 textSection
89009                     .append('textarea')
89010                     .attr('class', 'field-url')
89011                     .attr('placeholder', t('settings.custom_data.url.placeholder'))
89012                     .call(utilNoAuto)
89013                     .property('value', _currSettings.url);
89014
89015
89016                 // insert a cancel button
89017                 var buttonSection = modal.select('.modal-section.buttons');
89018
89019                 buttonSection
89020                     .insert('button', '.ok-button')
89021                     .attr('class', 'button cancel-button secondary-action')
89022                     .text(t('confirm.cancel'));
89023
89024
89025                 buttonSection.select('.cancel-button')
89026                     .on('click.cancel', clickCancel);
89027
89028                 buttonSection.select('.ok-button')
89029                     .attr('disabled', isSaveDisabled)
89030                     .on('click.save', clickSave);
89031
89032
89033                 function isSaveDisabled() {
89034                     return null;
89035                 }
89036
89037
89038                 // restore the original url
89039                 function clickCancel() {
89040                     textSection.select('.field-url').property('value', _origSettings.url);
89041                     context.storage('settings-custom-data-url', _origSettings.url);
89042                     this.blur();
89043                     modal.close();
89044                 }
89045
89046                 // accept the current url
89047                 function clickSave() {
89048                     _currSettings.url = textSection.select('.field-url').property('value').trim();
89049
89050                     // one or the other but not both
89051                     if (_currSettings.url) { _currSettings.fileList = null; }
89052                     if (_currSettings.fileList) { _currSettings.url = ''; }
89053
89054                     context.storage('settings-custom-data-url', _currSettings.url);
89055                     this.blur();
89056                     modal.close();
89057                     dispatch$1.call('change', this, _currSettings);
89058                 }
89059             }
89060
89061             return utilRebind(render, dispatch$1, 'on');
89062         }
89063
89064         function uiMapData(context) {
89065             var key = t('map_data.key');
89066             var osmDataToggleKey = uiCmd('⌥' + t('area_fill.wireframe.key'));
89067             var features = context.features().keys();
89068             var layers = context.layers();
89069             var fills = ['wireframe', 'partial', 'full'];
89070
89071             var settingsCustomData = uiSettingsCustomData(context)
89072                 .on('change', customChanged);
89073
89074             var _pane = d3_select(null), _toggleButton = d3_select(null);
89075
89076             var _fillSelected = context.storage('area-fill') || 'partial';
89077             var _dataLayerContainer = d3_select(null);
89078             var _photoOverlayContainer = d3_select(null);
89079             var _fillList = d3_select(null);
89080             var _featureList = d3_select(null);
89081             var _QAList = d3_select(null);
89082
89083
89084             function showsFeature(d) {
89085                 return context.features().enabled(d);
89086             }
89087
89088
89089             function autoHiddenFeature(d) {
89090                 if (d.type === 'kr_error') return context.errors().autoHidden(d);
89091                 return context.features().autoHidden(d);
89092             }
89093
89094
89095             function clickFeature(d) {
89096                 context.features().toggle(d);
89097                 update();
89098             }
89099
89100
89101             function showsQA(d) {
89102                 var QAKeys = [d];
89103                 var QALayers = layers.all().filter(function(obj) { return QAKeys.indexOf(obj.id) !== -1; });
89104                 var data = QALayers.filter(function(obj) { return obj.layer.supported(); });
89105
89106                 function layerSupported(d) {
89107                     return d.layer && d.layer.supported();
89108                 }
89109                 function layerEnabled(d) {
89110                     return layerSupported(d) && d.layer.enabled();
89111                 }
89112
89113                 return layerEnabled(data[0]);
89114             }
89115
89116
89117             function showsFill(d) {
89118                 return _fillSelected === d;
89119             }
89120
89121
89122             function setFill(d) {
89123                 fills.forEach(function(opt) {
89124                     context.surface().classed('fill-' + opt, Boolean(opt === d));
89125                 });
89126
89127                 _fillSelected = d;
89128                 context.storage('area-fill', d);
89129                 if (d !== 'wireframe') {
89130                     context.storage('area-fill-toggle', d);
89131                 }
89132                 update();
89133             }
89134
89135
89136             function showsLayer(which) {
89137                 var layer = layers.layer(which);
89138                 if (layer) {
89139                     return layer.enabled();
89140                 }
89141                 return false;
89142             }
89143
89144
89145             function setLayer(which, enabled) {
89146                 var layer = layers.layer(which);
89147                 if (layer) {
89148                     layer.enabled(enabled);
89149
89150                     if (!enabled && (which === 'osm' || which === 'notes')) {
89151                         context.enter(modeBrowse(context));
89152                     }
89153
89154                     update();
89155                 }
89156             }
89157
89158
89159             function toggleLayer(which) {
89160                 setLayer(which, !showsLayer(which));
89161             }
89162
89163
89164             function drawPhotoItems(selection) {
89165                 var photoKeys = context.photos().overlayLayerIDs();
89166                 var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
89167                 var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
89168
89169                 function layerSupported(d) {
89170                     return d.layer && d.layer.supported();
89171                 }
89172                 function layerEnabled(d) {
89173                     return layerSupported(d) && d.layer.enabled();
89174                 }
89175
89176                 var ul = selection
89177                     .selectAll('.layer-list-photos')
89178                     .data([0]);
89179
89180                 ul = ul.enter()
89181                     .append('ul')
89182                     .attr('class', 'layer-list layer-list-photos')
89183                     .merge(ul);
89184
89185                 var li = ul.selectAll('.list-item-photos')
89186                     .data(data);
89187
89188                 li.exit()
89189                     .remove();
89190
89191                 var liEnter = li.enter()
89192                     .append('li')
89193                     .attr('class', function(d) {
89194                         var classes = 'list-item-photos list-item-' + d.id;
89195                         if (d.id === 'mapillary-signs') {
89196                             classes += ' indented';
89197                         }
89198                         return classes;
89199                     });
89200
89201                 var labelEnter = liEnter
89202                     .append('label')
89203                     .each(function(d) {
89204                         var titleID;
89205                         if (d.id === 'mapillary-signs') titleID = 'mapillary.signs.tooltip';
89206                         else if (d.id === 'mapillary') titleID = 'mapillary_images.tooltip';
89207                         else if (d.id === 'openstreetcam') titleID = 'openstreetcam_images.tooltip';
89208                         else titleID = d.id.replace('-', '_') + '.tooltip';
89209                         d3_select(this)
89210                             .call(tooltip()
89211                                 .title(t(titleID))
89212                                 .placement('top')
89213                             );
89214                     });
89215
89216                 labelEnter
89217                     .append('input')
89218                     .attr('type', 'checkbox')
89219                     .on('change', function(d) { toggleLayer(d.id); });
89220
89221                 labelEnter
89222                     .append('span')
89223                     .text(function(d) {
89224                         var id = d.id;
89225                         if (id === 'mapillary-signs') id = 'photo_overlays.traffic_signs';
89226                         return t(id.replace('-', '_') + '.title');
89227                     });
89228
89229
89230                 // Update
89231                 li
89232                     .merge(liEnter)
89233                     .classed('active', layerEnabled)
89234                     .selectAll('input')
89235                     .property('checked', layerEnabled);
89236             }
89237
89238             function drawPhotoTypeItems(selection) {
89239                 var data = context.photos().allPhotoTypes();
89240
89241                 function typeEnabled(d) {
89242                     return context.photos().showsPhotoType(d);
89243                 }
89244
89245                 var ul = selection
89246                     .selectAll('.layer-list-photo-types')
89247                     .data(context.photos().shouldFilterByPhotoType() ? [0] : []);
89248
89249                 ul.exit()
89250                     .remove();
89251
89252                 ul = ul.enter()
89253                     .append('ul')
89254                     .attr('class', 'layer-list layer-list-photo-types')
89255                     .merge(ul);
89256
89257                 var li = ul.selectAll('.list-item-photo-types')
89258                     .data(data);
89259
89260                 li.exit()
89261                     .remove();
89262
89263                 var liEnter = li.enter()
89264                     .append('li')
89265                     .attr('class', function(d) {
89266                         return 'list-item-photo-types list-item-' + d;
89267                     });
89268
89269                 var labelEnter = liEnter
89270                     .append('label')
89271                     .each(function(d) {
89272                         d3_select(this)
89273                             .call(tooltip()
89274                                 .title(t('photo_overlays.photo_type.' + d + '.tooltip'))
89275                                 .placement('top')
89276                             );
89277                     });
89278
89279                 labelEnter
89280                     .append('input')
89281                     .attr('type', 'checkbox')
89282                     .on('change', function(d) {
89283                         context.photos().togglePhotoType(d);
89284                         update();
89285                     });
89286
89287                 labelEnter
89288                     .append('span')
89289                     .text(function(d) {
89290                         return t('photo_overlays.photo_type.' + d + '.title');
89291                     });
89292
89293
89294                 // Update
89295                 li
89296                     .merge(liEnter)
89297                     .classed('active', typeEnabled)
89298                     .selectAll('input')
89299                     .property('checked', typeEnabled);
89300             }
89301
89302
89303             function drawOsmItems(selection) {
89304                 var osmKeys = ['osm', 'notes'];
89305                 var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
89306
89307                 var ul = selection
89308                     .selectAll('.layer-list-osm')
89309                     .data([0]);
89310
89311                 ul = ul.enter()
89312                     .append('ul')
89313                     .attr('class', 'layer-list layer-list-osm')
89314                     .merge(ul);
89315
89316                 var li = ul.selectAll('.list-item')
89317                     .data(osmLayers);
89318
89319                 li.exit()
89320                     .remove();
89321
89322                 var liEnter = li.enter()
89323                     .append('li')
89324                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89325
89326                 var labelEnter = liEnter
89327                     .append('label')
89328                     .each(function(d) {
89329                         if (d.id === 'osm') {
89330                             d3_select(this)
89331                                 .call(tooltip()
89332                                     .html(true)
89333                                     .title(uiTooltipHtml(t('map_data.layers.' + d.id + '.tooltip'), osmDataToggleKey))
89334                                     .placement('bottom')
89335                                 );
89336                         } else {
89337                             d3_select(this)
89338                                 .call(tooltip()
89339                                     .title(t('map_data.layers.' + d.id + '.tooltip'))
89340                                     .placement('bottom')
89341                                 );
89342                         }
89343                     });
89344
89345                 labelEnter
89346                     .append('input')
89347                     .attr('type', 'checkbox')
89348                     .on('change', function(d) { toggleLayer(d.id); });
89349
89350                 labelEnter
89351                     .append('span')
89352                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89353
89354
89355                 // Update
89356                 li
89357                     .merge(liEnter)
89358                     .classed('active', function (d) { return d.layer.enabled(); })
89359                     .selectAll('input')
89360                     .property('checked', function (d) { return d.layer.enabled(); });
89361             }
89362
89363
89364             function drawQAItems(selection) {
89365                 var qaKeys = ['keepRight', 'improveOSM'];
89366                 var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; });
89367
89368                 var ul = selection
89369                     .selectAll('.layer-list-qa')
89370                     .data([0]);
89371
89372                 ul = ul.enter()
89373                     .append('ul')
89374                     .attr('class', 'layer-list layer-list-qa')
89375                     .merge(ul);
89376
89377                 var li = ul.selectAll('.list-item')
89378                     .data(qaLayers);
89379
89380                 li.exit()
89381                     .remove();
89382
89383                 var liEnter = li.enter()
89384                     .append('li')
89385                     .attr('class', function(d) { return 'list-item list-item-' + d.id; });
89386
89387                 var labelEnter = liEnter
89388                     .append('label')
89389                     .each(function(d) {
89390                         d3_select(this)
89391                             .call(tooltip()
89392                                 .title(t('map_data.layers.' + d.id + '.tooltip'))
89393                                 .placement('bottom')
89394                             );
89395                     });
89396
89397                 labelEnter
89398                     .append('input')
89399                     .attr('type', 'checkbox')
89400                     .on('change', function(d) { toggleLayer(d.id); });
89401
89402                 labelEnter
89403                     .append('span')
89404                     .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
89405
89406
89407                 // Update
89408                 li
89409                     .merge(liEnter)
89410                     .classed('active', function (d) { return d.layer.enabled(); })
89411                     .selectAll('input')
89412                     .property('checked', function (d) { return d.layer.enabled(); });
89413             }
89414
89415
89416             // Beta feature - sample vector layers to support Detroit Mapping Challenge
89417             // https://github.com/osmus/detroit-mapping-challenge
89418             function drawVectorItems(selection) {
89419                 var dataLayer = layers.layer('data');
89420                 var vtData = [
89421                     {
89422                         name: 'Detroit Neighborhoods/Parks',
89423                         src: 'neighborhoods-parks',
89424                         tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
89425                         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'
89426                     }, {
89427                         name: 'Detroit Composite POIs',
89428                         src: 'composite-poi',
89429                         tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
89430                         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'
89431                     }, {
89432                         name: 'Detroit All-The-Places POIs',
89433                         src: 'alltheplaces-poi',
89434                         tooltip: 'Public domain business location data created by web scrapers.',
89435                         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'
89436                     }
89437                 ];
89438
89439                 // Only show this if the map is around Detroit..
89440                 var detroit = geoExtent([-83.5, 42.1], [-82.8, 42.5]);
89441                 var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
89442
89443                 var container = selection.selectAll('.vectortile-container')
89444                     .data(showVectorItems ? [0] : []);
89445
89446                 container.exit()
89447                     .remove();
89448
89449                 var containerEnter = container.enter()
89450                     .append('div')
89451                     .attr('class', 'vectortile-container');
89452
89453                 containerEnter
89454                     .append('h4')
89455                     .attr('class', 'vectortile-header')
89456                     .text('Detroit Vector Tiles (Beta)');
89457
89458                 containerEnter
89459                     .append('ul')
89460                     .attr('class', 'layer-list layer-list-vectortile');
89461
89462                 containerEnter
89463                     .append('div')
89464                     .attr('class', 'vectortile-footer')
89465                     .append('a')
89466                     .attr('target', '_blank')
89467                     .attr('tabindex', -1)
89468                     .call(svgIcon('#iD-icon-out-link', 'inline'))
89469                     .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
89470                     .append('span')
89471                     .text('About these layers');
89472
89473                 container = container
89474                     .merge(containerEnter);
89475
89476
89477                 var ul = container.selectAll('.layer-list-vectortile');
89478
89479                 var li = ul.selectAll('.list-item')
89480                     .data(vtData);
89481
89482                 li.exit()
89483                     .remove();
89484
89485                 var liEnter = li.enter()
89486                     .append('li')
89487                     .attr('class', function(d) { return 'list-item list-item-' + d.src; });
89488
89489                 var labelEnter = liEnter
89490                     .append('label')
89491                     .each(function(d) {
89492                         d3_select(this).call(
89493                             tooltip().title(d.tooltip).placement('top')
89494                         );
89495                     });
89496
89497                 labelEnter
89498                     .append('input')
89499                     .attr('type', 'radio')
89500                     .attr('name', 'vectortile')
89501                     .on('change', selectVTLayer);
89502
89503                 labelEnter
89504                     .append('span')
89505                     .text(function(d) { return d.name; });
89506
89507                 // Update
89508                 li
89509                     .merge(liEnter)
89510                     .classed('active', isVTLayerSelected)
89511                     .selectAll('input')
89512                     .property('checked', isVTLayerSelected);
89513
89514
89515                 function isVTLayerSelected(d) {
89516                     return dataLayer && dataLayer.template() === d.template;
89517                 }
89518
89519                 function selectVTLayer(d) {
89520                     context.storage('settings-custom-data-url', d.template);
89521                     if (dataLayer) {
89522                         dataLayer.template(d.template, d.src);
89523                         dataLayer.enabled(true);
89524                     }
89525                 }
89526             }
89527
89528
89529             function drawCustomDataItems(selection) {
89530                 var dataLayer = layers.layer('data');
89531                 var hasData = dataLayer && dataLayer.hasData();
89532                 var showsData = hasData && dataLayer.enabled();
89533
89534                 var ul = selection
89535                     .selectAll('.layer-list-data')
89536                     .data(dataLayer ? [0] : []);
89537
89538                 // Exit
89539                 ul.exit()
89540                     .remove();
89541
89542                 // Enter
89543                 var ulEnter = ul.enter()
89544                     .append('ul')
89545                     .attr('class', 'layer-list layer-list-data');
89546
89547                 var liEnter = ulEnter
89548                     .append('li')
89549                     .attr('class', 'list-item-data');
89550
89551                 liEnter
89552                     .append('button')
89553                     .call(tooltip()
89554                         .title(t('settings.custom_data.tooltip'))
89555                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89556                     )
89557                     .on('click', editCustom)
89558                     .call(svgIcon('#iD-icon-more'));
89559
89560                 liEnter
89561                     .append('button')
89562                     .call(tooltip()
89563                         .title(t('map_data.layers.custom.zoom'))
89564                         .placement((textDirection === 'rtl') ? 'right' : 'left')
89565                     )
89566                     .on('click', function() {
89567                         event.preventDefault();
89568                         event.stopPropagation();
89569                         dataLayer.fitZoom();
89570                     })
89571                     .call(svgIcon('#iD-icon-search'));
89572
89573                 var labelEnter = liEnter
89574                     .append('label')
89575                     .call(tooltip()
89576                         .title(t('map_data.layers.custom.tooltip'))
89577                         .placement('top')
89578                     );
89579
89580                 labelEnter
89581                     .append('input')
89582                     .attr('type', 'checkbox')
89583                     .on('change', function() { toggleLayer('data'); });
89584
89585                 labelEnter
89586                     .append('span')
89587                     .text(t('map_data.layers.custom.title'));
89588
89589                 // Update
89590                 ul = ul
89591                     .merge(ulEnter);
89592
89593                 ul.selectAll('.list-item-data')
89594                     .classed('active', showsData)
89595                     .selectAll('label')
89596                     .classed('deemphasize', !hasData)
89597                     .selectAll('input')
89598                     .property('disabled', !hasData)
89599                     .property('checked', showsData);
89600             }
89601
89602
89603             function editCustom() {
89604                 event.preventDefault();
89605                 context.container()
89606                     .call(settingsCustomData);
89607             }
89608
89609
89610             function customChanged(d) {
89611                 var dataLayer = layers.layer('data');
89612
89613                 if (d && d.url) {
89614                     dataLayer.url(d.url);
89615                 } else if (d && d.fileList) {
89616                     dataLayer.fileList(d.fileList);
89617                 }
89618             }
89619
89620
89621             function drawListItems(selection, data, type, name, change, active) {
89622                 var items = selection.selectAll('li')
89623                     .data(data);
89624
89625                 // Exit
89626                 items.exit()
89627                     .remove();
89628
89629                 // Enter
89630                 var enter = items.enter()
89631                     .append('li')
89632                     .call(tooltip()
89633                         .html(true)
89634                         .title(function(d) {
89635                             var tip = t(name + '.' + d + '.tooltip');
89636                             var key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
89637                             if ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d)) {
89638                                 var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
89639                                 tip += '<div>' + msg + '</div>';
89640                             }
89641                             return uiTooltipHtml(tip, key);
89642                         })
89643                         .placement('top')
89644                     );
89645
89646                 var label = enter
89647                     .append('label');
89648
89649                 label
89650                     .append('input')
89651                     .attr('type', type)
89652                     .attr('name', name)
89653                     .on('change', change);
89654
89655                 label
89656                     .append('span')
89657                     .text(function(d) { return t(name + '.' + d + '.description'); });
89658
89659                 // Update
89660                 items = items
89661                     .merge(enter);
89662
89663                 items
89664                     .classed('active', active)
89665                     .selectAll('input')
89666                     .property('checked', active)
89667                     .property('indeterminate', function(d) {
89668                         return ((name === 'feature' || name === 'keepRight') && autoHiddenFeature(d));
89669                     });
89670             }
89671
89672
89673             function renderDataLayers(selection) {
89674                 var container = selection.selectAll('.data-layer-container')
89675                     .data([0]);
89676
89677                 _dataLayerContainer = container.enter()
89678                     .append('div')
89679                     .attr('class', 'data-layer-container')
89680                     .merge(container);
89681
89682                 updateDataLayers();
89683             }
89684
89685             function renderPhotoOverlays(selection) {
89686                 var container = selection.selectAll('.photo-overlay-container')
89687                     .data([0]);
89688
89689                 _photoOverlayContainer = container.enter()
89690                     .append('div')
89691                     .attr('class', 'photo-overlay-container')
89692                     .merge(container);
89693
89694                 updatePhotoOverlays();
89695             }
89696
89697
89698             function renderFillList(selection) {
89699                 var container = selection.selectAll('.layer-fill-list')
89700                     .data([0]);
89701
89702                 _fillList = container.enter()
89703                     .append('ul')
89704                     .attr('class', 'layer-list layer-fill-list')
89705                     .merge(container);
89706
89707                 updateFillList();
89708             }
89709
89710
89711             function renderFeatureList(selection) {
89712                 var container = selection.selectAll('.layer-feature-list-container')
89713                     .data([0]);
89714
89715                 var containerEnter = container.enter()
89716                     .append('div')
89717                     .attr('class', 'layer-feature-list-container');
89718
89719                 containerEnter
89720                     .append('ul')
89721                     .attr('class', 'layer-list layer-feature-list');
89722
89723                 var footer = containerEnter
89724                     .append('div')
89725                     .attr('class', 'feature-list-links section-footer');
89726
89727                 footer
89728                     .append('a')
89729                     .attr('class', 'feature-list-link')
89730                     .attr('href', '#')
89731                     .text(t('issues.enable_all'))
89732                     .on('click', function() {
89733                         context.features().enableAll();
89734                     });
89735
89736                 footer
89737                     .append('a')
89738                     .attr('class', 'feature-list-link')
89739                     .attr('href', '#')
89740                     .text(t('issues.disable_all'))
89741                     .on('click', function() {
89742                         context.features().disableAll();
89743                     });
89744
89745                 // Update
89746                 container = container
89747                     .merge(containerEnter);
89748
89749                 _featureList = container.selectAll('.layer-feature-list');
89750
89751                 updateFeatureList();
89752             }
89753
89754             function updatePhotoOverlays() {
89755                 _photoOverlayContainer
89756                     .call(drawPhotoItems)
89757                     .call(drawPhotoTypeItems);
89758             }
89759
89760             function updateDataLayers() {
89761                 _dataLayerContainer
89762                     .call(drawOsmItems)
89763                     .call(drawQAItems)
89764                     .call(drawCustomDataItems)
89765                     .call(drawVectorItems);      // Beta - Detroit mapping challenge
89766             }
89767
89768             function updateFillList() {
89769                 _fillList
89770                     .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
89771             }
89772
89773             function updateFeatureList() {
89774                 _featureList
89775                     .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
89776             }
89777
89778             function update() {
89779
89780                 if (!_pane.select('.disclosure-wrap-data_layers').classed('hide')) {
89781                     updateDataLayers();
89782                 }
89783                 if (!_pane.select('.disclosure-wrap-photo_overlays').classed('hide')) {
89784                     updatePhotoOverlays();
89785                 }
89786                 if (!_pane.select('.disclosure-wrap-fill_area').classed('hide')) {
89787                     updateFillList();
89788                 }
89789                 if (!_pane.select('.disclosure-wrap-map_features').classed('hide')) {
89790                     updateFeatureList();
89791                 }
89792
89793                 _QAList
89794                     .call(drawListItems, ['keep-right'], 'checkbox', 'QA', function(d) { toggleLayer(d); }, showsQA);
89795             }
89796
89797
89798             function toggleWireframe() {
89799                 if (event) {
89800                     event.preventDefault();
89801                     event.stopPropagation();
89802                 }
89803
89804                 if (_fillSelected === 'wireframe') {
89805                     _fillSelected = context.storage('area-fill-toggle') || 'partial';
89806                 } else {
89807                     _fillSelected = 'wireframe';
89808                 }
89809
89810                 setFill(_fillSelected);
89811                 context.map().pan([0,0]);  // trigger a redraw
89812             }
89813
89814             var paneTooltip = tooltip()
89815                 .placement((textDirection === 'rtl') ? 'right' : 'left')
89816                 .html(true)
89817                 .title(uiTooltipHtml(t('map_data.description'), key));
89818
89819             function hidePane() {
89820                 context.ui().togglePanes();
89821             }
89822
89823             uiMapData.togglePane = function() {
89824                 if (event) event.preventDefault();
89825                 paneTooltip.hide(_toggleButton);
89826                 context.ui().togglePanes(!_pane.classed('shown') ? _pane : undefined);
89827             };
89828
89829             uiMapData.renderToggleButton = function(selection) {
89830
89831                 _toggleButton = selection
89832                     .append('button')
89833                     .attr('tabindex', -1)
89834                     .on('click', uiMapData.togglePane)
89835                     .call(svgIcon('#iD-icon-data', 'light'))
89836                     .call(paneTooltip);
89837             };
89838
89839
89840             uiMapData.renderPane = function(selection) {
89841
89842                 _pane = selection
89843                     .append('div')
89844                     .attr('class', 'fillL map-pane map-data-pane hide')
89845                     .attr('pane', 'map-data');
89846
89847                 var heading = _pane
89848                     .append('div')
89849                     .attr('class', 'pane-heading');
89850
89851                 heading
89852                     .append('h2')
89853                     .text(t('map_data.title'));
89854
89855                 heading
89856                     .append('button')
89857                     .on('click', hidePane)
89858                     .call(svgIcon('#iD-icon-close'));
89859
89860
89861                 var content = _pane
89862                     .append('div')
89863                     .attr('class', 'pane-content');
89864
89865
89866                 // data layers
89867                 content
89868                     .append('div')
89869                     .attr('class', 'map-data-data-layers')
89870                     .call(uiDisclosure(context, 'data_layers', true)
89871                         .title(t('map_data.data_layers'))
89872                         .content(renderDataLayers)
89873                     );
89874
89875                 // photo overlays
89876                 content
89877                     .append('div')
89878                     .attr('class', 'map-data-photo-overlays')
89879                     .call(uiDisclosure(context, 'photo_overlays', false)
89880                         .title(t('photo_overlays.title'))
89881                         .content(renderPhotoOverlays)
89882                     );
89883
89884                 // area fills
89885                 content
89886                     .append('div')
89887                     .attr('class', 'map-data-area-fills')
89888                     .call(uiDisclosure(context, 'fill_area', false)
89889                         .title(t('map_data.fill_area'))
89890                         .content(renderFillList)
89891                     );
89892
89893                 // feature filters
89894                 content
89895                     .append('div')
89896                     .attr('class', 'map-data-feature-filters')
89897                     .call(uiDisclosure(context, 'map_features', false)
89898                         .title(t('map_data.map_features'))
89899                         .content(renderFeatureList)
89900                     );
89901
89902
89903                 // add listeners
89904                 context.features()
89905                     .on('change.map_data-update', update);
89906
89907                 update();
89908                 setFill(_fillSelected);
89909
89910                 context.keybinding()
89911                     .on(key, uiMapData.togglePane)
89912                     .on(t('area_fill.wireframe.key'), toggleWireframe)
89913                     .on(osmDataToggleKey, function() {
89914                         event.preventDefault();
89915                         event.stopPropagation();
89916                         toggleLayer('osm');
89917                     });
89918             };
89919
89920             return uiMapData;
89921         }
89922
89923         function uiNotice(context) {
89924
89925             return function(selection) {
89926                 var div = selection
89927                     .append('div')
89928                     .attr('class', 'notice');
89929
89930                 var button = div
89931                     .append('button')
89932                     .attr('class', 'zoom-to notice fillD')
89933                     .on('click', function() {
89934                         context.map().zoomEase(context.minEditableZoom());
89935                     })
89936                     .on('wheel', function() {   // let wheel events pass through #4482
89937                         var e2 = new WheelEvent(event.type, event);
89938                         context.surface().node().dispatchEvent(e2);
89939                     });
89940
89941                 button
89942                     .call(svgIcon('#iD-icon-plus', 'pre-text'))
89943                     .append('span')
89944                     .attr('class', 'label')
89945                     .text(t('zoom_in_edit'));
89946
89947
89948                 function disableTooHigh() {
89949                     var canEdit = context.map().zoom() >= context.minEditableZoom();
89950                     div.style('display', canEdit ? 'none' : 'block');
89951                 }
89952
89953                 context.map()
89954                     .on('move.notice', debounce(disableTooHigh, 500));
89955
89956                 disableTooHigh();
89957             };
89958         }
89959
89960         function uiPhotoviewer(context) {
89961
89962             var dispatch$1 = dispatch('resize');
89963
89964             function photoviewer(selection) {
89965                 selection
89966                     .append('button')
89967                     .attr('class', 'thumb-hide')
89968                     .on('click', function () {
89969                         if (services$1.streetside) { services$1.streetside.hideViewer(); }
89970                         if (services$1.mapillary) { services$1.mapillary.hideViewer(); }
89971                         if (services$1.openstreetcam) { services$1.openstreetcam.hideViewer(); }
89972                     })
89973                     .append('div')
89974                     .call(svgIcon('#iD-icon-close'));
89975
89976                 selection
89977                     .append('button')
89978                     .attr('class', 'resize-handle-xy')
89979                     .on(
89980                         'mousedown',
89981                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true, resizeOnY: true })
89982                     );
89983
89984                 selection
89985                     .append('button')
89986                     .attr('class', 'resize-handle-x')
89987                     .on(
89988                         'mousedown',
89989                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnX: true })
89990                     );
89991
89992                 selection
89993                     .append('button')
89994                     .attr('class', 'resize-handle-y')
89995                     .on(
89996                         'mousedown',
89997                         buildResizeListener(selection, 'resize', dispatch$1, { resizeOnY: true })
89998                     );
89999
90000                 services$1.streetside.loadViewer(context);
90001                 services$1.mapillary.loadViewer(context);
90002                 services$1.openstreetcam.loadViewer(context);
90003
90004                 function buildResizeListener(target, eventName, dispatch, options) {
90005                     var resizeOnX = !!options.resizeOnX;
90006                     var resizeOnY = !!options.resizeOnY;
90007                     var minHeight = options.minHeight || 240;
90008                     var minWidth = options.minWidth || 320;
90009                     var startX;
90010                     var startY;
90011                     var startWidth;
90012                     var startHeight;
90013
90014                     function startResize() {
90015                         var mapSize = context.map().dimensions();
90016
90017                         if (resizeOnX) {
90018                             var maxWidth = mapSize[0];
90019                             var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
90020                             target.style('width', newWidth + 'px');
90021                         }
90022
90023                         if (resizeOnY) {
90024                             var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
90025                             var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
90026                             target.style('height', newHeight + 'px');
90027                         }
90028
90029                         dispatch.call(eventName, target, utilGetDimensions(target, true));
90030                     }
90031
90032                     function clamp(num, min, max) {
90033                         return Math.max(min, Math.min(num, max));
90034                     }
90035
90036                     function stopResize() {
90037                         d3_select(window)
90038                             .on('.' + eventName, null);
90039                     }
90040
90041                     return function initResize() {
90042                         startX = event.clientX;
90043                         startY = event.clientY;
90044                         startWidth = target.node().getBoundingClientRect().width;
90045                         startHeight = target.node().getBoundingClientRect().height;
90046
90047                         d3_select(window)
90048                             .on('mousemove.' + eventName, startResize, false)
90049                             .on('mouseup.' + eventName, stopResize, false);
90050                     };
90051                 }
90052             }
90053
90054             photoviewer.onMapResize = function() {
90055                 var photoviewer = d3_select('#photoviewer');
90056                 var content = d3_select('#content');
90057                 var mapDimensions = utilGetDimensions(content, true);
90058                 // shrink photo viewer if it is too big
90059                 // (-90 preserves space at top and bottom of map used by menus)
90060                 var photoDimensions = utilGetDimensions(photoviewer, true);
90061                 if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
90062                     var setPhotoDimensions = [
90063                         Math.min(photoDimensions[0], mapDimensions[0]),
90064                         Math.min(photoDimensions[1], mapDimensions[1] - 90),
90065                     ];
90066
90067                     photoviewer
90068                         .style('width', setPhotoDimensions[0] + 'px')
90069                         .style('height', setPhotoDimensions[1] + 'px');
90070
90071                     dispatch$1.call('resize', photoviewer, setPhotoDimensions);
90072                 }
90073             };
90074
90075             return utilRebind(photoviewer, dispatch$1, 'on');
90076         }
90077
90078         function uiRestore(context) {
90079
90080             return function(selection) {
90081                 if (!context.history().lock() || !context.history().restorableChanges())
90082                     return;
90083
90084                 var modalSelection = uiModal(selection, true);
90085
90086                 modalSelection.select('.modal')
90087                     .attr('class', 'modal fillL');
90088
90089                 var introModal = modalSelection.select('.content');
90090
90091                 introModal
90092                     .append('div')
90093                     .attr('class', 'modal-section')
90094                     .append('h3')
90095                     .text(t('restore.heading'));
90096
90097                 introModal
90098                     .append('div')
90099                     .attr('class','modal-section')
90100                     .append('p')
90101                     .text(t('restore.description'));
90102
90103                 var buttonWrap = introModal
90104                     .append('div')
90105                     .attr('class', 'modal-actions');
90106
90107                 var restore = buttonWrap
90108                     .append('button')
90109                     .attr('class', 'restore')
90110                     .on('click', function() {
90111                         context.history().restore();
90112                         modalSelection.remove();
90113                     });
90114
90115                 restore
90116                     .append('svg')
90117                     .attr('class', 'logo logo-restore')
90118                     .append('use')
90119                     .attr('xlink:href', '#iD-logo-restore');
90120
90121                 restore
90122                     .append('div')
90123                     .text(t('restore.restore'));
90124
90125                 var reset = buttonWrap
90126                     .append('button')
90127                     .attr('class', 'reset')
90128                     .on('click', function() {
90129                         context.history().clearSaved();
90130                         modalSelection.remove();
90131                     });
90132
90133                 reset
90134                     .append('svg')
90135                     .attr('class', 'logo logo-reset')
90136                     .append('use')
90137                     .attr('xlink:href', '#iD-logo-reset');
90138
90139                 reset
90140                     .append('div')
90141                     .text(t('restore.reset'));
90142
90143                 restore.node().focus();
90144             };
90145         }
90146
90147         function uiScale(context) {
90148             var projection = context.projection,
90149                 isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
90150                 maxLength = 180,
90151                 tickHeight = 8;
90152
90153
90154             function scaleDefs(loc1, loc2) {
90155                 var lat = (loc2[1] + loc1[1]) / 2,
90156                     conversion = (isImperial ? 3.28084 : 1),
90157                     dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
90158                     scale = { dist: 0, px: 0, text: '' },
90159                     buckets, i, val, dLon;
90160
90161                 if (isImperial) {
90162                     buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
90163                 } else {
90164                     buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
90165                 }
90166
90167                 // determine a user-friendly endpoint for the scale
90168                 for (i = 0; i < buckets.length; i++) {
90169                     val = buckets[i];
90170                     if (dist >= val) {
90171                         scale.dist = Math.floor(dist / val) * val;
90172                         break;
90173                     } else {
90174                         scale.dist = +dist.toFixed(2);
90175                     }
90176                 }
90177
90178                 dLon = geoMetersToLon(scale.dist / conversion, lat);
90179                 scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
90180
90181                 scale.text = displayLength(scale.dist / conversion, isImperial);
90182
90183                 return scale;
90184             }
90185
90186
90187             function update(selection) {
90188                 // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
90189                 var dims = context.map().dimensions(),
90190                     loc1 = projection.invert([0, dims[1]]),
90191                     loc2 = projection.invert([maxLength, dims[1]]),
90192                     scale = scaleDefs(loc1, loc2);
90193
90194                 selection.select('#scale-path')
90195                     .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
90196
90197                 selection.select('#scale-textgroup')
90198                     .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
90199
90200                 selection.select('#scale-text')
90201                     .text(scale.text);
90202             }
90203
90204
90205             return function(selection) {
90206                 function switchUnits() {
90207                     isImperial = !isImperial;
90208                     selection.call(update);
90209                 }
90210
90211                 var scalegroup = selection.append('svg')
90212                     .attr('id', 'scale')
90213                     .on('click', switchUnits)
90214                     .append('g')
90215                     .attr('transform', 'translate(10,11)');
90216
90217                 scalegroup
90218                     .append('path')
90219                     .attr('id', 'scale-path');
90220
90221                 scalegroup
90222                     .append('g')
90223                     .attr('id', 'scale-textgroup')
90224                     .append('text')
90225                     .attr('id', 'scale-text');
90226
90227                 selection.call(update);
90228
90229                 context.map().on('move.scale', function() {
90230                     update(selection);
90231                 });
90232             };
90233         }
90234
90235         var pair_1 = pair$1;
90236
90237         function search(x, dims, r) {
90238           if (!dims) dims = 'NSEW';
90239           if (typeof x !== 'string') return { val: null, regex: r };
90240
90241           r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
90242
90243           var m = r.exec(x);
90244           if (!m) return { val: null, regex: r };
90245
90246           var dim = m[1] || m[5];
90247           if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
90248
90249           return {
90250             val: (((m[2]) ? parseFloat(m[2]) : 0) +
90251                   ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
90252                   ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
90253                   ((dim === 'S' || dim === 'W') ? -1 : 1),
90254             regex: r,
90255             raw: m[0],
90256             dim: dim
90257           };
90258         }
90259
90260         function pair$1(x, dims) {
90261           x = x.trim();
90262           var one = search(x, dims);
90263           if (one.val === null) return null;
90264           var two = search(x, dims, one.regex);
90265           if (two.val === null) return null;
90266           // null if one/two are not contiguous.
90267           if (one.raw + two.raw !== x) return null;
90268           if (one.dim) {
90269             return swapdim(one.val, two.val, one.dim);
90270           } else {
90271             return [one.val, two.val];
90272           }
90273         }
90274
90275         function swapdim(a, b, dim) {
90276           if (dim === 'N' || dim === 'S') return [a, b];
90277           if (dim === 'W' || dim === 'E') return [b, a];
90278         }
90279
90280         function uiFeatureList(context) {
90281             var _geocodeResults;
90282
90283
90284             function featureList(selection) {
90285                 var header = selection
90286                     .append('div')
90287                     .attr('class', 'header fillL cf');
90288
90289                 header
90290                     .append('h3')
90291                     .text(t('inspector.feature_list'));
90292
90293                 var searchWrap = selection
90294                     .append('div')
90295                     .attr('class', 'search-header');
90296
90297                 var search = searchWrap
90298                     .append('input')
90299                     .attr('placeholder', t('inspector.search'))
90300                     .attr('type', 'search')
90301                     .call(utilNoAuto)
90302                     .on('keypress', keypress)
90303                     .on('keydown', keydown)
90304                     .on('input', inputevent);
90305
90306                 searchWrap
90307                     .call(svgIcon('#iD-icon-search', 'pre-text'));
90308
90309                 var listWrap = selection
90310                     .append('div')
90311                     .attr('class', 'inspector-body');
90312
90313                 var list = listWrap
90314                     .append('div')
90315                     .attr('class', 'feature-list cf');
90316
90317                 context
90318                     .on('exit.feature-list', clearSearch);
90319                 context.map()
90320                     .on('drawn.feature-list', mapDrawn);
90321
90322                 context.keybinding()
90323                     .on(uiCmd('⌘F'), focusSearch);
90324
90325
90326                 function focusSearch() {
90327                     var mode = context.mode() && context.mode().id;
90328                     if (mode !== 'browse') return;
90329
90330                     event.preventDefault();
90331                     search.node().focus();
90332                 }
90333
90334
90335                 function keydown() {
90336                     if (event.keyCode === 27) {  // escape
90337                         search.node().blur();
90338                     }
90339                 }
90340
90341
90342                 function keypress() {
90343                     var q = search.property('value'),
90344                         items = list.selectAll('.feature-list-item');
90345                     if (event.keyCode === 13 && q.length && items.size()) {  // return
90346                         click(items.datum());
90347                     }
90348                 }
90349
90350
90351                 function inputevent() {
90352                     _geocodeResults = undefined;
90353                     drawList();
90354                 }
90355
90356
90357                 function clearSearch() {
90358                     search.property('value', '');
90359                     drawList();
90360                 }
90361
90362
90363                 function mapDrawn(e) {
90364                     if (e.full) {
90365                         drawList();
90366                     }
90367                 }
90368
90369
90370                 function features() {
90371                     var entities = {};
90372                     var result = [];
90373                     var graph = context.graph();
90374                     var q = search.property('value').toLowerCase();
90375
90376                     if (!q) return result;
90377
90378                     var idMatch = q.match(/^([nwr])([0-9]+)$/);
90379
90380                     if (idMatch) {
90381                         result.push({
90382                             id: idMatch[0],
90383                             geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
90384                             type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
90385                             name: idMatch[2]
90386                         });
90387                     }
90388
90389                     var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
90390
90391                     if (locationMatch) {
90392                         var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
90393                         result.push({
90394                             id: -1,
90395                             geometry: 'point',
90396                             type: t('inspector.location'),
90397                             name: dmsCoordinatePair([loc[1], loc[0]]),
90398                             location: loc
90399                         });
90400                     }
90401
90402                     function addEntity(entity) {
90403                         if (entity.id in entities || result.length > 200)
90404                             return;
90405
90406                         entities[entity.id] = true;
90407
90408                         var name = utilDisplayName(entity) || '';
90409                         if (name.toLowerCase().indexOf(q) >= 0) {
90410                             var matched = context.presets().match(entity, graph);
90411                             var type = (matched && matched.name()) || utilDisplayType(entity.id);
90412
90413                             result.push({
90414                                 id: entity.id,
90415                                 entity: entity,
90416                                 geometry: context.geometry(entity.id),
90417                                 type: type,
90418                                 name: name
90419                             });
90420                         }
90421
90422                         graph.parentRelations(entity).forEach(function(parent) {
90423                             addEntity(parent);
90424                         });
90425                     }
90426
90427                     var visible = context.surface().selectAll('.point, .line, .area').nodes();
90428                     for (var i = 0; i < visible.length && result.length <= 200; i++) {
90429                         var datum = visible[i].__data__;
90430                         var entity = datum && datum.properties && datum.properties.entity;
90431                         if (entity) { addEntity(entity); }
90432                     }
90433
90434                     (_geocodeResults || []).forEach(function(d) {
90435                         if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
90436
90437                             // Make a temporary osmEntity so we can preset match
90438                             // and better localize the search result - #4725
90439                             var id = osmEntity.id.fromOSM(d.osm_type, d.osm_id);
90440                             var tags = {};
90441                             tags[d.class] = d.type;
90442
90443                             var attrs = { id: id, type: d.osm_type, tags: tags };
90444                             if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
90445                                 attrs.nodes = ['a','a'];  // so that geometry area is possible
90446                             }
90447
90448                             var tempEntity = osmEntity(attrs);
90449                             var tempGraph = coreGraph([tempEntity]);
90450                             var matched = context.presets().match(tempEntity, tempGraph);
90451                             var type = (matched && matched.name()) || utilDisplayType(id);
90452
90453                             result.push({
90454                                 id: tempEntity.id,
90455                                 geometry: tempEntity.geometry(tempGraph),
90456                                 type: type,
90457                                 name: d.display_name,
90458                                 extent: new geoExtent(
90459                                     [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
90460                                     [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
90461                             });
90462                         }
90463                     });
90464
90465                     return result;
90466                 }
90467
90468
90469                 function drawList() {
90470                     var value = search.property('value');
90471                     var results = features();
90472
90473                     list.classed('filtered', value.length);
90474
90475                     var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
90476
90477                     var resultsIndicator = list.selectAll('.no-results-item')
90478                         .data([0])
90479                         .enter()
90480                         .append('button')
90481                         .property('disabled', true)
90482                         .attr('class', 'no-results-item')
90483                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
90484
90485                     resultsIndicator.append('span')
90486                         .attr('class', 'entity-name');
90487
90488                     list.selectAll('.no-results-item .entity-name')
90489                         .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
90490
90491                     if (services$1.geocoder) {
90492                       list.selectAll('.geocode-item')
90493                           .data([0])
90494                           .enter()
90495                           .append('button')
90496                           .attr('class', 'geocode-item')
90497                           .on('click', geocoderSearch)
90498                           .append('div')
90499                           .attr('class', 'label')
90500                           .append('span')
90501                           .attr('class', 'entity-name')
90502                           .text(t('geocoder.search'));
90503                     }
90504
90505                     list.selectAll('.no-results-item')
90506                         .style('display', (value.length && !results.length) ? 'block' : 'none');
90507
90508                     list.selectAll('.geocode-item')
90509                         .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
90510
90511                     list.selectAll('.feature-list-item')
90512                         .data([-1])
90513                         .remove();
90514
90515                     var items = list.selectAll('.feature-list-item')
90516                         .data(results, function(d) { return d.id; });
90517
90518                     var enter = items.enter()
90519                         .insert('button', '.geocode-item')
90520                         .attr('class', 'feature-list-item')
90521                         .on('mouseover', mouseover)
90522                         .on('mouseout', mouseout)
90523                         .on('click', click);
90524
90525                     var label = enter
90526                         .append('div')
90527                         .attr('class', 'label');
90528
90529                     label
90530                         .each(function(d) {
90531                             d3_select(this)
90532                                 .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
90533                         });
90534
90535                     label
90536                         .append('span')
90537                         .attr('class', 'entity-type')
90538                         .text(function(d) { return d.type; });
90539
90540                     label
90541                         .append('span')
90542                         .attr('class', 'entity-name')
90543                         .text(function(d) { return d.name; });
90544
90545                     enter
90546                         .style('opacity', 0)
90547                         .transition()
90548                         .style('opacity', 1);
90549
90550                     items.order();
90551
90552                     items.exit()
90553                         .remove();
90554                 }
90555
90556
90557                 function mouseover(d) {
90558                     if (d.id === -1) return;
90559
90560                     context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
90561                         .classed('hover', true);
90562                 }
90563
90564
90565                 function mouseout() {
90566                     context.surface().selectAll('.hover')
90567                         .classed('hover', false);
90568                 }
90569
90570
90571                 function click(d) {
90572                     event.preventDefault();
90573                     if (d.location) {
90574                         context.map().centerZoomEase([d.location[1], d.location[0]], 19);
90575                     }
90576                     else if (d.entity) {
90577                         if (d.entity.type === 'node') {
90578                             context.map().center(d.entity.loc);
90579                         } else if (d.entity.type === 'way') {
90580                             var center = context.projection(context.map().center());
90581                             var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
90582                             context.map().center(edge.loc);
90583                         }
90584                         context.enter(modeSelect(context, [d.entity.id]));
90585                     } else {
90586                         context.zoomToEntity(d.id);
90587                     }
90588                 }
90589
90590
90591                 function geocoderSearch() {
90592                     services$1.geocoder.search(search.property('value'), function (err, resp) {
90593                         _geocodeResults = resp || [];
90594                         drawList();
90595                     });
90596                 }
90597             }
90598
90599
90600             return featureList;
90601         }
90602
90603         function uiPresetFavoriteButton(preset, geom, context, klass) {
90604
90605             geom = context.presets().fallback(geom).id;
90606
90607             var presetFavorite = {};
90608
90609             var _button = d3_select(null);
90610
90611
90612             presetFavorite.button = function(selection) {
90613
90614                 _button = selection.selectAll('.preset-favorite-button')
90615                     .data([]);
90616
90617                 _button.exit().remove();
90618
90619                 _button = _button.enter()
90620                     .insert('button', '.tag-reference-button')
90621                     .attr('class', 'preset-favorite-button ' + klass)
90622                     .attr('title', t('icons.favorite'))
90623                     .attr('tabindex', -1)
90624                     .call(svgIcon('#iD-icon-favorite'))
90625                     .merge(_button);
90626
90627                 _button
90628                     .on('click', function () {
90629                         event.stopPropagation();
90630                         event.preventDefault();
90631
90632                         context.presets().toggleFavorite(preset, geom);
90633
90634                         update();
90635                     });
90636
90637                 update();
90638             };
90639
90640             function update() {
90641                 _button
90642                     .classed('active', context.presets().favoriteMatching(preset, geom));
90643             }
90644
90645             context.presets().on('favoritePreset.button-' + preset.id.replace(/[^a-zA-Z\d:]/g, '-') + '-' + geom, update);
90646
90647             return presetFavorite;
90648         }
90649
90650         function uiPresetIcon(context) {
90651             var preset, geometry, sizeClass = 'medium';
90652
90653             function isSmall() {
90654                 return sizeClass === 'small';
90655             }
90656
90657
90658             function presetIcon(selection) {
90659                 selection.each(render);
90660             }
90661
90662
90663             function getIcon(p, geom) {
90664                 if (isSmall() && p.isFallback && p.isFallback())
90665                     return 'iD-icon-' + p.id;
90666                 else if (p.icon)
90667                     return p.icon;
90668                 else if (geom === 'line')
90669                     return 'iD-other-line';
90670                 else if (geom === 'vertex')
90671                     return p.isFallback() ? '' : 'temaki-vertex';
90672                 else if (isSmall() && geom === 'point')
90673                     return '';
90674                 else
90675                     return 'maki-marker-stroked';
90676             }
90677
90678             function renderPointBorder(enter) {
90679                 var w = 40, h = 40;
90680                 enter = enter
90681                     .append('svg')
90682                     .attr('class', 'preset-icon-fill preset-icon-point-border')
90683                     .attr('width', w)
90684                     .attr('height', h)
90685                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90686
90687                 enter.append('path')
90688                     .attr('transform', 'translate(11.5, 8)')
90689                     .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');
90690             }
90691
90692             function renderCircleFill(fillEnter) {
90693                 var w = 60, h = 60, d = 40;
90694                 fillEnter = fillEnter
90695                     .append('svg')
90696                     .attr('class', 'preset-icon-fill preset-icon-fill-vertex')
90697                     .attr('width', w)
90698                     .attr('height', h)
90699                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90700
90701                 fillEnter.append('circle')
90702                     .attr('cx', w/2)
90703                     .attr('cy', h/2)
90704                     .attr('r', d/2);
90705             }
90706
90707             function renderSquareFill(fillEnter) {
90708                 var d = isSmall() ? 40 : 60;
90709                 var w = d, h = d, l = d*2/3, c1 = (w-l)/2, c2 = c1 + l;
90710                 fillEnter = fillEnter
90711                     .append('svg')
90712                     .attr('class', 'preset-icon-fill preset-icon-fill-area')
90713                     .attr('width', w)
90714                     .attr('height', h)
90715                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90716
90717                 var data = 'M' + c1 + ' ' + c1 + ' L' + c1 + ' ' + c2 + ' L' + c2 + ' ' + c2 + ' L' + c2 + ' ' + c1 + ' Z';
90718
90719                 fillEnter.append('path')
90720                     .attr('d', data)
90721                     .attr('class', 'line area fill');
90722
90723                 fillEnter.append('path')
90724                     .attr('d', data)
90725                     .attr('class', 'line area stroke');
90726
90727                 var r = 2.5;
90728                 var coordinates = [c1, c2];
90729                 for (var xIndex in coordinates) {
90730                     for (var yIndex in coordinates) {
90731                         fillEnter.append('circle')
90732                             .attr('class', 'vertex')
90733                             .attr('cx', coordinates[xIndex])
90734                             .attr('cy', coordinates[yIndex])
90735                             .attr('r', r);
90736                     }
90737                 }
90738
90739                 if (!isSmall()) {
90740                     var midCoordinates = [[c1, w/2], [c2, w/2], [h/2, c1], [h/2, c2]];
90741                     for (var index in midCoordinates) {
90742                         var loc = midCoordinates[index];
90743                         fillEnter.append('circle')
90744                             .attr('class', 'midpoint')
90745                             .attr('cx', loc[0])
90746                             .attr('cy', loc[1])
90747                             .attr('r', 1.25);
90748                     }
90749                 }
90750
90751             }
90752
90753             function renderLine(lineEnter) {
90754                 var d = isSmall() ? 40 : 60;
90755                 // draw the line parametrically
90756                 var w = d, h = d, y = Math.round(d*0.72), l = Math.round(d*0.6), r = 2.5;
90757                 var x1 = (w - l)/2, x2 = x1 + l;
90758
90759                 lineEnter = lineEnter
90760                     .append('svg')
90761                     .attr('class', 'preset-icon-line')
90762                     .attr('width', w)
90763                     .attr('height', h)
90764                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90765
90766                 ['casing', 'stroke'].forEach(function(klass) {
90767                     lineEnter.append('path')
90768                         .attr('d', 'M' + x1 + ' ' + y + ' L' + x2 + ' ' + y)
90769                         .attr('class', 'line ' + klass);
90770                 });
90771
90772                 [[x1 - 1, y], [x2 + 1, y]].forEach(function(loc) {
90773                     lineEnter.append('circle')
90774                         .attr('class', 'vertex')
90775                         .attr('cx', loc[0])
90776                         .attr('cy', loc[1])
90777                         .attr('r', r);
90778                 });
90779             }
90780
90781             function renderRoute(routeEnter) {
90782                 var d = isSmall() ? 40 : 60;
90783                 // draw the route parametrically
90784                 var w = d,
90785                     h = d,
90786                     y1 = Math.round(d*0.80),
90787                     y2 = Math.round(d*0.68),
90788                     l = Math.round(d*0.6),
90789                     r = 2;
90790                 var x1 = (w - l)/2, x2 = x1 + l/3, x3 = x2 + l/3, x4 = x3 + l/3;
90791
90792                 routeEnter = routeEnter
90793                     .append('svg')
90794                     .attr('class', 'preset-icon-route')
90795                     .attr('width', w)
90796                     .attr('height', h)
90797                     .attr('viewBox', '0 0 ' + w + ' ' + h);
90798
90799                 ['casing', 'stroke'].forEach(function(klass) {
90800                     routeEnter.append('path')
90801                         .attr('d', 'M' + x1 + ' ' + y1 + ' L' + x2 + ' ' + y2)
90802                         .attr('class', 'segment0 line ' + klass);
90803                     routeEnter.append('path')
90804                         .attr('d', 'M' + x2 + ' ' + y2 + ' L' + x3 + ' ' + y1)
90805                         .attr('class', 'segment1 line ' + klass);
90806                     routeEnter.append('path')
90807                         .attr('d', 'M' + x3 + ' ' + y1 + ' L' + x4 + ' ' + y2)
90808                         .attr('class', 'segment2 line ' + klass);
90809                 });
90810
90811                 [[x1, y1], [x2, y2], [x3, y1], [x4, y2]].forEach(function(loc) {
90812                     routeEnter.append('circle')
90813                         .attr('class', 'vertex')
90814                         .attr('cx', loc[0])
90815                         .attr('cy', loc[1])
90816                         .attr('r', r);
90817                 });
90818             }
90819
90820             var routeSegements = {
90821                 bicycle: ['highway/cycleway', 'highway/cycleway', 'highway/cycleway'],
90822                 bus: ['highway/unclassified', 'highway/secondary', 'highway/primary'],
90823                 detour: ['highway/tertiary', 'highway/residential', 'highway/unclassified'],
90824                 ferry: ['route/ferry', 'route/ferry', 'route/ferry'],
90825                 foot: ['highway/footway', 'highway/footway', 'highway/footway'],
90826                 hiking: ['highway/path', 'highway/path', 'highway/path'],
90827                 horse: ['highway/bridleway', 'highway/bridleway', 'highway/bridleway'],
90828                 light_rail: ['railway/light_rail', 'railway/light_rail', 'railway/light_rail'],
90829                 monorail: ['railway/monorail', 'railway/monorail', 'railway/monorail'],
90830                 pipeline: ['man_made/pipeline', 'man_made/pipeline', 'man_made/pipeline'],
90831                 piste: ['piste/downhill', 'piste/hike', 'piste/nordic'],
90832                 power: ['power/line', 'power/line', 'power/line'],
90833                 road: ['highway/secondary', 'highway/primary', 'highway/trunk'],
90834                 subway: ['railway/subway', 'railway/subway', 'railway/subway'],
90835                 train: ['railway/rail', 'railway/rail', 'railway/rail'],
90836                 tram: ['railway/tram', 'railway/tram', 'railway/tram'],
90837                 waterway: ['waterway/stream', 'waterway/stream', 'waterway/stream']
90838             };
90839
90840             function render() {
90841
90842                 var p = preset.apply(this, arguments);
90843                 var isFallback = isSmall() && p.isFallback && p.isFallback();
90844                 var geom = geometry ? geometry.apply(this, arguments) : null;
90845                 if (geom === 'relation' && p.tags && ((p.tags.type === 'route' && p.tags.route && routeSegements[p.tags.route]) || p.tags.type === 'waterway')) {
90846                     geom = 'route';
90847                 }
90848                 var imageURL = p.imageURL;
90849                 var picon = imageURL ? null : getIcon(p, geom);
90850                 var isMaki = picon && /^maki-/.test(picon);
90851                 var isTemaki = picon && /^temaki-/.test(picon);
90852                 var isFa = picon && /^fa[srb]-/.test(picon);
90853                 var isTnp = picon && /^tnp-/.test(picon);
90854                 var isiDIcon = picon && !(isMaki || isTemaki || isFa || isTnp);
90855                 var isCategory = !p.setTags;
90856                 var drawPoint = picon && geom === 'point' && isSmall() && !isFallback;
90857                 var drawVertex = picon !== null && geom === 'vertex' && (!isSmall() || !isFallback);
90858                 var drawLine = picon && geom === 'line' && !isFallback && !isCategory;
90859                 var drawArea = picon && geom === 'area' && !isFallback;
90860                 var drawRoute = picon && geom === 'route';
90861                 var isFramed = (drawVertex || drawArea || drawLine || drawRoute);
90862
90863                 var tags = !isCategory ? p.setTags({}, geom) : {};
90864                 for (var k in tags) {
90865                     if (tags[k] === '*') {
90866                         tags[k] = 'yes';
90867                     }
90868                 }
90869                 var tagClasses = svgTagClasses().getClassesString(tags, '');
90870
90871                 var selection = d3_select(this);
90872
90873                 var container = selection.selectAll('.preset-icon-container')
90874                     .data([0]);
90875
90876                 container = container.enter()
90877                     .append('div')
90878                     .attr('class', 'preset-icon-container ' + sizeClass)
90879                     .merge(container);
90880
90881                 container.classed('fallback', isFallback);
90882
90883                 var imageIcon = container.selectAll('img.image-icon')
90884                     .data(imageURL ? [0] : []);
90885
90886                 imageIcon.exit()
90887                     .remove();
90888
90889                 imageIcon = imageIcon.enter()
90890                     .append('img')
90891                     .attr('class', 'image-icon')
90892                     .merge(imageIcon);
90893
90894                 imageIcon
90895                     .attr('src', imageURL);
90896
90897                 var pointBorder = container.selectAll('.preset-icon-point-border')
90898                     .data(drawPoint ? [0] : []);
90899
90900                 pointBorder.exit()
90901                     .remove();
90902
90903                 var pointBorderEnter = pointBorder.enter();
90904                 renderPointBorder(pointBorderEnter);
90905                 pointBorder = pointBorderEnter.merge(pointBorder);
90906
90907
90908                 var vertexFill = container.selectAll('.preset-icon-fill-vertex')
90909                     .data(drawVertex ? [0] : []);
90910
90911                 vertexFill.exit()
90912                     .remove();
90913
90914                 var vertexFillEnter = vertexFill.enter();
90915                 renderCircleFill(vertexFillEnter);
90916                 vertexFill = vertexFillEnter.merge(vertexFill);
90917
90918
90919                 var fill = container.selectAll('.preset-icon-fill-area')
90920                     .data(drawArea ? [0] : []);
90921
90922                 fill.exit()
90923                     .remove();
90924
90925                 var fillEnter = fill.enter();
90926                 renderSquareFill(fillEnter);
90927                 fill = fillEnter.merge(fill);
90928
90929                 fill.selectAll('path.stroke')
90930                     .attr('class', 'area stroke ' + tagClasses);
90931                 fill.selectAll('path.fill')
90932                     .attr('class', 'area fill ' + tagClasses);
90933
90934
90935                 var line = container.selectAll('.preset-icon-line')
90936                     .data(drawLine ? [0] : []);
90937
90938                 line.exit()
90939                     .remove();
90940
90941                 var lineEnter = line.enter();
90942                 renderLine(lineEnter);
90943
90944                 line = lineEnter.merge(line);
90945
90946                 line.selectAll('path.stroke')
90947                     .attr('class', 'line stroke ' + tagClasses);
90948                 line.selectAll('path.casing')
90949                     .attr('class', 'line casing ' + tagClasses);
90950
90951                 var route = container.selectAll('.preset-icon-route')
90952                     .data(drawRoute ? [0] : []);
90953
90954                 route.exit()
90955                     .remove();
90956
90957                 var routeEnter = route.enter();
90958                 renderRoute(routeEnter);
90959
90960                 route = routeEnter.merge(route);
90961
90962                 if (drawRoute) {
90963                     var routeType = p.tags.type === 'waterway' ? 'waterway' : p.tags.route;
90964                     var segmentPresetIDs = routeSegements[routeType];
90965                     for (var segmentIndex in segmentPresetIDs) {
90966                         var segmentPreset = context.presets().item(segmentPresetIDs[segmentIndex]);
90967                         var segmentTagClasses = svgTagClasses().getClassesString(segmentPreset.tags, '');
90968                         route.selectAll('path.stroke.segment' + segmentIndex)
90969                             .attr('class', 'segment' + segmentIndex + ' line stroke ' + segmentTagClasses);
90970                         route.selectAll('path.casing.segment' + segmentIndex)
90971                             .attr('class', 'segment' + segmentIndex + ' line casing ' + segmentTagClasses);
90972                     }
90973
90974                 }
90975
90976
90977                 var icon = container.selectAll('.preset-icon')
90978                     .data(picon ? [0] : []);
90979
90980                 icon.exit()
90981                     .remove();
90982
90983                 icon = icon.enter()
90984                     .append('div')
90985                     .attr('class', 'preset-icon')
90986                     .call(svgIcon(''))
90987                     .merge(icon);
90988
90989                 icon
90990                     .attr('class', 'preset-icon ' + (geom ? geom + '-geom' : ''))
90991                     .classed('framed', isFramed)
90992                     .classed('preset-icon-iD', isiDIcon);
90993
90994                 icon.selectAll('svg')
90995                     .attr('class', function() {
90996                         return 'icon ' + picon + ' ' + (!isiDIcon && geom !== 'line'  ? '' : tagClasses);
90997                     });
90998
90999                 icon.selectAll('use')
91000                     .attr('href', '#' + picon + (isMaki ? (isSmall() && geom === 'point' ? '-11' : '-15') : ''));
91001
91002             }
91003
91004
91005             presetIcon.preset = function(val) {
91006                 if (!arguments.length) return preset;
91007                 preset = utilFunctor(val);
91008                 return presetIcon;
91009             };
91010
91011
91012             presetIcon.geometry = function(val) {
91013                 if (!arguments.length) return geometry;
91014                 geometry = utilFunctor(val);
91015                 return presetIcon;
91016             };
91017
91018
91019             presetIcon.sizeClass = function(val) {
91020                 if (!arguments.length) return sizeClass;
91021                 sizeClass = val;
91022                 return presetIcon;
91023             };
91024
91025             return presetIcon;
91026         }
91027
91028         function uiRawMemberEditor(context) {
91029             var taginfo = services$1.taginfo;
91030             var _entityID;
91031             var _contentSelection = d3_select(null);
91032             var _maxMembers = 1000;
91033
91034             function downloadMember(d) {
91035                 event.preventDefault();
91036
91037                 // display the loading indicator
91038                 d3_select(this.parentNode).classed('tag-reference-loading', true);
91039                 context.loadEntity(d.id, function() {
91040                     updateDisclosureContent(_contentSelection);
91041                 });
91042             }
91043
91044             function zoomToMember(d) {
91045                 event.preventDefault();
91046
91047                 var entity = context.entity(d.id);
91048                 context.map().zoomTo(entity);
91049
91050                 // highlight the feature in case it wasn't previously on-screen
91051                 utilHighlightEntities([d.id], true, context);
91052             }
91053
91054
91055             function selectMember(d) {
91056                 event.preventDefault();
91057
91058                 // remove the hover-highlight styling
91059                 utilHighlightEntities([d.id], false, context);
91060
91061                 var entity = context.entity(d.id);
91062                 var mapExtent = context.map().extent();
91063                 if (!entity.intersects(mapExtent, context.graph())) {
91064                     // zoom to the entity if its extent is not visible now
91065                     context.map().zoomToEase(entity);
91066                 }
91067
91068                 context.enter(modeSelect(context, [d.id]));
91069             }
91070
91071
91072             function changeRole(d) {
91073                 var oldRole = d.role;
91074                 var newRole = d3_select(this).property('value');
91075
91076                 if (oldRole !== newRole) {
91077                     var member = { id: d.id, type: d.type, role: newRole };
91078                     context.perform(
91079                         actionChangeMember(d.relation.id, member, d.index),
91080                         t('operations.change_role.annotation')
91081                     );
91082                 }
91083             }
91084
91085
91086             function deleteMember(d) {
91087
91088                 // remove the hover-highlight styling
91089                 utilHighlightEntities([d.id], false, context);
91090
91091                 context.perform(
91092                     actionDeleteMember(d.relation.id, d.index),
91093                     t('operations.delete_member.annotation')
91094                 );
91095
91096                 if (!context.hasEntity(d.relation.id)) {
91097                     context.enter(modeBrowse(context));
91098                 }
91099             }
91100
91101             function updateDisclosureContent(selection) {
91102                 _contentSelection = selection;
91103
91104                 var memberships = [];
91105                 var entity = context.entity(_entityID);
91106                 entity.members.slice(0, _maxMembers).forEach(function(member, index) {
91107                     memberships.push({
91108                         index: index,
91109                         id: member.id,
91110                         type: member.type,
91111                         role: member.role,
91112                         relation: entity,
91113                         member: context.hasEntity(member.id)
91114                     });
91115                 });
91116
91117                 var list = selection.selectAll('.member-list')
91118                     .data([0]);
91119
91120                 list = list.enter()
91121                     .append('ul')
91122                     .attr('class', 'member-list')
91123                     .merge(list);
91124
91125
91126                 var items = list.selectAll('li')
91127                     .data(memberships, function(d) {
91128                         return osmEntity.key(d.relation) + ',' + d.index + ',' +
91129                             (d.member ? osmEntity.key(d.member) : 'incomplete');
91130                     });
91131
91132                 items.exit()
91133                     .each(unbind)
91134                     .remove();
91135
91136                 var itemsEnter = items.enter()
91137                     .append('li')
91138                     .attr('class', 'member-row form-field')
91139                     .classed('member-incomplete', function(d) { return !d.member; });
91140
91141                 itemsEnter
91142                     .each(function(d) {
91143                         var item = d3_select(this);
91144
91145                         var label = item
91146                             .append('label')
91147                             .attr('class', 'field-label');
91148
91149                         if (d.member) {
91150                             // highlight the member feature in the map while hovering on the list item
91151                             item
91152                                 .on('mouseover', function() {
91153                                     utilHighlightEntities([d.id], true, context);
91154                                 })
91155                                 .on('mouseout', function() {
91156                                     utilHighlightEntities([d.id], false, context);
91157                                 });
91158
91159                             var labelLink = label
91160                                 .append('span')
91161                                 .attr('class', 'label-text')
91162                                 .append('a')
91163                                 .attr('href', '#')
91164                                 .on('click', selectMember);
91165
91166                             labelLink
91167                                 .append('span')
91168                                 .attr('class', 'member-entity-type')
91169                                 .text(function(d) {
91170                                     var matched = context.presets().match(d.member, context.graph());
91171                                     return (matched && matched.name()) || utilDisplayType(d.member.id);
91172                                 });
91173
91174                             labelLink
91175                                 .append('span')
91176                                 .attr('class', 'member-entity-name')
91177                                 .text(function(d) { return utilDisplayName(d.member); });
91178
91179                             label
91180                                 .append('button')
91181                                 .attr('class', 'member-zoom')
91182                                 .attr('title', t('icons.zoom_to'))
91183                                 .attr('tabindex', -1)
91184                                 .call(svgIcon('#iD-icon-geolocate'))
91185                                 .on('click', zoomToMember);
91186
91187                         } else {
91188                             var labelText = label
91189                                 .append('span')
91190                                 .attr('class', 'label-text');
91191
91192                             labelText
91193                                 .append('span')
91194                                 .attr('class', 'member-entity-type')
91195                                 .text(t('inspector.' + d.type, { id: d.id }));
91196
91197                             labelText
91198                                 .append('span')
91199                                 .attr('class', 'member-entity-name')
91200                                 .text(t('inspector.incomplete', { id: d.id }));
91201
91202                             label
91203                                 .append('button')
91204                                 .attr('class', 'member-download')
91205                                 .attr('title', t('icons.download'))
91206                                 .attr('tabindex', -1)
91207                                 .call(svgIcon('#iD-icon-load'))
91208                                 .on('click', downloadMember);
91209                         }
91210                     });
91211
91212                 var wrapEnter = itemsEnter
91213                     .append('div')
91214                     .attr('class', 'form-field-input-wrap form-field-input-member');
91215
91216                 wrapEnter
91217                     .append('input')
91218                     .attr('class', 'member-role')
91219                     .property('type', 'text')
91220                     .attr('maxlength', 255)
91221                     .attr('placeholder', t('inspector.role'))
91222                     .call(utilNoAuto);
91223
91224                 wrapEnter
91225                     .append('button')
91226                     .attr('tabindex', -1)
91227                     .attr('title', t('icons.remove'))
91228                     .attr('class', 'remove form-field-button member-delete')
91229                     .call(svgIcon('#iD-operation-delete'));
91230
91231                 if (taginfo) {
91232                     wrapEnter.each(bindTypeahead);
91233                 }
91234
91235                 var dragOrigin, targetIndex;
91236
91237                 itemsEnter.call(d3_drag()
91238                     .on('start', function() {
91239                         dragOrigin = {
91240                             x: event.x,
91241                             y: event.y
91242                         };
91243                         targetIndex = null;
91244                     })
91245                     .on('drag', function(d, index) {
91246                         var x = event.x - dragOrigin.x,
91247                             y = event.y - dragOrigin.y;
91248
91249                         if (!d3_select(this).classed('dragging') &&
91250                             // don't display drag until dragging beyond a distance threshold
91251                             Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)) <= 5) return;
91252
91253                         d3_select(this)
91254                             .classed('dragging', true);
91255
91256                         targetIndex = null;
91257
91258                         selection.selectAll('li.member-row')
91259                             .style('transform', function(d2, index2) {
91260                                 var node = d3_select(this).node();
91261                                 if (index === index2) {
91262                                     return 'translate(' + x + 'px, ' + y + 'px)';
91263                                 } else if (index2 > index && event.y > node.offsetTop - node.offsetHeight) {
91264                                     if (targetIndex === null || index2 > targetIndex) {
91265                                         targetIndex = index2;
91266                                     }
91267                                     return 'translateY(-100%)';
91268                                 } else if (index2 < index && event.y < node.offsetTop) {
91269                                     if (targetIndex === null || index2 < targetIndex) {
91270                                         targetIndex = index2;
91271                                     }
91272                                     return 'translateY(100%)';
91273                                 }
91274                                 return null;
91275                             });
91276                     })
91277                     .on('end', function(d, index) {
91278
91279                         if (!d3_select(this).classed('dragging')) {
91280                             return;
91281                         }
91282
91283                         d3_select(this)
91284                             .classed('dragging', false);
91285
91286                         selection.selectAll('li.member-row')
91287                             .style('transform', null);
91288
91289                         if (targetIndex !== null) {
91290                             // dragged to a new position, reorder
91291                             context.perform(
91292                                 actionMoveMember(d.relation.id, index, targetIndex),
91293                                 t('operations.reorder_members.annotation')
91294                             );
91295                         }
91296                     })
91297                 );
91298
91299
91300                 // update
91301                 items = items
91302                     .merge(itemsEnter);
91303
91304                 items.select('input.member-role')
91305                     .property('value', function(d) { return d.role; })
91306                     .on('blur', changeRole)
91307                     .on('change', changeRole);
91308
91309                 items.select('button.member-delete')
91310                     .on('click', deleteMember);
91311
91312
91313
91314                 function bindTypeahead(d) {
91315                     var row = d3_select(this);
91316                     var role = row.selectAll('input.member-role');
91317                     var origValue = role.property('value');
91318
91319                     function sort(value, data) {
91320                         var sameletter = [];
91321                         var other = [];
91322                         for (var i = 0; i < data.length; i++) {
91323                             if (data[i].value.substring(0, value.length) === value) {
91324                                 sameletter.push(data[i]);
91325                             } else {
91326                                 other.push(data[i]);
91327                             }
91328                         }
91329                         return sameletter.concat(other);
91330                     }
91331
91332                     role.call(uiCombobox(context, 'member-role')
91333                         .fetcher(function(role, callback) {
91334                             // The `geometry` param is used in the `taginfo.js` interface for
91335                             // filtering results, as a key into the `tag_members_fractions`
91336                             // object.  If we don't know the geometry because the member is
91337                             // not yet downloaded, it's ok to guess based on type.
91338                             var geometry;
91339                             if (d.member) {
91340                                 geometry = context.geometry(d.member.id);
91341                             } else if (d.type === 'relation') {
91342                                 geometry = 'relation';
91343                             } else if (d.type === 'way') {
91344                                 geometry = 'line';
91345                             } else {
91346                                 geometry = 'point';
91347                             }
91348
91349                             var rtype = entity.tags.type;
91350                             taginfo.roles({
91351                                 debounce: true,
91352                                 rtype: rtype || '',
91353                                 geometry: geometry,
91354                                 query: role
91355                             }, function(err, data) {
91356                                 if (!err) callback(sort(role, data));
91357                             });
91358                         })
91359                         .on('cancel', function() {
91360                             role.property('value', origValue);
91361                         })
91362                     );
91363                 }
91364
91365
91366                 function unbind() {
91367                     var row = d3_select(this);
91368
91369                     row.selectAll('input.member-role')
91370                         .call(uiCombobox.off);
91371                 }
91372             }
91373
91374             function rawMemberEditor(selection) {
91375                 var entity = context.entity(_entityID);
91376
91377                 var gt = entity.members.length > _maxMembers ? '>' : '';
91378                 selection.call(uiDisclosure(context, 'raw_member_editor', true)
91379                     .title(t('inspector.all_members') + ' (' + gt + entity.members.slice(0, _maxMembers).length + ')')
91380                     .expanded(true)
91381                     .updatePreference(false)
91382                     .on('toggled', function(expanded) {
91383                         if (expanded) {
91384                             selection.node().parentNode.scrollTop += 200;
91385                         }
91386                     })
91387                     .content(updateDisclosureContent)
91388                 );
91389             }
91390
91391             rawMemberEditor.entityID = function(val) {
91392                 if (!arguments.length) return _entityID;
91393                 _entityID = val;
91394                 return rawMemberEditor;
91395             };
91396
91397
91398             return rawMemberEditor;
91399         }
91400
91401         function uiRawMembershipEditor(context) {
91402             var taginfo = services$1.taginfo;
91403             var nearbyCombo = uiCombobox(context, 'parent-relation')
91404                 .minItems(1)
91405                 .fetcher(fetchNearbyRelations);
91406             var _inChange = false;
91407             var _entityID;
91408             var _showBlank;
91409
91410
91411             function selectRelation(d) {
91412                 event.preventDefault();
91413
91414                 // remove the hover-highlight styling
91415                 utilHighlightEntities([d.relation.id], false, context);
91416
91417                 context.enter(modeSelect(context, [d.relation.id]));
91418             }
91419
91420
91421             function changeRole(d) {
91422                 if (d === 0) return;    // called on newrow (shoudn't happen)
91423                 if (_inChange) return;  // avoid accidental recursive call #5731
91424
91425                 var oldRole = d.member.role;
91426                 var newRole = d3_select(this).property('value');
91427
91428                 if (oldRole !== newRole) {
91429                     _inChange = true;
91430                     context.perform(
91431                         actionChangeMember(d.relation.id, Object.assign({}, d.member, { role: newRole }), d.index),
91432                         t('operations.change_role.annotation')
91433                     );
91434                 }
91435                 _inChange = false;
91436             }
91437
91438
91439             function addMembership(d, role) {
91440                 this.blur();           // avoid keeping focus on the button
91441                 _showBlank = false;
91442
91443                 var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
91444
91445                 if (d.relation) {
91446                     context.perform(
91447                         actionAddMember(d.relation.id, member),
91448                         t('operations.add_member.annotation')
91449                     );
91450
91451                 } else {
91452                     var relation = osmRelation();
91453                     context.perform(
91454                         actionAddEntity(relation),
91455                         actionAddMember(relation.id, member),
91456                         t('operations.add.annotation.relation')
91457                     );
91458
91459                     context.enter(modeSelect(context, [relation.id]).newFeature(true));
91460                 }
91461             }
91462
91463
91464             function deleteMembership(d) {
91465                 this.blur();           // avoid keeping focus on the button
91466                 if (d === 0) return;   // called on newrow (shoudn't happen)
91467
91468                 // remove the hover-highlight styling
91469                 utilHighlightEntities([d.relation.id], false, context);
91470
91471                 context.perform(
91472                     actionDeleteMember(d.relation.id, d.index),
91473                     t('operations.delete_member.annotation')
91474                 );
91475             }
91476
91477
91478             function fetchNearbyRelations(q, callback) {
91479                 var newRelation = { relation: null, value: t('inspector.new_relation') };
91480                 var result = [];
91481                 var graph = context.graph();
91482
91483                 context.intersects(context.extent()).forEach(function(entity) {
91484                     if (entity.type !== 'relation' || entity.id === _entityID) return;
91485
91486                     var matched = context.presets().match(entity, graph);
91487                     var presetName = (matched && matched.name()) || t('inspector.relation');
91488                     var entityName = utilDisplayName(entity) || '';
91489
91490                     var value = presetName + ' ' + entityName;
91491                     if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
91492
91493                     result.push({ relation: entity, value: value });
91494                 });
91495
91496                 result.sort(function(a, b) {
91497                     return osmRelation.creationOrder(a.relation, b.relation);
91498                 });
91499
91500                 // Dedupe identical names by appending relation id - see #2891
91501                 var dupeGroups = Object.values(utilArrayGroupBy(result, 'value'))
91502                     .filter(function(v) { return v.length > 1; });
91503
91504                 dupeGroups.forEach(function(group) {
91505                     group.forEach(function(obj) {
91506                         obj.value += ' ' + obj.relation.id;
91507                     });
91508                 });
91509
91510                 result.forEach(function(obj) {
91511                     obj.title = obj.value;
91512                 });
91513
91514                 result.unshift(newRelation);
91515                 callback(result);
91516             }
91517
91518
91519             function rawMembershipEditor(selection) {
91520                 var entity = context.entity(_entityID);
91521                 var parents = context.graph().parentRelations(entity);
91522                 var memberships = [];
91523
91524                 parents.slice(0, 1000).forEach(function(relation) {
91525                     relation.members.forEach(function(member, index) {
91526                         if (member.id === entity.id) {
91527                             memberships.push({ relation: relation, member: member, index: index });
91528                         }
91529                     });
91530                 });
91531
91532                 var gt = parents.length > 1000 ? '>' : '';
91533                 selection.call(uiDisclosure(context, 'raw_membership_editor', true)
91534                     .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
91535                     .expanded(true)
91536                     .updatePreference(false)
91537                     .on('toggled', function(expanded) {
91538                         if (expanded) { selection.node().parentNode.scrollTop += 200; }
91539                     })
91540                     .content(content)
91541                 );
91542
91543
91544                 function content(selection) {
91545                     var list = selection.selectAll('.member-list')
91546                         .data([0]);
91547
91548                     list = list.enter()
91549                         .append('ul')
91550                         .attr('class', 'member-list')
91551                         .merge(list);
91552
91553
91554                     var items = list.selectAll('li.member-row-normal')
91555                         .data(memberships, function(d) {
91556                             return osmEntity.key(d.relation) + ',' + d.index;
91557                         });
91558
91559                     items.exit()
91560                         .each(unbind)
91561                         .remove();
91562
91563                     // Enter
91564                     var itemsEnter = items.enter()
91565                         .append('li')
91566                         .attr('class', 'member-row member-row-normal form-field');
91567
91568                     // highlight the relation in the map while hovering on the list item
91569                     itemsEnter.on('mouseover', function(d) {
91570                             utilHighlightEntities([d.relation.id], true, context);
91571                         })
91572                         .on('mouseout', function(d) {
91573                             utilHighlightEntities([d.relation.id], false, context);
91574                         });
91575
91576                     var labelEnter = itemsEnter
91577                         .append('label')
91578                         .attr('class', 'field-label')
91579                         .append('span')
91580                         .attr('class', 'label-text')
91581                         .append('a')
91582                         .attr('href', '#')
91583                         .on('click', selectRelation);
91584
91585                     labelEnter
91586                         .append('span')
91587                         .attr('class', 'member-entity-type')
91588                         .text(function(d) {
91589                             var matched = context.presets().match(d.relation, context.graph());
91590                             return (matched && matched.name()) || t('inspector.relation');
91591                         });
91592
91593                     labelEnter
91594                         .append('span')
91595                         .attr('class', 'member-entity-name')
91596                         .text(function(d) { return utilDisplayName(d.relation); });
91597
91598                     var wrapEnter = itemsEnter
91599                         .append('div')
91600                         .attr('class', 'form-field-input-wrap form-field-input-member');
91601
91602                     wrapEnter
91603                         .append('input')
91604                         .attr('class', 'member-role')
91605                         .property('type', 'text')
91606                         .attr('maxlength', 255)
91607                         .attr('placeholder', t('inspector.role'))
91608                         .call(utilNoAuto)
91609                         .property('value', function(d) { return d.member.role; })
91610                         .on('blur', changeRole)
91611                         .on('change', changeRole);
91612
91613                     wrapEnter
91614                         .append('button')
91615                         .attr('tabindex', -1)
91616                         .attr('class', 'remove form-field-button member-delete')
91617                         .call(svgIcon('#iD-operation-delete'))
91618                         .on('click', deleteMembership);
91619
91620                     if (taginfo) {
91621                         wrapEnter.each(bindTypeahead);
91622                     }
91623
91624
91625                     var newMembership = list.selectAll('.member-row-new')
91626                         .data(_showBlank ? [0] : []);
91627
91628                     // Exit
91629                     newMembership.exit()
91630                         .remove();
91631
91632                     // Enter
91633                     var newMembershipEnter = newMembership.enter()
91634                         .append('li')
91635                         .attr('class', 'member-row member-row-new form-field');
91636
91637                     newMembershipEnter
91638                         .append('label')
91639                         .attr('class', 'field-label')
91640                         .append('input')
91641                         .attr('placeholder', t('inspector.choose_relation'))
91642                         .attr('type', 'text')
91643                         .attr('class', 'member-entity-input')
91644                         .call(utilNoAuto);
91645
91646                     var newWrapEnter = newMembershipEnter
91647                         .append('div')
91648                         .attr('class', 'form-field-input-wrap form-field-input-member');
91649
91650                     newWrapEnter
91651                         .append('input')
91652                         .attr('class', 'member-role')
91653                         .property('type', 'text')
91654                         .attr('maxlength', 255)
91655                         .attr('placeholder', t('inspector.role'))
91656                         .call(utilNoAuto);
91657
91658                     newWrapEnter
91659                         .append('button')
91660                         .attr('tabindex', -1)
91661                         .attr('class', 'remove form-field-button member-delete')
91662                         .call(svgIcon('#iD-operation-delete'))
91663                         .on('click', function() {
91664                             list.selectAll('.member-row-new')
91665                                 .remove();
91666                         });
91667
91668                     // Update
91669                     newMembership = newMembership
91670                         .merge(newMembershipEnter);
91671
91672                     newMembership.selectAll('.member-entity-input')
91673                         .on('blur', cancelEntity)   // if it wasn't accepted normally, cancel it
91674                         .call(nearbyCombo
91675                             .on('accept', acceptEntity)
91676                             .on('cancel', cancelEntity)
91677                         );
91678
91679
91680                     // Container for the Add button
91681                     var addRow = selection.selectAll('.add-row')
91682                         .data([0]);
91683
91684                     // enter
91685                     var addRowEnter = addRow.enter()
91686                         .append('div')
91687                         .attr('class', 'add-row');
91688
91689                     var addRelationButton = addRowEnter
91690                         .append('button')
91691                         .attr('class', 'add-relation');
91692
91693                     addRelationButton
91694                         .call(svgIcon('#iD-icon-plus', 'light'));
91695                     addRelationButton
91696                         .call(tooltip().title(t('inspector.add_to_relation')).placement(textDirection === 'ltr' ? 'right' : 'left'));
91697
91698                     addRowEnter
91699                         .append('div')
91700                         .attr('class', 'space-value');   // preserve space
91701
91702                     addRowEnter
91703                         .append('div')
91704                         .attr('class', 'space-buttons');  // preserve space
91705
91706                     // update
91707                     addRow = addRow
91708                         .merge(addRowEnter);
91709
91710                     addRow.select('.add-relation')
91711                         .on('click', function() {
91712                             _showBlank = true;
91713                             content(selection);
91714                             list.selectAll('.member-entity-input').node().focus();
91715                         });
91716
91717
91718                     function acceptEntity(d) {
91719                         if (!d) {
91720                             cancelEntity();
91721                             return;
91722                         }
91723                         var role = list.selectAll('.member-row-new .member-role').property('value');
91724                         addMembership(d, role);
91725                     }
91726
91727
91728                     function cancelEntity() {
91729                         var input = newMembership.selectAll('.member-entity-input');
91730                         input.property('value', '');
91731                     }
91732
91733
91734                     function bindTypeahead(d) {
91735                         var row = d3_select(this);
91736                         var role = row.selectAll('input.member-role');
91737                         var origValue = role.property('value');
91738
91739                         function sort(value, data) {
91740                             var sameletter = [];
91741                             var other = [];
91742                             for (var i = 0; i < data.length; i++) {
91743                                 if (data[i].value.substring(0, value.length) === value) {
91744                                     sameletter.push(data[i]);
91745                                 } else {
91746                                     other.push(data[i]);
91747                                 }
91748                             }
91749                             return sameletter.concat(other);
91750                         }
91751
91752                         role.call(uiCombobox(context, 'member-role')
91753                             .fetcher(function(role, callback) {
91754                                 var rtype = d.relation.tags.type;
91755                                 taginfo.roles({
91756                                     debounce: true,
91757                                     rtype: rtype || '',
91758                                     geometry: context.geometry(_entityID),
91759                                     query: role
91760                                 }, function(err, data) {
91761                                     if (!err) callback(sort(role, data));
91762                                 });
91763                             })
91764                             .on('cancel', function() {
91765                                 role.property('value', origValue);
91766                             })
91767                         );
91768                     }
91769
91770
91771                     function unbind() {
91772                         var row = d3_select(this);
91773
91774                         row.selectAll('input.member-role')
91775                             .call(uiCombobox.off);
91776                     }
91777                 }
91778             }
91779
91780
91781             rawMembershipEditor.entityID = function(val) {
91782                 if (!arguments.length) return _entityID;
91783                 _entityID = val;
91784                 _showBlank = false;
91785                 return rawMembershipEditor;
91786             };
91787
91788
91789             return rawMembershipEditor;
91790         }
91791
91792         // This currently only works with the 'restrictions' field
91793         // It borrows some code from uiHelp
91794
91795         function uiFieldHelp(context, fieldName) {
91796             var fieldHelp = {};
91797             var _inspector = d3_select(null);
91798             var _wrap = d3_select(null);
91799             var _body = d3_select(null);
91800
91801             var fieldHelpKeys = {
91802                 restrictions: [
91803                     ['about',[
91804                         'about',
91805                         'from_via_to',
91806                         'maxdist',
91807                         'maxvia'
91808                     ]],
91809                     ['inspecting',[
91810                         'about',
91811                         'from_shadow',
91812                         'allow_shadow',
91813                         'restrict_shadow',
91814                         'only_shadow',
91815                         'restricted',
91816                         'only'
91817                     ]],
91818                     ['modifying',[
91819                         'about',
91820                         'indicators',
91821                         'allow_turn',
91822                         'restrict_turn',
91823                         'only_turn'
91824                     ]],
91825                     ['tips',[
91826                         'simple',
91827                         'simple_example',
91828                         'indirect',
91829                         'indirect_example',
91830                         'indirect_noedit'
91831                     ]]
91832                 ]
91833             };
91834
91835             var fieldHelpHeadings = {};
91836
91837             var replacements = {
91838                 distField: t('restriction.controls.distance'),
91839                 viaField: t('restriction.controls.via'),
91840                 fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
91841                 allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
91842                 restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
91843                 onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
91844                 allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
91845                 restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
91846                 onlyTurn: icon('#iD-turn-only', 'pre-text turn')
91847             };
91848
91849
91850             // For each section, squash all the texts into a single markdown document
91851             var docs = fieldHelpKeys[fieldName].map(function(key) {
91852                 var helpkey = 'help.field.' + fieldName + '.' + key[0];
91853                 var text = key[1].reduce(function(all, part) {
91854                     var subkey = helpkey + '.' + part;
91855                     var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
91856                     var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
91857                     return all + hhh + t(subkey, replacements) + '\n\n';
91858                 }, '');
91859
91860                 return {
91861                     key: helpkey,
91862                     title: t(helpkey + '.title'),
91863                     html: marked(text.trim())
91864                 };
91865             });
91866
91867
91868             function show() {
91869                 updatePosition();
91870
91871                 _body
91872                     .classed('hide', false)
91873                     .style('opacity', '0')
91874                     .transition()
91875                     .duration(200)
91876                     .style('opacity', '1');
91877             }
91878
91879
91880             function hide() {
91881                 _body
91882                     .classed('hide', true)
91883                     .transition()
91884                     .duration(200)
91885                     .style('opacity', '0')
91886                     .on('end', function () {
91887                         _body.classed('hide', true);
91888                     });
91889             }
91890
91891
91892             function clickHelp(index) {
91893                 var d = docs[index];
91894                 var tkeys = fieldHelpKeys[fieldName][index][1];
91895
91896                 _body.selectAll('.field-help-nav-item')
91897                     .classed('active', function(d, i) { return i === index; });
91898
91899                 var content = _body.selectAll('.field-help-content')
91900                     .html(d.html);
91901
91902                 // class the paragraphs so we can find and style them
91903                 content.selectAll('p')
91904                     .attr('class', function(d, i) { return tkeys[i]; });
91905
91906                 // insert special content for certain help sections
91907                 if (d.key === 'help.field.restrictions.inspecting') {
91908                     content
91909                         .insert('img', 'p.from_shadow')
91910                         .attr('class', 'field-help-image cf')
91911                         .attr('src', context.imagePath('tr_inspect.gif'));
91912
91913                 } else if (d.key === 'help.field.restrictions.modifying') {
91914                     content
91915                         .insert('img', 'p.allow_turn')
91916                         .attr('class', 'field-help-image cf')
91917                         .attr('src', context.imagePath('tr_modify.gif'));
91918                 }
91919             }
91920
91921
91922             fieldHelp.button = function(selection) {
91923                 if (_body.empty()) return;
91924
91925                 var button = selection.selectAll('.field-help-button')
91926                     .data([0]);
91927
91928                 // enter/update
91929                 button.enter()
91930                     .append('button')
91931                     .attr('class', 'field-help-button')
91932                     .attr('tabindex', -1)
91933                     .call(svgIcon('#iD-icon-help'))
91934                     .merge(button)
91935                     .on('click', function () {
91936                         event.stopPropagation();
91937                         event.preventDefault();
91938                         if (_body.classed('hide')) {
91939                             show();
91940                         } else {
91941                             hide();
91942                         }
91943                     });
91944             };
91945
91946
91947             function updatePosition() {
91948                 var wrap = _wrap.node();
91949                 var inspector = _inspector.node();
91950                 var wRect = wrap.getBoundingClientRect();
91951                 var iRect = inspector.getBoundingClientRect();
91952
91953                 _body
91954                     .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
91955             }
91956
91957
91958             fieldHelp.body = function(selection) {
91959                 // This control expects the field to have a form-field-input-wrap div
91960                 _wrap = selection.selectAll('.form-field-input-wrap');
91961                 if (_wrap.empty()) return;
91962
91963                 // absolute position relative to the inspector, so it "floats" above the fields
91964                 _inspector = d3_select('#sidebar .entity-editor-pane .inspector-body');
91965                 if (_inspector.empty()) return;
91966
91967                 _body = _inspector.selectAll('.field-help-body')
91968                     .data([0]);
91969
91970                 var enter = _body.enter()
91971                     .append('div')
91972                     .attr('class', 'field-help-body hide');   // initially hidden
91973
91974                 var titleEnter = enter
91975                     .append('div')
91976                     .attr('class', 'field-help-title cf');
91977
91978                 titleEnter
91979                     .append('h2')
91980                     .attr('class', ((textDirection === 'rtl') ? 'fr' : 'fl'))
91981                     .text(t('help.field.' + fieldName + '.title'));
91982
91983                 titleEnter
91984                     .append('button')
91985                     .attr('class', 'fr close')
91986                     .on('click', function() {
91987                         event.stopPropagation();
91988                         event.preventDefault();
91989                         hide();
91990                     })
91991                     .call(svgIcon('#iD-icon-close'));
91992
91993                 var navEnter = enter
91994                     .append('div')
91995                     .attr('class', 'field-help-nav cf');
91996
91997                 var titles = docs.map(function(d) { return d.title; });
91998                 navEnter.selectAll('.field-help-nav-item')
91999                     .data(titles)
92000                     .enter()
92001                     .append('div')
92002                     .attr('class', 'field-help-nav-item')
92003                     .text(function(d) { return d; })
92004                     .on('click', function(d, i) {
92005                         event.stopPropagation();
92006                         event.preventDefault();
92007                         clickHelp(i);
92008                     });
92009
92010                 enter
92011                     .append('div')
92012                     .attr('class', 'field-help-content');
92013
92014                 _body = _body
92015                     .merge(enter);
92016
92017                 clickHelp(0);
92018             };
92019
92020
92021             return fieldHelp;
92022         }
92023
92024         function uiFieldCheck(field, context) {
92025             var dispatch$1 = dispatch('change');
92026             var options = field.strings && field.strings.options;
92027             var values = [];
92028             var texts = [];
92029
92030             var input = d3_select(null);
92031             var text = d3_select(null);
92032             var label = d3_select(null);
92033             var reverser = d3_select(null);
92034
92035             var _impliedYes;
92036             var _entityID;
92037             var _value;
92038
92039
92040             if (options) {
92041                 for (var k in options) {
92042                     values.push(k === 'undefined' ? undefined : k);
92043                     texts.push(field.t('options.' + k, { 'default': options[k] }));
92044                 }
92045             } else {
92046                 values = [undefined, 'yes'];
92047                 texts = [t('inspector.unknown'), t('inspector.check.yes')];
92048                 if (field.type !== 'defaultCheck') {
92049                     values.push('no');
92050                     texts.push(t('inspector.check.no'));
92051                 }
92052             }
92053
92054
92055             // Checks tags to see whether an undefined value is "Assumed to be Yes"
92056             function checkImpliedYes() {
92057                 _impliedYes = (field.id === 'oneway_yes');
92058
92059                 // hack: pretend `oneway` field is a `oneway_yes` field
92060                 // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
92061                 if (field.id === 'oneway') {
92062                     var entity = context.entity(_entityID);
92063                     for (var key in entity.tags) {
92064                         if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
92065                             _impliedYes = true;
92066                             texts[0] = t('presets.fields.oneway_yes.options.undefined');
92067                             break;
92068                         }
92069                     }
92070                 }
92071             }
92072
92073
92074             function reverserHidden() {
92075                 if (!d3_select('div.inspector-hover').empty()) return true;
92076                 return !(_value === 'yes' || (_impliedYes && !_value));
92077             }
92078
92079
92080             function reverserSetText(selection) {
92081                 var entity = context.hasEntity(_entityID);
92082                 if (reverserHidden() || !entity) return selection;
92083
92084                 var first = entity.first();
92085                 var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
92086                 var pseudoDirection = first < last;
92087                 var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
92088
92089                 selection.selectAll('.reverser-span')
92090                     .text(t('inspector.check.reverser'))
92091                     .call(svgIcon(icon, 'inline'));
92092
92093                 return selection;
92094             }
92095
92096
92097             var check = function(selection) {
92098                 checkImpliedYes();
92099
92100                 label = selection.selectAll('.form-field-input-wrap')
92101                     .data([0]);
92102
92103                 var enter = label.enter()
92104                     .append('label')
92105                     .attr('class', 'form-field-input-wrap form-field-input-check');
92106
92107                 enter
92108                     .append('input')
92109                     .property('indeterminate', field.type !== 'defaultCheck')
92110                     .attr('type', 'checkbox')
92111                     .attr('id', 'preset-input-' + field.safeid);
92112
92113                 enter
92114                     .append('span')
92115                     .text(texts[0])
92116                     .attr('class', 'value');
92117
92118                 if (field.type === 'onewayCheck') {
92119                     enter
92120                         .append('a')
92121                         .attr('id', 'preset-input-' + field.safeid + '-reverser')
92122                         .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
92123                         .attr('href', '#')
92124                         .append('span')
92125                         .attr('class', 'reverser-span');
92126                 }
92127
92128                 label = label.merge(enter);
92129                 input = label.selectAll('input');
92130                 text = label.selectAll('span.value');
92131
92132                 input
92133                     .on('click', function() {
92134                         event.stopPropagation();
92135                         var t = {};
92136                         t[field.key] = values[(values.indexOf(_value) + 1) % values.length];
92137
92138                         // Don't cycle through `alternating` or `reversible` states - #4970
92139                         // (They are supported as translated strings, but should not toggle with clicks)
92140                         if (t[field.key] === 'reversible' || t[field.key] === 'alternating') {
92141                             t[field.key] = values[0];
92142                         }
92143
92144                         dispatch$1.call('change', this, t);
92145                     });
92146
92147                 if (field.type === 'onewayCheck') {
92148                     reverser = label.selectAll('.reverser');
92149
92150                     reverser
92151                         .call(reverserSetText)
92152                         .on('click', function() {
92153                             event.preventDefault();
92154                             event.stopPropagation();
92155                             context.perform(
92156                                 actionReverse(_entityID),
92157                                 t('operations.reverse.annotation')
92158                             );
92159                             d3_select(this)
92160                                 .call(reverserSetText);
92161                         });
92162                 }
92163             };
92164
92165
92166             check.entity = function(_) {
92167                 if (!arguments.length) return context.hasEntity(_entityID);
92168                 _entityID = _.id;
92169                 return check;
92170             };
92171
92172
92173             check.tags = function(tags) {
92174
92175                 function isChecked(val) {
92176                     return val !== 'no' && val !== '' && val !== undefined && val !== null;
92177                 }
92178
92179                 function textFor(val) {
92180                     if (val === '') val = undefined;
92181                     var index = values.indexOf(val);
92182                     return (index !== -1 ? texts[index] : ('"' + val + '"'));
92183                 }
92184
92185                 checkImpliedYes();
92186                 _value = tags[field.key] && tags[field.key].toLowerCase();
92187
92188                 if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
92189                     _value = 'yes';
92190                 }
92191
92192                 input
92193                     .property('indeterminate', field.type !== 'defaultCheck' && !_value)
92194                     .property('checked', isChecked(_value));
92195
92196                 text
92197                     .text(textFor(_value));
92198
92199                 label
92200                     .classed('set', !!_value);
92201
92202                 if (field.type === 'onewayCheck') {
92203                     reverser
92204                         .classed('hide', reverserHidden())
92205                         .call(reverserSetText);
92206                 }
92207             };
92208
92209
92210             check.focus = function() {
92211                 input.node().focus();
92212             };
92213
92214             return utilRebind(check, dispatch$1, 'on');
92215         }
92216
92217         function uiFieldCombo(field, context) {
92218             var dispatch$1 = dispatch('change');
92219             var nominatim = services$1.geocoder;
92220             var taginfo = services$1.taginfo;
92221             var isMulti = (field.type === 'multiCombo');
92222             var isNetwork = (field.type === 'networkCombo');
92223             var isSemi = (field.type === 'semiCombo');
92224             var optstrings = field.strings && field.strings.options;
92225             var optarray = field.options;
92226             var snake_case = (field.snake_case || (field.snake_case === undefined));
92227             var caseSensitive = field.caseSensitive;
92228             var combobox = uiCombobox(context, 'combo-' + field.safeid)
92229                 .caseSensitive(caseSensitive)
92230                 .minItems(isMulti || isSemi ? 1 : 2);
92231             var container = d3_select(null);
92232             var inputWrap = d3_select(null);
92233             var input = d3_select(null);
92234             var _comboData = [];
92235             var _multiData = [];
92236             var _entity;
92237             var _country;
92238
92239             // ensure multiCombo field.key ends with a ':'
92240             if (isMulti && /[^:]$/.test(field.key)) {
92241                 field.key += ':';
92242             }
92243
92244
92245             function snake(s) {
92246                 return s.replace(/\s+/g, '_');
92247             }
92248
92249             function unsnake(s) {
92250                 return s.replace(/_+/g, ' ');
92251             }
92252
92253             function clean(s) {
92254                 return s.split(';')
92255                     .map(function(s) { return s.trim(); })
92256                     .join(';');
92257             }
92258
92259
92260             // returns the tag value for a display value
92261             // (for multiCombo, dval should be the key suffix, not the entire key)
92262             function tagValue(dval) {
92263                 dval = clean(dval || '');
92264
92265                 if (optstrings) {
92266                     var found = _comboData.find(function(o) {
92267                         return o.key && clean(o.value) === dval;
92268                     });
92269                     if (found) {
92270                         return found.key;
92271                     }
92272                 }
92273
92274                 if (field.type === 'typeCombo' && !dval) {
92275                     return 'yes';
92276                 }
92277
92278                 return (snake_case ? snake(dval) : dval) || undefined;
92279             }
92280
92281
92282             // returns the display value for a tag value
92283             // (for multiCombo, tval should be the key suffix, not the entire key)
92284             function displayValue(tval) {
92285                 tval = tval || '';
92286
92287                 if (optstrings) {
92288                     var found = _comboData.find(function(o) {
92289                         return o.key === tval && o.value;
92290                     });
92291                     if (found) {
92292                         return found.value;
92293                     }
92294                 }
92295
92296                 if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
92297                     return '';
92298                 }
92299
92300                 return snake_case ? unsnake(tval) : tval;
92301             }
92302
92303
92304             // Compute the difference between arrays of objects by `value` property
92305             //
92306             // objectDifference([{value:1}, {value:2}, {value:3}], [{value:2}])
92307             // > [{value:1}, {value:3}]
92308             //
92309             function objectDifference(a, b) {
92310                 return a.filter(function(d1) {
92311                     return !b.some(function(d2) { return d1.value === d2.value; });
92312                 });
92313             }
92314
92315
92316             function initCombo(selection, attachTo) {
92317                 if (optstrings) {
92318                     selection.attr('readonly', 'readonly');
92319                     selection.call(combobox, attachTo);
92320                     setStaticValues(setPlaceholder);
92321
92322                 } else if (optarray) {
92323                     selection.call(combobox, attachTo);
92324                     setStaticValues(setPlaceholder);
92325
92326                 } else if (taginfo) {
92327                     selection.call(combobox.fetcher(setTaginfoValues), attachTo);
92328                     setTaginfoValues('', setPlaceholder);
92329                 }
92330             }
92331
92332
92333             function setStaticValues(callback) {
92334                 if (!(optstrings || optarray)) return;
92335
92336                 if (optstrings) {
92337                     _comboData = Object.keys(optstrings).map(function(k) {
92338                         var v = field.t('options.' + k, { 'default': optstrings[k] });
92339                         return {
92340                             key: k,
92341                             value: v,
92342                             title: v
92343                         };
92344                     });
92345
92346                 } else if (optarray) {
92347                     _comboData = optarray.map(function(k) {
92348                         var v = snake_case ? unsnake(k) : k;
92349                         return {
92350                             key: k,
92351                             value: v,
92352                             title: v
92353                         };
92354                     });
92355                 }
92356
92357                 combobox.data(objectDifference(_comboData, _multiData));
92358                 if (callback) callback(_comboData);
92359             }
92360
92361
92362             function setTaginfoValues(q, callback) {
92363                 var fn = isMulti ? 'multikeys' : 'values';
92364                 var query = (isMulti ? field.key : '') + q;
92365                 var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
92366                 if (hasCountryPrefix) {
92367                     query = _country + ':';
92368                 }
92369
92370                 var params = {
92371                     debounce: (q !== ''),
92372                     key: field.key,
92373                     query: query
92374                 };
92375
92376                 if (_entity) {
92377                     params.geometry = context.geometry(_entity.id);
92378                 }
92379
92380                 taginfo[fn](params, function(err, data) {
92381                     if (err) return;
92382
92383                     var deprecatedValues = osmEntity.deprecatedTagValuesByKey()[field.key];
92384                     if (deprecatedValues) {
92385                         // don't suggest deprecated tag values
92386                         data = data.filter(function(d) {
92387                             return deprecatedValues.indexOf(d.value) === -1;
92388                         });
92389                     }
92390
92391                     if (hasCountryPrefix) {
92392                         data = data.filter(function(d) {
92393                             return d.value.toLowerCase().indexOf(_country + ':') === 0;
92394                         });
92395                     }
92396
92397                     // hide the caret if there are no suggestions
92398                     container.classed('empty-combobox', data.length === 0);
92399
92400                     _comboData = data.map(function(d) {
92401                         var k = d.value;
92402                         if (isMulti) k = k.replace(field.key, '');
92403                         var v = snake_case ? unsnake(k) : k;
92404                         return {
92405                             key: k,
92406                             value: v,
92407                             title: isMulti ? v : d.title
92408                         };
92409                     });
92410
92411                     _comboData = objectDifference(_comboData, _multiData);
92412                     if (callback) callback(_comboData);
92413                 });
92414             }
92415
92416
92417             function setPlaceholder(values) {
92418                 var ph;
92419
92420                 if (isMulti || isSemi) {
92421                     ph = field.placeholder() || t('inspector.add');
92422                 } else {
92423                     var vals = values
92424                         .map(function(d) { return d.value; })
92425                         .filter(function(s) { return s.length < 20; });
92426
92427                     var placeholders = vals.length > 1 ? vals : values.map(function(d) { return d.key; });
92428                     ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
92429                 }
92430
92431                 if (!/(…|\.\.\.)$/.test(ph)) {
92432                     ph += '…';
92433                 }
92434
92435                 container.selectAll('input')
92436                     .attr('placeholder', ph);
92437             }
92438
92439
92440             function change() {
92441                 var t = {};
92442                 var val;
92443
92444                 if (isMulti || isSemi) {
92445                     val = tagValue(utilGetSetValue(input).replace(/,/g, ';')) || '';
92446                     container.classed('active', false);
92447                     utilGetSetValue(input, '');
92448
92449                     var vals = val.split(';').filter(Boolean);
92450                     if (!vals.length) return;
92451
92452                     if (isMulti) {
92453                         utilArrayUniq(vals).forEach(function(v) {
92454                             var key = field.key + v;
92455                             if (_entity) {
92456                                 // don't set a multicombo value to 'yes' if it already has a non-'no' value
92457                                 // e.g. `language:de=main`
92458                                 var old = _entity.tags[key] || '';
92459                                 if (old && old.toLowerCase() !== 'no') return;
92460                             }
92461                             field.keys.push(key);
92462                             t[key] = 'yes';
92463                         });
92464
92465                     } else if (isSemi) {
92466                         var arr = _multiData.map(function(d) { return d.key; });
92467                         arr = arr.concat(vals);
92468                         t[field.key] = utilArrayUniq(arr).filter(Boolean).join(';');
92469                     }
92470
92471                     window.setTimeout(function() { input.node().focus(); }, 10);
92472
92473                 } else {
92474                     val = tagValue(utilGetSetValue(input));
92475                     t[field.key] = val;
92476                 }
92477
92478                 dispatch$1.call('change', this, t);
92479             }
92480
92481
92482             function removeMultikey(d) {
92483                 event.stopPropagation();
92484                 var t = {};
92485                 if (isMulti) {
92486                     t[d.key] = undefined;
92487                 } else if (isSemi) {
92488                     var arr = _multiData.map(function(md) {
92489                         return md.key === d.key ? null : md.key;
92490                     }).filter(Boolean);
92491
92492                     arr = utilArrayUniq(arr);
92493                     t[field.key] = arr.length ? arr.join(';') : undefined;
92494                 }
92495                 dispatch$1.call('change', this, t);
92496             }
92497
92498
92499             function combo(selection) {
92500                 container = selection.selectAll('.form-field-input-wrap')
92501                     .data([0]);
92502
92503                 var type = (isMulti || isSemi) ? 'multicombo': 'combo';
92504                 container = container.enter()
92505                     .append('div')
92506                     .attr('class', 'form-field-input-wrap form-field-input-' + type)
92507                     .merge(container);
92508
92509                 if (isMulti || isSemi) {
92510                     container = container.selectAll('.chiplist')
92511                         .data([0]);
92512
92513                     var listClass = 'chiplist';
92514
92515                     // Use a separate line for each value in the Destinations field
92516                     // to mimic highway exit signs
92517                     if (field.id === 'destination_oneway') {
92518                         listClass += ' full-line-chips';
92519                     }
92520
92521                     container = container.enter()
92522                         .append('ul')
92523                         .attr('class', listClass)
92524                         .on('click', function() {
92525                             window.setTimeout(function() { input.node().focus(); }, 10);
92526                         })
92527                         .merge(container);
92528
92529
92530                     inputWrap = container.selectAll('.input-wrap')
92531                         .data([0]);
92532
92533                     inputWrap = inputWrap.enter()
92534                         .append('li')
92535                         .attr('class', 'input-wrap')
92536                         .merge(inputWrap);
92537
92538                     input = inputWrap.selectAll('input')
92539                         .data([0]);
92540                 } else {
92541                     input = container.selectAll('input')
92542                         .data([0]);
92543                 }
92544
92545                 input = input.enter()
92546                     .append('input')
92547                     .attr('type', 'text')
92548                     .attr('id', 'preset-input-' + field.safeid)
92549                     .call(utilNoAuto)
92550                     .call(initCombo, selection)
92551                     .merge(input);
92552
92553                 if (isNetwork && nominatim && _entity) {
92554                     var center = _entity.extent(context.graph()).center();
92555                     nominatim.countryCode(center, function (err, code) {
92556                         _country = code;
92557                     });
92558                 }
92559
92560                 input
92561                     .on('change', change)
92562                     .on('blur', change);
92563
92564                 input
92565                     .on('keydown.field', function() {
92566                         switch (event.keyCode) {
92567                             case 13: // ↩ Return
92568                                 input.node().blur(); // blurring also enters the value
92569                                 event.stopPropagation();
92570                                 break;
92571                         }
92572                     });
92573
92574                 if (isMulti || isSemi) {
92575                     combobox
92576                         .on('accept', function() {
92577                             input.node().blur();
92578                             input.node().focus();
92579                         });
92580
92581                     input
92582                         .on('focus', function() { container.classed('active', true); });
92583                 }
92584             }
92585
92586
92587             combo.tags = function(tags) {
92588                 if (isMulti || isSemi) {
92589                     _multiData = [];
92590
92591                     if (isMulti) {
92592                         // Build _multiData array containing keys already set..
92593                         for (var k in tags) {
92594                             if (k.indexOf(field.key) !== 0) continue;
92595                             var v = (tags[k] || '').toLowerCase();
92596                             if (v === '' || v === 'no') continue;
92597
92598                             var suffix = k.substring(field.key.length);
92599                             _multiData.push({
92600                                 key: k,
92601                                 value: displayValue(suffix)
92602                             });
92603                         }
92604
92605                         // Set keys for form-field modified (needed for undo and reset buttons)..
92606                         field.keys = _multiData.map(function(d) { return d.key; });
92607
92608                     } else if (isSemi) {
92609                         var arr = utilArrayUniq((tags[field.key] || '').split(';')).filter(Boolean);
92610                         _multiData = arr.map(function(k) {
92611                             return {
92612                                 key: k,
92613                                 value: displayValue(k)
92614                             };
92615                         });
92616                     }
92617
92618                     // Exclude existing multikeys from combo options..
92619                     var available = objectDifference(_comboData, _multiData);
92620                     combobox.data(available);
92621
92622                     // Hide 'Add' button if this field uses fixed set of
92623                     // translateable optstrings and they're all currently used..
92624                     container.selectAll('.combobox-input, .combobox-caret')
92625                         .classed('hide', optstrings && !available.length);
92626
92627
92628                     // Render chips
92629                     var chips = container.selectAll('.chips')
92630                         .data(_multiData);
92631
92632                     chips.exit()
92633                         .remove();
92634
92635                     var enter = chips.enter()
92636                         .insert('li', '.input-wrap')
92637                         .attr('class', 'chips');
92638
92639                     enter.append('span');
92640                     enter.append('a');
92641
92642                     chips = chips.merge(enter);
92643
92644                     chips.select('span')
92645                         .text(function(d) { return d.value; });
92646
92647                     chips.select('a')
92648                         .on('click', removeMultikey)
92649                         .attr('class', 'remove')
92650                         .text('×');
92651
92652                 } else {
92653                     utilGetSetValue(input, displayValue(tags[field.key]));
92654                 }
92655             };
92656
92657
92658             combo.focus = function() {
92659                 input.node().focus();
92660             };
92661
92662
92663             combo.entity = function(val) {
92664                 if (!arguments.length) return _entity;
92665                 _entity = val;
92666                 return combo;
92667             };
92668
92669
92670             return utilRebind(combo, dispatch$1, 'on');
92671         }
92672
92673         function uiFieldText(field, context) {
92674             var dispatch$1 = dispatch('change');
92675             var nominatim = services$1.geocoder;
92676             var input = d3_select(null);
92677             var _entity;
92678
92679             function i(selection) {
92680                 var preset = _entity && context.presets().match(_entity, context.graph());
92681                 var isLocked = preset && preset.suggestion && field.id === 'brand';
92682                 field.locked(isLocked);
92683
92684                 var wrap = selection.selectAll('.form-field-input-wrap')
92685                     .data([0]);
92686
92687                 wrap = wrap.enter()
92688                     .append('div')
92689                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92690                     .merge(wrap);
92691
92692                 var fieldID = 'preset-input-' + field.safeid;
92693
92694                 input = wrap.selectAll('input')
92695                     .data([0]);
92696
92697                 input = input.enter()
92698                     .append('input')
92699                     .attr('type', field.type)
92700                     .attr('id', fieldID)
92701                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
92702                     .classed(field.type, true)
92703                     .call(utilNoAuto)
92704                     .merge(input);
92705
92706                 input
92707                     .classed('disabled', !!isLocked)
92708                     .attr('readonly', isLocked || null)
92709                     .on('input', change(true))
92710                     .on('blur', change())
92711                     .on('change', change());
92712
92713
92714                 if (field.type === 'tel' && nominatim && _entity) {
92715                     var center = _entity.extent(context.graph()).center();
92716                     nominatim.countryCode(center, function (err, countryCode) {
92717                         if (err || !dataPhoneFormats[countryCode]) return;
92718                         wrap.selectAll('#' + fieldID)
92719                             .attr('placeholder', dataPhoneFormats[countryCode]);
92720                     });
92721
92722                 } else if (field.type === 'number') {
92723                     var rtl = (textDirection === 'rtl');
92724
92725                     input.attr('type', 'text');
92726
92727                     var buttons = wrap.selectAll('.increment, .decrement')
92728                         .data(rtl ? [1, -1] : [-1, 1]);
92729
92730                     buttons.enter()
92731                         .append('button')
92732                         .attr('tabindex', -1)
92733                         .attr('class', function(d) {
92734                             var which = (d === 1 ? 'increment' : 'decrement');
92735                             return 'form-field-button ' + which;
92736                         })
92737                         .merge(buttons)
92738                         .on('click', function(d) {
92739                             event.preventDefault();
92740                             var raw_vals = input.node().value || '0';
92741                             var vals = raw_vals.split(';');
92742                             vals = vals.map(function(v) {
92743                                 var num = parseFloat(v.trim(), 10);
92744                                 return isFinite(num) ? clamped(num + d) : v.trim();
92745                             });
92746                             input.node().value = vals.join(';');
92747                             change()();
92748                         });
92749                 }
92750             }
92751
92752
92753             // clamp number to min/max
92754             function clamped(num) {
92755                 if (field.minValue !== undefined) {
92756                     num = Math.max(num, field.minValue);
92757                 }
92758                 if (field.maxValue !== undefined) {
92759                     num = Math.min(num, field.maxValue);
92760                 }
92761                 return num;
92762             }
92763
92764
92765             function change(onInput) {
92766                 return function() {
92767                     var t = {};
92768                     var val = utilGetSetValue(input).trim() || undefined;
92769
92770                     if (!onInput) {
92771                         if (field.type === 'number' && val !== undefined) {
92772                             var vals = val.split(';');
92773                             vals = vals.map(function(v) {
92774                                 var num = parseFloat(v.trim(), 10);
92775                                 return isFinite(num) ? clamped(num) : v.trim();
92776                             });
92777                             val = vals.join(';');
92778                         }
92779                         utilGetSetValue(input, val || '');
92780                     }
92781                     t[field.key] = val;
92782                     dispatch$1.call('change', this, t, onInput);
92783                 };
92784             }
92785
92786
92787             i.entity = function(val) {
92788                 if (!arguments.length) return _entity;
92789                 _entity = val;
92790                 return i;
92791             };
92792
92793
92794             i.tags = function(tags) {
92795                 utilGetSetValue(input, tags[field.key] || '');
92796             };
92797
92798
92799             i.focus = function() {
92800                 var node = input.node();
92801                 if (node) node.focus();
92802             };
92803
92804             return utilRebind(i, dispatch$1, 'on');
92805         }
92806
92807         function uiFieldAccess(field, context) {
92808             var dispatch$1 = dispatch('change');
92809             var items = d3_select(null);
92810
92811             function access(selection) {
92812                 var wrap = selection.selectAll('.form-field-input-wrap')
92813                     .data([0]);
92814
92815                 wrap = wrap.enter()
92816                     .append('div')
92817                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
92818                     .merge(wrap);
92819
92820                 var list = wrap.selectAll('ul')
92821                     .data([0]);
92822
92823                 list = list.enter()
92824                     .append('ul')
92825                     .attr('class', 'rows')
92826                     .merge(list);
92827
92828
92829                 items = list.selectAll('li')
92830                     .data(field.keys);
92831
92832                 // Enter
92833                 var enter = items.enter()
92834                     .append('li')
92835                     .attr('class', function(d) { return 'labeled-input preset-access-' + d; });
92836
92837                 enter
92838                     .append('span')
92839                     .attr('class', 'label preset-label-access')
92840                     .attr('for', function(d) { return 'preset-input-access-' + d; })
92841                     .text(function(d) { return field.t('types.' + d); });
92842
92843                 enter
92844                     .append('div')
92845                     .attr('class', 'preset-input-access-wrap')
92846                     .append('input')
92847                     .attr('type', 'text')
92848                     .attr('class', function(d) { return 'preset-input-access preset-input-access-' + d; })
92849                     .call(utilNoAuto)
92850                     .each(function(d) {
92851                         d3_select(this)
92852                             .call(uiCombobox(context, 'access-' + d)
92853                                 .data(access.options(d))
92854                             );
92855                     });
92856
92857
92858                 // Update
92859                 items = items.merge(enter);
92860
92861                 wrap.selectAll('.preset-input-access')
92862                     .on('change', change)
92863                     .on('blur', change);
92864             }
92865
92866
92867             function change(d) {
92868                 var tag = {};
92869                 tag[d] = utilGetSetValue(d3_select(this)) || undefined;
92870                 dispatch$1.call('change', this, tag);
92871             }
92872
92873
92874             access.options = function(type) {
92875                 var options = ['no', 'permissive', 'private', 'permit', 'destination'];
92876
92877                 if (type !== 'access') {
92878                     options.unshift('yes');
92879                     options.push('designated');
92880
92881                     if (type === 'bicycle') {
92882                         options.push('dismount');
92883                     }
92884                 }
92885
92886                 return options.map(function(option) {
92887                     return {
92888                         title: field.t('options.' + option + '.description'),
92889                         value: option
92890                     };
92891                 });
92892             };
92893
92894
92895             var placeholders = {
92896                 footway: {
92897                     foot: 'designated',
92898                     motor_vehicle: 'no'
92899                 },
92900                 steps: {
92901                     foot: 'yes',
92902                     motor_vehicle: 'no',
92903                     bicycle: 'no',
92904                     horse: 'no'
92905                 },
92906                 pedestrian: {
92907                     foot: 'yes',
92908                     motor_vehicle: 'no'
92909                 },
92910                 cycleway: {
92911                     motor_vehicle: 'no',
92912                     bicycle: 'designated'
92913                 },
92914                 bridleway: {
92915                     motor_vehicle: 'no',
92916                     horse: 'designated'
92917                 },
92918                 path: {
92919                     foot: 'yes',
92920                     motor_vehicle: 'no',
92921                     bicycle: 'yes',
92922                     horse: 'yes'
92923                 },
92924                 motorway: {
92925                     foot: 'no',
92926                     motor_vehicle: 'yes',
92927                     bicycle: 'no',
92928                     horse: 'no'
92929                 },
92930                 trunk: {
92931                     motor_vehicle: 'yes'
92932                 },
92933                 primary: {
92934                     foot: 'yes',
92935                     motor_vehicle: 'yes',
92936                     bicycle: 'yes',
92937                     horse: 'yes'
92938                 },
92939                 secondary: {
92940                     foot: 'yes',
92941                     motor_vehicle: 'yes',
92942                     bicycle: 'yes',
92943                     horse: 'yes'
92944                 },
92945                 tertiary: {
92946                     foot: 'yes',
92947                     motor_vehicle: 'yes',
92948                     bicycle: 'yes',
92949                     horse: 'yes'
92950                 },
92951                 residential: {
92952                     foot: 'yes',
92953                     motor_vehicle: 'yes',
92954                     bicycle: 'yes',
92955                     horse: 'yes'
92956                 },
92957                 unclassified: {
92958                     foot: 'yes',
92959                     motor_vehicle: 'yes',
92960                     bicycle: 'yes',
92961                     horse: 'yes'
92962                 },
92963                 service: {
92964                     foot: 'yes',
92965                     motor_vehicle: 'yes',
92966                     bicycle: 'yes',
92967                     horse: 'yes'
92968                 },
92969                 motorway_link: {
92970                     foot: 'no',
92971                     motor_vehicle: 'yes',
92972                     bicycle: 'no',
92973                     horse: 'no'
92974                 },
92975                 trunk_link: {
92976                     motor_vehicle: 'yes'
92977                 },
92978                 primary_link: {
92979                     foot: 'yes',
92980                     motor_vehicle: 'yes',
92981                     bicycle: 'yes',
92982                     horse: 'yes'
92983                 },
92984                 secondary_link: {
92985                     foot: 'yes',
92986                     motor_vehicle: 'yes',
92987                     bicycle: 'yes',
92988                     horse: 'yes'
92989                 },
92990                 tertiary_link: {
92991                     foot: 'yes',
92992                     motor_vehicle: 'yes',
92993                     bicycle: 'yes',
92994                     horse: 'yes'
92995                 }
92996             };
92997
92998
92999             access.tags = function(tags) {
93000                 utilGetSetValue(items.selectAll('.preset-input-access'),
93001                     function(d) { return tags[d] || ''; })
93002                     .attr('placeholder', function() {
93003                         return tags.access ? tags.access : field.placeholder();
93004                     });
93005
93006                 items.selectAll('.preset-input-access-access')
93007                     .attr('placeholder', 'yes');
93008
93009                 var which = tags.highway;
93010                 if (!placeholders[which]) return;
93011
93012                 var keys = Object.keys(placeholders[which]);
93013                 keys.forEach(function(k) {
93014                     var v = placeholders[which][k];
93015                     items.selectAll('.preset-input-access-' + k)
93016                         .attr('placeholder', tags.access || v);
93017                 });
93018             };
93019
93020
93021             access.focus = function() {
93022                 items.selectAll('.preset-input-access')
93023                     .node().focus();
93024             };
93025
93026
93027             return utilRebind(access, dispatch$1, 'on');
93028         }
93029
93030         function uiFieldAddress(field, context) {
93031             var dispatch$1 = dispatch('init', 'change');
93032             var nominatim = services$1.geocoder;
93033             var wrap = d3_select(null);
93034             var _isInitialized = false;
93035             var _entity;
93036
93037             function getNearStreets() {
93038                 var extent = _entity.extent(context.graph());
93039                 var l = extent.center();
93040                 var box = geoExtent(l).padByMeters(200);
93041
93042                 var streets = context.intersects(box)
93043                     .filter(isAddressable)
93044                     .map(function(d) {
93045                         var loc = context.projection([
93046                             (extent[0][0] + extent[1][0]) / 2,
93047                             (extent[0][1] + extent[1][1]) / 2
93048                         ]);
93049                         var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
93050
93051                         return {
93052                             title: d.tags.name,
93053                             value: d.tags.name,
93054                             dist: choice.distance
93055                         };
93056                     })
93057                     .sort(function(a, b) {
93058                         return a.dist - b.dist;
93059                     });
93060
93061                 return utilArrayUniqBy(streets, 'value');
93062
93063                 function isAddressable(d) {
93064                     return d.tags.highway && d.tags.name && d.type === 'way';
93065                 }
93066             }
93067
93068
93069             function getNearCities() {
93070                 var extent = _entity.extent(context.graph());
93071                 var l = extent.center();
93072                 var box = geoExtent(l).padByMeters(200);
93073
93074                 var cities = context.intersects(box)
93075                     .filter(isAddressable)
93076                     .map(function(d) {
93077                         return {
93078                             title: d.tags['addr:city'] || d.tags.name,
93079                             value: d.tags['addr:city'] || d.tags.name,
93080                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93081                         };
93082                     })
93083                     .sort(function(a, b) {
93084                         return a.dist - b.dist;
93085                     });
93086
93087                 return utilArrayUniqBy(cities, 'value');
93088
93089
93090                 function isAddressable(d) {
93091                     if (d.tags.name) {
93092                         if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
93093                             return true;
93094                         if (d.tags.border_type === 'city')
93095                             return true;
93096                         if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
93097                             return true;
93098                     }
93099
93100                     if (d.tags['addr:city'])
93101                         return true;
93102
93103                     return false;
93104                 }
93105             }
93106
93107             function getNearValues(key) {
93108                 var extent = _entity.extent(context.graph());
93109                 var l = extent.center();
93110                 var box = geoExtent(l).padByMeters(200);
93111
93112                 var results = context.intersects(box)
93113                     .filter(function hasTag(d) { return d.id !== _entity.id && d.tags[key]; })
93114                     .map(function(d) {
93115                         return {
93116                             title: d.tags[key],
93117                             value: d.tags[key],
93118                             dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
93119                         };
93120                     })
93121                     .sort(function(a, b) {
93122                         return a.dist - b.dist;
93123                     });
93124
93125                 return utilArrayUniqBy(results, 'value');
93126             }
93127
93128
93129             function countryCallback(err, countryCode) {
93130                 if (err) return;
93131                 countryCode = countryCode.toLowerCase();
93132
93133                 var addressFormat;
93134                 for (var i = 0; i < dataAddressFormats.length; i++) {
93135                     var format = dataAddressFormats[i];
93136                     if (!format.countryCodes) {
93137                         addressFormat = format;   // choose the default format, keep going
93138                     } else if (format.countryCodes.indexOf(countryCode) !== -1) {
93139                         addressFormat = format;   // choose the country format, stop here
93140                         break;
93141                     }
93142                 }
93143
93144                 var dropdowns = addressFormat.dropdowns || [
93145                     'city', 'county', 'country', 'district', 'hamlet',
93146                     'neighbourhood', 'place', 'postcode', 'province',
93147                     'quarter', 'state', 'street', 'subdistrict', 'suburb'
93148                 ];
93149
93150                 var widths = addressFormat.widths || {
93151                     housenumber: 1/3, street: 2/3,
93152                     city: 2/3, state: 1/4, postcode: 1/3
93153                 };
93154
93155                 function row(r) {
93156                     // Normalize widths.
93157                     var total = r.reduce(function(sum, key) {
93158                         return sum + (widths[key] || 0.5);
93159                     }, 0);
93160
93161                     return r.map(function(key) {
93162                         return {
93163                             id: key,
93164                             width: (widths[key] || 0.5) / total
93165                         };
93166                     });
93167                 }
93168
93169                 wrap.selectAll('.addr-row')
93170                     .data(addressFormat.format)
93171                     .enter()
93172                     .append('div')
93173                     .attr('class', 'addr-row')
93174                     .selectAll('input')
93175                     .data(row)
93176                     .enter()
93177                     .append('input')
93178                     .property('type', 'text')
93179                     .attr('placeholder', function (d) {
93180                         var localkey = d.id + '!' + countryCode;
93181                         var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
93182                         return field.t('placeholders.' + tkey);
93183                     })
93184                     .attr('class', function (d) { return 'addr-' + d.id; })
93185                     .call(utilNoAuto)
93186                     .each(addDropdown)
93187                     .style('width', function (d) { return d.width * 100 + '%'; });
93188
93189
93190                 function addDropdown(d) {
93191                     if (dropdowns.indexOf(d.id) === -1) return;  // not a dropdown
93192
93193                     var nearValues = (d.id === 'street') ? getNearStreets
93194                         : (d.id === 'city') ? getNearCities
93195                         : getNearValues;
93196
93197                     d3_select(this)
93198                         .call(uiCombobox(context, 'address-' + d.id)
93199                             .minItems(1)
93200                             .caseSensitive(true)
93201                             .fetcher(function(value, callback) {
93202                                 callback(nearValues('addr:' + d.id));
93203                             })
93204                         );
93205                 }
93206
93207                 wrap.selectAll('input')
93208                     .on('blur', change())
93209                     .on('change', change());
93210
93211                 wrap.selectAll('input:not(.combobox-input)')
93212                     .on('input', change(true));
93213
93214                 dispatch$1.call('init');
93215                 _isInitialized = true;
93216             }
93217
93218
93219             function address(selection) {
93220                 _isInitialized = false;
93221
93222                 wrap = selection.selectAll('.form-field-input-wrap')
93223                     .data([0]);
93224
93225                 wrap = wrap.enter()
93226                     .append('div')
93227                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93228                     .merge(wrap);
93229
93230                 if (nominatim && _entity) {
93231                     var center = _entity.extent(context.graph()).center();
93232                     nominatim.countryCode(center, countryCallback);
93233                 }
93234             }
93235
93236
93237             function change(onInput) {
93238                 return function() {
93239                     var tags = {};
93240
93241                     wrap.selectAll('input')
93242                         .each(function (field) {
93243                             tags['addr:' + field.id] = this.value || undefined;
93244                         });
93245
93246                     dispatch$1.call('change', this, tags, onInput);
93247                 };
93248             }
93249
93250
93251             function updateTags(tags) {
93252                 utilGetSetValue(wrap.selectAll('input'), function (field) {
93253                     return tags['addr:' + field.id] || '';
93254                 });
93255             }
93256
93257
93258             address.entity = function(val) {
93259                 if (!arguments.length) return _entity;
93260                 _entity = val;
93261                 return address;
93262             };
93263
93264
93265             address.tags = function(tags) {
93266                 if (_isInitialized) {
93267                     updateTags(tags);
93268                 } else {
93269                     dispatch$1.on('init', function () {
93270                         dispatch$1.on('init', null);
93271                         updateTags(tags);
93272                     });
93273                 }
93274             };
93275
93276
93277             address.focus = function() {
93278                 var node = wrap.selectAll('input').node();
93279                 if (node) node.focus();
93280             };
93281
93282
93283             return utilRebind(address, dispatch$1, 'on');
93284         }
93285
93286         function uiFieldCycleway(field, context) {
93287             var dispatch$1 = dispatch('change');
93288             var items = d3_select(null);
93289             var wrap = d3_select(null);
93290
93291             function cycleway(selection) {
93292
93293                 function stripcolon(s) {
93294                     return s.replace(':', '');
93295                 }
93296
93297
93298                 wrap = selection.selectAll('.form-field-input-wrap')
93299                     .data([0]);
93300
93301                 wrap = wrap.enter()
93302                     .append('div')
93303                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93304                     .merge(wrap);
93305
93306
93307                 var div = wrap.selectAll('ul')
93308                     .data([0]);
93309
93310                 div = div.enter()
93311                     .append('ul')
93312                     .attr('class', 'rows')
93313                     .merge(div);
93314
93315                 var keys = ['cycleway:left', 'cycleway:right'];
93316
93317                 items = div.selectAll('li')
93318                     .data(keys);
93319
93320                 var enter = items.enter()
93321                     .append('li')
93322                     .attr('class', function(d) { return 'labeled-input preset-cycleway-' + stripcolon(d); });
93323
93324                 enter
93325                     .append('span')
93326                     .attr('class', 'label preset-label-cycleway')
93327                     .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
93328                     .text(function(d) { return field.t('types.' + d); });
93329
93330                 enter
93331                     .append('div')
93332                     .attr('class', 'preset-input-cycleway-wrap')
93333                     .append('input')
93334                     .attr('type', 'text')
93335                     .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
93336                     .call(utilNoAuto)
93337                     .each(function(d) {
93338                         d3_select(this)
93339                             .call(uiCombobox(context, 'cycleway-' + stripcolon(d))
93340                                 .data(cycleway.options(d))
93341                             );
93342                     });
93343
93344
93345                 // Update
93346                 wrap.selectAll('.preset-input-cycleway')
93347                     .on('change', change)
93348                     .on('blur', change);
93349             }
93350
93351
93352             function change() {
93353                 var left = utilGetSetValue(d3_select('.preset-input-cyclewayleft'));
93354                 var right = utilGetSetValue(d3_select('.preset-input-cyclewayright'));
93355                 var tag = {};
93356
93357                 if (left === 'none' || left === '') { left = undefined; }
93358                 if (right === 'none' || right === '') { right = undefined; }
93359
93360                 // Always set both left and right as changing one can affect the other
93361                 tag = {
93362                     cycleway: undefined,
93363                     'cycleway:left': left,
93364                     'cycleway:right': right
93365                 };
93366
93367                 // If the left and right tags match, use the cycleway tag to tag both
93368                 // sides the same way
93369                 if (left === right) {
93370                     tag = {
93371                         cycleway: left,
93372                         'cycleway:left': undefined,
93373                         'cycleway:right': undefined
93374                     };
93375                 }
93376
93377                 dispatch$1.call('change', this, tag);
93378             }
93379
93380
93381             cycleway.options = function() {
93382                 return Object.keys(field.strings.options).map(function(option) {
93383                     return {
93384                         title: field.t('options.' + option + '.description'),
93385                         value: option
93386                     };
93387                 });
93388             };
93389
93390
93391             cycleway.tags = function(tags) {
93392                 utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
93393                         // If cycleway is set, always return that
93394                         if (tags.cycleway) {
93395                             return tags.cycleway;
93396                         }
93397                         return tags[d] || '';
93398                     })
93399                     .attr('placeholder', field.placeholder());
93400             };
93401
93402
93403             cycleway.focus = function() {
93404                 var node = wrap.selectAll('input').node();
93405                 if (node) node.focus();
93406             };
93407
93408
93409             return utilRebind(cycleway, dispatch$1, 'on');
93410         }
93411
93412         function uiFieldLanes(field, context) {
93413             var dispatch$1 = dispatch('change');
93414             var LANE_WIDTH = 40;
93415             var LANE_HEIGHT = 200;
93416             var _entityID;
93417
93418             function lanes(selection) {
93419                 var lanesData = context.entity(_entityID).lanes();
93420
93421                 if (!d3_select('.inspector-wrap.inspector-hidden').empty() || !selection.node().parentNode) {
93422                     selection.call(lanes.off);
93423                     return;
93424                 }
93425
93426                 var wrap = selection.selectAll('.form-field-input-wrap')
93427                     .data([0]);
93428
93429                 wrap = wrap.enter()
93430                     .append('div')
93431                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93432                     .merge(wrap);
93433
93434                 var surface =  wrap.selectAll('.surface')
93435                     .data([0]);
93436
93437                 var d = utilGetDimensions(wrap);
93438                 var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
93439
93440                 surface = surface.enter()
93441                     .append('svg')
93442                     .attr('width', d[0])
93443                     .attr('height', 300)
93444                     .attr('class', 'surface')
93445                     .merge(surface);
93446
93447
93448                 var lanesSelection = surface.selectAll('.lanes')
93449                     .data([0]);
93450
93451                 lanesSelection = lanesSelection.enter()
93452                     .append('g')
93453                     .attr('class', 'lanes')
93454                     .merge(lanesSelection);
93455
93456                 lanesSelection
93457                     .attr('transform', function () {
93458                         return 'translate(' + (freeSpace / 2) + ', 0)';
93459                     });
93460
93461
93462                 var lane = lanesSelection.selectAll('.lane')
93463                    .data(lanesData.lanes);
93464
93465                 lane.exit()
93466                     .remove();
93467
93468                 var enter = lane.enter()
93469                     .append('g')
93470                     .attr('class', 'lane');
93471
93472                 enter
93473                     .append('g')
93474                     .append('rect')
93475                     .attr('y', 50)
93476                     .attr('width', LANE_WIDTH)
93477                     .attr('height', LANE_HEIGHT);
93478
93479                 enter
93480                     .append('g')
93481                     .attr('class', 'forward')
93482                     .append('text')
93483                     .attr('y', 40)
93484                     .attr('x', 14)
93485                     .text('▲');
93486
93487                 enter
93488                     .append('g')
93489                     .attr('class', 'bothways')
93490                     .append('text')
93491                     .attr('y', 40)
93492                     .attr('x', 14)
93493                     .text('▲▼');
93494
93495                 enter
93496                     .append('g')
93497                     .attr('class', 'backward')
93498                     .append('text')
93499                     .attr('y', 40)
93500                     .attr('x', 14)
93501                     .text('▼');
93502
93503
93504                 lane = lane
93505                     .merge(enter);
93506
93507                 lane
93508                     .attr('transform', function(d) {
93509                         return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
93510                     });
93511
93512                 lane.select('.forward')
93513                     .style('visibility', function(d) {
93514                         return d.direction === 'forward' ? 'visible' : 'hidden';
93515                     });
93516
93517                 lane.select('.bothways')
93518                     .style('visibility', function(d) {
93519                         return d.direction === 'bothways' ? 'visible' : 'hidden';
93520                     });
93521
93522                 lane.select('.backward')
93523                     .style('visibility', function(d) {
93524                         return d.direction === 'backward' ? 'visible' : 'hidden';
93525                     });
93526             }
93527
93528
93529             lanes.entity = function(val) {
93530                 if (!_entityID || _entityID !== val.id) {
93531                     _entityID = val.id;
93532                 }
93533             };
93534
93535             lanes.tags = function() {};
93536             lanes.focus = function() {};
93537             lanes.off = function() {};
93538
93539             return utilRebind(lanes, dispatch$1, 'on');
93540         }
93541
93542         function uiFieldLocalized(field, context) {
93543             var dispatch$1 = dispatch('change', 'input');
93544             var wikipedia = services$1.wikipedia;
93545             var input = d3_select(null);
93546             var localizedInputs = d3_select(null);
93547
93548             var allSuggestions = context.presets().collection.filter(function(p) {
93549                 return p.suggestion === true;
93550             });
93551
93552             // reuse these combos
93553             var langCombo = uiCombobox(context, 'localized-lang')
93554                 .fetcher(fetchLanguages)
93555                 .minItems(0);
93556
93557             var brandCombo = uiCombobox(context, 'localized-brand')
93558                 .canAutocomplete(false)
93559                 .minItems(1);
93560
93561             var _selection = d3_select(null);
93562             var _multilingual = [];
93563             var _buttonTip = tooltip()
93564                 .title(t('translate.translate'))
93565                 .placement('left');
93566             var _wikiTitles;
93567             var _entity;
93568
93569
93570             function calcLocked() {
93571                 if (!_entity) {    // the original entity
93572                     field.locked(false);
93573                     return;
93574                 }
93575
93576                 var latest = context.hasEntity(_entity.id);
93577                 if (!latest) {    // get current entity, possibly edited
93578                     field.locked(false);
93579                     return;
93580                 }
93581
93582                 var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
93583                 var hasWikidata = latest.tags.wikidata;
93584                 var preset = context.presets().match(latest, context.graph());
93585                 var isSuggestion = preset && preset.suggestion;
93586                 var showsBrand = preset && preset.fields
93587                     .filter(function(d) { return d.id === 'brand'; }).length;
93588
93589                 var isLocked = !!(field.id === 'name' && hasOriginalName &&
93590                     (hasWikidata || (isSuggestion && !showsBrand)));
93591
93592                 field.locked(isLocked);
93593             }
93594
93595
93596             function calcMultilingual(tags) {
93597                 _multilingual = [];
93598                 for (var k in tags) {
93599                     var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
93600                     if (m && m[1] === field.key && m[2]) {
93601                         _multilingual.push({ lang: m[2], value: tags[k] });
93602                     }
93603                 }
93604                 _multilingual.reverse();
93605             }
93606
93607
93608             function localized(selection) {
93609                 _selection = selection;
93610                 calcLocked();
93611                 var isLocked = field.locked();
93612                 var entity = _entity && context.hasEntity(_entity.id);  // get latest
93613                 var preset = entity && context.presets().match(entity, context.graph());
93614
93615                 var wrap = selection.selectAll('.form-field-input-wrap')
93616                     .data([0]);
93617
93618                 // enter/update
93619                 wrap = wrap.enter()
93620                     .append('div')
93621                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
93622                     .merge(wrap);
93623
93624                 input = wrap.selectAll('.localized-main')
93625                     .data([0]);
93626
93627                 // enter/update
93628                 input = input.enter()
93629                     .append('input')
93630                     .attr('type', 'text')
93631                     .attr('id', 'preset-input-' + field.safeid)
93632                     .attr('class', 'localized-main')
93633                     .attr('placeholder', field.placeholder())
93634                     .call(utilNoAuto)
93635                     .merge(input);
93636
93637                 if (preset && field.id === 'name') {
93638                     var pTag = preset.id.split('/', 2);
93639                     var pKey = pTag[0];
93640                     var pValue = pTag[1];
93641
93642                     if (!preset.suggestion) {
93643                         // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
93644                         // This code attempts to determine if the matched preset is the
93645                         // kind of preset that even can benefit from name suggestions..
93646                         // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
93647                         // - false = churches, parks, hospitals, etc. (things not in the index)
93648                         var isFallback = preset.isFallback();
93649                         var goodSuggestions = allSuggestions.filter(function(s) {
93650                             if (isFallback) return true;
93651                             var sTag = s.id.split('/', 2);
93652                             var sKey = sTag[0];
93653                             var sValue = sTag[1];
93654                             return pKey === sKey && (!pValue || pValue === sValue);
93655                         });
93656
93657                         // Show the suggestions.. If the user picks one, change the tags..
93658                         if (allSuggestions.length && goodSuggestions.length) {
93659                             input
93660                                 .on('blur.localized', checkBrandOnBlur)
93661                                 .call(brandCombo
93662                                     .fetcher(fetchBrandNames(preset, allSuggestions))
93663                                     .on('accept', acceptBrand)
93664                                     .on('cancel', cancelBrand)
93665                                 );
93666                         }
93667                     }
93668                 }
93669
93670                 input
93671                     .classed('disabled', !!isLocked)
93672                     .attr('readonly', isLocked || null)
93673                     .on('input', change(true))
93674                     .on('blur', change())
93675                     .on('change', change());
93676
93677
93678                 var translateButton = wrap.selectAll('.localized-add')
93679                     .data([0]);
93680
93681                 translateButton = translateButton.enter()
93682                     .append('button')
93683                     .attr('class', 'localized-add form-field-button')
93684                     .attr('tabindex', -1)
93685                     .call(svgIcon('#iD-icon-plus'))
93686                     .merge(translateButton);
93687
93688                 translateButton
93689                     .classed('disabled', !!isLocked)
93690                     .call(isLocked ? _buttonTip.destroy : _buttonTip)
93691                     .on('click', addNew);
93692
93693
93694                 if (entity && !_multilingual.length) {
93695                     calcMultilingual(entity.tags);
93696                 }
93697
93698                 localizedInputs = selection.selectAll('.localized-multilingual')
93699                     .data([0]);
93700
93701                 localizedInputs = localizedInputs.enter()
93702                     .append('div')
93703                     .attr('class', 'localized-multilingual')
93704                     .merge(localizedInputs);
93705
93706                 localizedInputs
93707                     .call(renderMultilingual);
93708
93709                 localizedInputs.selectAll('button, input')
93710                     .classed('disabled', !!isLocked)
93711                     .attr('readonly', isLocked || null);
93712
93713
93714
93715                 // We are not guaranteed to get an `accept` or `cancel` when blurring the field.
93716                 // (This can happen if the user actives the combo, arrows down, and then clicks off to blur)
93717                 // So compare the current field value against the suggestions one last time.
93718                 function checkBrandOnBlur() {
93719                     var latest = context.hasEntity(_entity.id);
93720                     if (!latest) return;   // deleting the entity blurred the field?
93721
93722                     var preset = context.presets().match(latest, context.graph());
93723                     if (preset && preset.suggestion) return;   // already accepted
93724
93725                     // note: here we are testing against "decorated" names, i.e. 'Starbucks – Cafe'
93726                     var name = utilGetSetValue(input).trim();
93727                     var matched = allSuggestions.filter(function(s) { return name === s.name(); });
93728
93729                     if (matched.length === 1) {
93730                         acceptBrand({ suggestion: matched[0] });
93731                     } else {
93732                         cancelBrand();
93733                     }
93734                 }
93735
93736
93737                 function acceptBrand(d) {
93738                     if (!d) {
93739                         cancelBrand();
93740                         return;
93741                     }
93742
93743                     var entity = context.entity(_entity.id);  // get latest
93744                     var tags = entity.tags;
93745                     var geometry = entity.geometry(context.graph());
93746                     var removed = preset.unsetTags(tags, geometry);
93747                     for (var k in tags) {
93748                         tags[k] = removed[k];  // set removed tags to `undefined`
93749                     }
93750                     tags = d.suggestion.setTags(tags, geometry);
93751                     utilGetSetValue(input, tags.name);
93752                     dispatch$1.call('change', this, tags);
93753                 }
93754
93755
93756                 // user hit escape, clean whatever preset name appears after the last ' – '
93757                 function cancelBrand() {
93758                     var name = utilGetSetValue(input);
93759                     var clean = cleanName(name);
93760                     if (clean !== name) {
93761                         utilGetSetValue(input, clean);
93762                         dispatch$1.call('change', this, { name: clean });
93763                     }
93764                 }
93765
93766                 // Remove whatever is after the last ' – '
93767                 // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
93768                 function cleanName(name) {
93769                     var parts = name.split(' – ');
93770                     if (parts.length > 1) {
93771                         parts.pop();
93772                         name = parts.join(' – ');
93773                     }
93774                     return name;
93775                 }
93776
93777
93778                 function fetchBrandNames(preset, suggestions) {
93779                     var pTag = preset.id.split('/', 2);
93780                     var pKey = pTag[0];
93781                     var pValue = pTag[1];
93782
93783                     return function(value, callback) {
93784                         var results = [];
93785                         if (value && value.length > 2) {
93786                             for (var i = 0; i < suggestions.length; i++) {
93787                                 var s = suggestions[i];
93788                                 var sTag = s.id.split('/', 2);
93789                                 var sKey = sTag[0];
93790                                 var sValue = sTag[1];
93791                                 var name = s.name();
93792                                 var dist = utilEditDistance(value, name.substring(0, value.length));
93793                                 var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
93794
93795                                 if (dist < 1 || (matchesPreset && dist < 3)) {
93796                                     var obj = {
93797                                         title: name,
93798                                         value: name,
93799                                         suggestion: s,
93800                                         dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
93801                                     };
93802                                     results.push(obj);
93803                                 }
93804                             }
93805                             results.sort(function(a, b) { return a.dist - b.dist; });
93806                         }
93807                         results = results.slice(0, 10);
93808                         callback(results);
93809                     };
93810                 }
93811
93812
93813                 function addNew() {
93814                     event.preventDefault();
93815                     if (field.locked()) return;
93816
93817                     var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
93818                     var langExists = _multilingual.find(function(datum) { return datum.lang === defaultLang; });
93819                     var isLangEn = defaultLang.indexOf('en') > -1;
93820                     if (isLangEn || langExists) {
93821                         defaultLang = '';
93822                     }
93823                     _multilingual.push({ lang: defaultLang, value: '' });
93824
93825                     localizedInputs
93826                         .call(renderMultilingual);
93827                 }
93828
93829
93830                 function change(onInput) {
93831                     return function() {
93832                         if (field.locked()) {
93833                             event.preventDefault();
93834                             return;
93835                         }
93836                         var t = {};
93837                         t[field.key] = utilGetSetValue(d3_select(this)) || undefined;
93838                         dispatch$1.call('change', this, t, onInput);
93839                     };
93840                 }
93841             }
93842
93843
93844             function key(lang) {
93845                 return field.key + ':' + lang;
93846             }
93847
93848
93849             function changeLang(d) {
93850                 var lang = utilGetSetValue(d3_select(this));
93851                 var t = {};
93852                 var language = wikipedia$2.find(function(d) {
93853                     return d[0].toLowerCase() === lang.toLowerCase() ||
93854                         d[1].toLowerCase() === lang.toLowerCase();
93855                 });
93856
93857                 if (language) lang = language[2];
93858
93859                 if (d.lang && d.lang !== lang) {
93860                     t[key(d.lang)] = undefined;
93861                 }
93862
93863                 var value = utilGetSetValue(d3_select(this.parentNode)
93864                     .selectAll('.localized-value'));
93865
93866                 if (lang && value) {
93867                     t[key(lang)] = value;
93868                 } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
93869                     t[key(lang)] = _wikiTitles[d.lang];
93870                 }
93871
93872                 d.lang = lang;
93873                 dispatch$1.call('change', this, t);
93874             }
93875
93876
93877             function changeValue(d) {
93878                 if (!d.lang) return;
93879                 var t = {};
93880                 t[key(d.lang)] = utilGetSetValue(d3_select(this)) || undefined;
93881                 dispatch$1.call('change', this, t);
93882             }
93883
93884
93885             function fetchLanguages(value, cb) {
93886                 var v = value.toLowerCase();
93887
93888                 cb(wikipedia$2.filter(function(d) {
93889                     return d[0].toLowerCase().indexOf(v) >= 0 ||
93890                     d[1].toLowerCase().indexOf(v) >= 0 ||
93891                     d[2].toLowerCase().indexOf(v) >= 0;
93892                 }).map(function(d) {
93893                     return { value: d[1] };
93894                 }));
93895             }
93896
93897
93898             function renderMultilingual(selection) {
93899                 var wraps = selection.selectAll('div.entry')
93900                     .data(_multilingual, function(d) { return d.lang; });
93901
93902                 wraps.exit()
93903                     .transition()
93904                     .duration(200)
93905                     .style('max-height', '0px')
93906                     .style('opacity', '0')
93907                     .style('top', '-10px')
93908                     .remove();
93909
93910                 var innerWrap = wraps.enter()
93911                     .insert('div', ':first-child');
93912
93913                 innerWrap
93914                     .attr('class', 'entry')
93915                     .each(function() {
93916                         var wrap = d3_select(this);
93917
93918                         var label = wrap
93919                             .append('label')
93920                             .attr('class', 'field-label');
93921
93922                         var text = label
93923                             .append('span')
93924                             .attr('class', 'label-text');
93925
93926                         text
93927                             .append('span')
93928                             .attr('class', 'label-textvalue')
93929                             .text(t('translate.localized_translation_label'));
93930
93931                         text
93932                             .append('span')
93933                             .attr('class', 'label-textannotation');
93934
93935                         label
93936                             .append('button')
93937                             .attr('class', 'remove-icon-multilingual')
93938                             .on('click', function(d){
93939                                 if (field.locked()) return;
93940                                 event.preventDefault();
93941                                 var t = {};
93942                                 t[key(d.lang)] = undefined;
93943                                 dispatch$1.call('change', this, t);
93944                                 d3_select(this.parentNode.parentNode.parentNode)
93945                                     .style('top', '0')
93946                                     .style('max-height', '240px')
93947                                     .transition()
93948                                     .style('opacity', '0')
93949                                     .style('max-height', '0px')
93950                                     .remove();
93951                             })
93952                             .call(svgIcon('#iD-operation-delete'));
93953
93954                         wrap
93955                             .append('input')
93956                             .attr('class', 'localized-lang')
93957                             .attr('type', 'text')
93958                             .attr('placeholder', t('translate.localized_translation_language'))
93959                             .on('blur', changeLang)
93960                             .on('change', changeLang)
93961                             .call(langCombo);
93962
93963                         wrap
93964                             .append('input')
93965                             .attr('type', 'text')
93966                             .attr('placeholder', t('translate.localized_translation_name'))
93967                             .attr('class', 'localized-value')
93968                             .on('blur', changeValue)
93969                             .on('change', changeValue);
93970                     });
93971
93972                 innerWrap
93973                     .style('margin-top', '0px')
93974                     .style('max-height', '0px')
93975                     .style('opacity', '0')
93976                     .transition()
93977                     .duration(200)
93978                     .style('margin-top', '10px')
93979                     .style('max-height', '240px')
93980                     .style('opacity', '1')
93981                     .on('end', function() {
93982                         d3_select(this)
93983                             .style('max-height', '')
93984                             .style('overflow', 'visible');
93985                     });
93986
93987
93988                 var entry = selection.selectAll('.entry');
93989
93990                 utilGetSetValue(entry.select('.localized-lang'), function(d) {
93991                     var lang = wikipedia$2.find(function(lang) { return lang[2] === d.lang; });
93992                     return lang ? lang[1] : d.lang;
93993                 });
93994
93995                 utilGetSetValue(entry.select('.localized-value'),
93996                     function(d) { return d.value; });
93997             }
93998
93999
94000             localized.tags = function(tags) {
94001                 // Fetch translations from wikipedia
94002                 if (tags.wikipedia && !_wikiTitles) {
94003                     _wikiTitles = {};
94004                     var wm = tags.wikipedia.match(/([^:]+):(.+)/);
94005                     if (wm && wm[0] && wm[1]) {
94006                         wikipedia.translations(wm[1], wm[2], function(err, d) {
94007                             if (err || !d) return;
94008                             _wikiTitles = d;
94009                         });
94010                     }
94011                 }
94012
94013                 utilGetSetValue(input, tags[field.key] || '');
94014
94015                 calcMultilingual(tags);
94016
94017                 _selection
94018                     .call(localized);
94019             };
94020
94021
94022             localized.focus = function() {
94023                 input.node().focus();
94024             };
94025
94026
94027             localized.entity = function(val) {
94028                 if (!arguments.length) return _entity;
94029                 _entity = val;
94030                 _multilingual = [];
94031                 return localized;
94032             };
94033
94034             return utilRebind(localized, dispatch$1, 'on');
94035         }
94036
94037         function uiFieldMaxspeed(field, context) {
94038             var dispatch$1 = dispatch('change');
94039             var unitInput = d3_select(null);
94040             var input = d3_select(null);
94041             var _entity;
94042             var _isImperial;
94043
94044             var speedCombo = uiCombobox(context, 'maxspeed');
94045             var unitCombo = uiCombobox(context, 'maxspeed-unit')
94046                     .data(['km/h', 'mph'].map(comboValues));
94047
94048             var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
94049             var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
94050
94051
94052             function maxspeed(selection) {
94053
94054                 var wrap = selection.selectAll('.form-field-input-wrap')
94055                     .data([0]);
94056
94057                 wrap = wrap.enter()
94058                     .append('div')
94059                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94060                     .merge(wrap);
94061
94062
94063                 input = wrap.selectAll('#preset-input-' + field.safeid)
94064                     .data([0]);
94065
94066                 input = input.enter()
94067                     .append('input')
94068                     .attr('type', 'text')
94069                     .attr('id', 'preset-input-' + field.safeid)
94070                     .attr('placeholder', field.placeholder())
94071                     .call(utilNoAuto)
94072                     .call(speedCombo)
94073                     .merge(input);
94074
94075                 input
94076                     .on('change', change)
94077                     .on('blur', change);
94078
94079                 var loc;
94080                 if (_entity.type === 'node') {
94081                     loc = _entity.loc;
94082                 } else {
94083                     var childNodes = context.graph().childNodes(context.entity(_entity.id));
94084                     loc = childNodes[~~(childNodes.length/2)].loc;
94085                 }
94086
94087                 _isImperial = dataImperial.features.some(function(f) {
94088                     return f.geometry.coordinates.some(function(d) {
94089                         return geoPointInPolygon(loc, d);
94090                     });
94091                 });
94092
94093                 unitInput = wrap.selectAll('input.maxspeed-unit')
94094                     .data([0]);
94095
94096                 unitInput = unitInput.enter()
94097                     .append('input')
94098                     .attr('type', 'text')
94099                     .attr('class', 'maxspeed-unit')
94100                     .call(unitCombo)
94101                     .merge(unitInput);
94102
94103                 unitInput
94104                     .on('blur', changeUnits)
94105                     .on('change', changeUnits);
94106
94107
94108                 function changeUnits() {
94109                     _isImperial = utilGetSetValue(unitInput) === 'mph';
94110                     utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94111                     setSuggestions();
94112                     change();
94113                 }
94114             }
94115
94116
94117             function setSuggestions() {
94118                 speedCombo.data((_isImperial ? imperialValues : metricValues).map(comboValues));
94119                 utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
94120             }
94121
94122
94123             function comboValues(d) {
94124                 return {
94125                     value: d.toString(),
94126                     title: d.toString()
94127                 };
94128             }
94129
94130
94131             function change() {
94132                 var tag = {};
94133                 var value = utilGetSetValue(input);
94134
94135                 if (!value) {
94136                     tag[field.key] = undefined;
94137                 } else if (isNaN(value) || !_isImperial) {
94138                     tag[field.key] = value;
94139                 } else {
94140                     tag[field.key] = value + ' mph';
94141                 }
94142
94143                 dispatch$1.call('change', this, tag);
94144             }
94145
94146
94147             maxspeed.tags = function(tags) {
94148                 var value = tags[field.key];
94149
94150                 if (value && value.indexOf('mph') >= 0) {
94151                     value = parseInt(value, 10);
94152                     _isImperial = true;
94153                 } else if (value) {
94154                     _isImperial = false;
94155                 }
94156
94157                 setSuggestions();
94158                 utilGetSetValue(input, value || '');
94159             };
94160
94161
94162             maxspeed.focus = function() {
94163                 input.node().focus();
94164             };
94165
94166
94167             maxspeed.entity = function(val) {
94168                 _entity = val;
94169             };
94170
94171
94172             return utilRebind(maxspeed, dispatch$1, 'on');
94173         }
94174
94175         function uiFieldRadio(field, context) {
94176             var dispatch$1 = dispatch('change');
94177             var placeholder = d3_select(null);
94178             var wrap = d3_select(null);
94179             var labels = d3_select(null);
94180             var radios = d3_select(null);
94181             var radioData = (field.options || field.keys).slice();  // shallow copy
94182             var typeField;
94183             var layerField;
94184             var _oldType = {};
94185             var _entity;
94186
94187
94188             function selectedKey() {
94189                 var node = wrap.selectAll('.form-field-input-radio label.active input');
94190                 return !node.empty() && node.datum();
94191             }
94192
94193
94194             function radio(selection) {
94195                 selection.classed('preset-radio', true);
94196
94197                 wrap = selection.selectAll('.form-field-input-wrap')
94198                     .data([0]);
94199
94200                 var enter = wrap.enter()
94201                     .append('div')
94202                     .attr('class', 'form-field-input-wrap form-field-input-radio');
94203
94204                 enter
94205                     .append('span')
94206                     .attr('class', 'placeholder');
94207
94208                 wrap = wrap
94209                     .merge(enter);
94210
94211
94212                 placeholder = wrap.selectAll('.placeholder');
94213
94214                 labels = wrap.selectAll('label')
94215                     .data(radioData);
94216
94217                 enter = labels.enter()
94218                     .append('label');
94219
94220                 enter
94221                     .append('input')
94222                     .attr('type', 'radio')
94223                     .attr('name', field.id)
94224                     .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
94225                     .attr('checked', false);
94226
94227                 enter
94228                     .append('span')
94229                     .text(function(d) { return field.t('options.' + d, { 'default': d }); });
94230
94231                 labels = labels
94232                     .merge(enter);
94233
94234                 radios = labels.selectAll('input')
94235                     .on('change', changeRadio);
94236
94237             }
94238
94239
94240             function structureExtras(selection, tags) {
94241                 var selected = selectedKey();
94242                 var type = context.presets().field(selected);
94243                 var layer = context.presets().field('layer');
94244                 var showLayer = (selected === 'bridge' || selected === 'tunnel');
94245
94246
94247                 var extrasWrap = selection.selectAll('.structure-extras-wrap')
94248                     .data(selected ? [0] : []);
94249
94250                 extrasWrap.exit()
94251                     .remove();
94252
94253                 extrasWrap = extrasWrap.enter()
94254                     .append('div')
94255                     .attr('class', 'structure-extras-wrap')
94256                     .merge(extrasWrap);
94257
94258                 var list = extrasWrap.selectAll('ul')
94259                     .data([0]);
94260
94261                 list = list.enter()
94262                     .append('ul')
94263                     .attr('class', 'rows')
94264                     .merge(list);
94265
94266
94267                 // Type
94268                 if (type) {
94269                     if (!typeField || typeField.id !== selected) {
94270                         typeField = uiField(context, type, _entity, { wrap: false })
94271                             .on('change', changeType);
94272                     }
94273                     typeField.tags(tags);
94274                 } else {
94275                     typeField = null;
94276                 }
94277
94278                 var typeItem = list.selectAll('.structure-type-item')
94279                     .data(typeField ? [typeField] : [], function(d) { return d.id; });
94280
94281                 // Exit
94282                 typeItem.exit()
94283                     .remove();
94284
94285                 // Enter
94286                 var typeEnter = typeItem.enter()
94287                     .insert('li', ':first-child')
94288                     .attr('class', 'labeled-input structure-type-item');
94289
94290                 typeEnter
94291                     .append('span')
94292                     .attr('class', 'label structure-label-type')
94293                     .attr('for', 'preset-input-' + selected)
94294                     .text(t('inspector.radio.structure.type'));
94295
94296                 typeEnter
94297                     .append('div')
94298                     .attr('class', 'structure-input-type-wrap');
94299
94300                 // Update
94301                 typeItem = typeItem
94302                     .merge(typeEnter);
94303
94304                 if (typeField) {
94305                     typeItem.selectAll('.structure-input-type-wrap')
94306                         .call(typeField.render);
94307                 }
94308
94309
94310                 // Layer
94311                 if (layer && showLayer) {
94312                     if (!layerField) {
94313                         layerField = uiField(context, layer, _entity, { wrap: false })
94314                             .on('change', changeLayer);
94315                     }
94316                     layerField.tags(tags);
94317                     field.keys = utilArrayUnion(field.keys, ['layer']);
94318                 } else {
94319                     layerField = null;
94320                     field.keys = field.keys.filter(function(k) { return k !== 'layer'; });
94321                 }
94322
94323                 var layerItem = list.selectAll('.structure-layer-item')
94324                     .data(layerField ? [layerField] : []);
94325
94326                 // Exit
94327                 layerItem.exit()
94328                     .remove();
94329
94330                 // Enter
94331                 var layerEnter = layerItem.enter()
94332                     .append('li')
94333                     .attr('class', 'labeled-input structure-layer-item');
94334
94335                 layerEnter
94336                     .append('span')
94337                     .attr('class', 'label structure-label-layer')
94338                     .attr('for', 'preset-input-layer')
94339                     .text(t('inspector.radio.structure.layer'));
94340
94341                 layerEnter
94342                     .append('div')
94343                     .attr('class', 'structure-input-layer-wrap');
94344
94345                 // Update
94346                 layerItem = layerItem
94347                     .merge(layerEnter);
94348
94349                 if (layerField) {
94350                     layerItem.selectAll('.structure-input-layer-wrap')
94351                         .call(layerField.render);
94352                 }
94353             }
94354
94355
94356             function changeType(t, onInput) {
94357                 var key = selectedKey();
94358                 if (!key) return;
94359
94360                 var val = t[key];
94361                 if (val !== 'no') {
94362                     _oldType[key] = val;
94363                 }
94364
94365                 if (field.type === 'structureRadio') {
94366                     // remove layer if it should not be set
94367                     if (val === 'no' ||
94368                         (key !== 'bridge' && key !== 'tunnel') ||
94369                         (key === 'tunnel' && val === 'building_passage')) {
94370                         t.layer = undefined;
94371                     }
94372                     // add layer if it should be set
94373                     if (t.layer === undefined) {
94374                         if (key === 'bridge' && val !== 'no') {
94375                             t.layer = '1';
94376                         }
94377                         if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
94378                             t.layer = '-1';
94379                         }
94380                     }
94381                  }
94382
94383                 dispatch$1.call('change', this, t, onInput);
94384             }
94385
94386
94387             function changeLayer(t, onInput) {
94388                 if (t.layer === '0') {
94389                     t.layer = undefined;
94390                 }
94391                 dispatch$1.call('change', this, t, onInput);
94392             }
94393
94394
94395             function changeRadio() {
94396                 var t = {};
94397                 var activeKey;
94398
94399                 if (field.key) {
94400                     t[field.key] = undefined;
94401                 }
94402
94403                 radios.each(function(d) {
94404                     var active = d3_select(this).property('checked');
94405                     if (active) activeKey = d;
94406
94407                     if (field.key) {
94408                         if (active) t[field.key] = d;
94409                     } else {
94410                         var val = _oldType[activeKey] || 'yes';
94411                         t[d] = active ? val : undefined;
94412                     }
94413                 });
94414
94415                 if (field.type === 'structureRadio') {
94416                     if (activeKey === 'bridge') {
94417                         t.layer = '1';
94418                     } else if (activeKey === 'tunnel' && t.tunnel !== 'building_passage') {
94419                         t.layer = '-1';
94420                     } else {
94421                         t.layer = undefined;
94422                     }
94423                 }
94424
94425                 dispatch$1.call('change', this, t);
94426             }
94427
94428
94429             radio.tags = function(tags) {
94430                 function checked(d) {
94431                     if (field.key) {
94432                         return tags[field.key] === d;
94433                     } else {
94434                         return !!(tags[d] && tags[d].toLowerCase() !== 'no');
94435                     }
94436                 }
94437
94438                 labels.classed('active', checked);
94439                 radios.property('checked', checked);
94440
94441                 var selection = radios.filter(function() { return this.checked; });
94442
94443                 if (selection.empty()) {
94444                     placeholder.text(t('inspector.none'));
94445                 } else {
94446                     placeholder.text(selection.attr('value'));
94447                     _oldType[selection.datum()] = tags[selection.datum()];
94448                 }
94449
94450                 if (field.type === 'structureRadio') {
94451                     // For waterways without a tunnel tag, set 'culvert' as
94452                     // the _oldType to default to if the user picks 'tunnel'
94453                     if (!!tags.waterway && !_oldType.tunnel) {
94454                         _oldType.tunnel = 'culvert';
94455                     }
94456
94457                     wrap.call(structureExtras, tags);
94458                 }
94459             };
94460
94461
94462             radio.focus = function() {
94463                 radios.node().focus();
94464             };
94465
94466
94467             radio.entity = function(val) {
94468                 if (!arguments.length) return _entity;
94469                 _entity = val;
94470                 _oldType = {};
94471                 return radio;
94472             };
94473
94474
94475             return utilRebind(radio, dispatch$1, 'on');
94476         }
94477
94478         function uiFieldRestrictions(field, context) {
94479             var dispatch$1 = dispatch('change');
94480             var breathe = behaviorBreathe(context);
94481             var storedViaWay = context.storage('turn-restriction-via-way');
94482             var storedDistance = context.storage('turn-restriction-distance');
94483
94484             var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
94485             var _maxDistance = storedDistance ? (+storedDistance) : 30;
94486             var _initialized = false;
94487             var _parent = d3_select(null);       // the entire field
94488             var _container = d3_select(null);    // just the map
94489             var _oldTurns;
94490             var _graph;
94491             var _vertexID;
94492             var _intersection;
94493             var _fromWayID;
94494
94495             var _lastXPos;
94496
94497
94498             function restrictions(selection) {
94499                 _parent = selection;
94500
94501                 // try to reuse the intersection, but always rebuild it if the graph has changed
94502                 if (_vertexID && (context.graph() !== _graph || !_intersection)) {
94503                     _graph = context.graph();
94504                     _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
94505                 }
94506
94507                 // It's possible for there to be no actual intersection here.
94508                 // for example, a vertex of two `highway=path`
94509                 // In this case, hide the field.
94510                 var isOK = (
94511                     _intersection &&
94512                     _intersection.vertices.length &&           // has vertices
94513                     _intersection.vertices                     // has the vertex that the user selected
94514                         .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
94515                     _intersection.ways.length > 2 &&           // has more than 2 ways
94516                     _intersection.ways                         // has more than 1 TO way
94517                         .filter(function(way) { return way.__to; }).length > 1
94518                 );
94519
94520                 // Also hide in the case where
94521                 d3_select(selection.node().parentNode).classed('hide', !isOK);
94522
94523                 // if form field is hidden or has detached from dom, clean up.
94524                 if (!isOK ||
94525                     !d3_select('.inspector-wrap.inspector-hidden').empty() ||
94526                     !selection.node().parentNode ||
94527                     !selection.node().parentNode.parentNode) {
94528                     selection.call(restrictions.off);
94529                     return;
94530                 }
94531
94532
94533                 var wrap = selection.selectAll('.form-field-input-wrap')
94534                     .data([0]);
94535
94536                 wrap = wrap.enter()
94537                     .append('div')
94538                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
94539                     .merge(wrap);
94540
94541                 var container = wrap.selectAll('.restriction-container')
94542                     .data([0]);
94543
94544                 // enter
94545                 var containerEnter = container.enter()
94546                     .append('div')
94547                     .attr('class', 'restriction-container');
94548
94549                 containerEnter
94550                     .append('div')
94551                     .attr('class', 'restriction-help');
94552
94553                 // update
94554                 _container = containerEnter
94555                     .merge(container)
94556                     .call(renderViewer);
94557
94558                 var controls = wrap.selectAll('.restriction-controls')
94559                     .data([0]);
94560
94561                 // enter/update
94562                 controls.enter()
94563                     .append('div')
94564                     .attr('class', 'restriction-controls-container')
94565                     .append('div')
94566                     .attr('class', 'restriction-controls')
94567                     .merge(controls)
94568                     .call(renderControls);
94569             }
94570
94571
94572             function renderControls(selection) {
94573                 var distControl = selection.selectAll('.restriction-distance')
94574                     .data([0]);
94575
94576                 distControl.exit()
94577                     .remove();
94578
94579                 var distControlEnter = distControl.enter()
94580                     .append('div')
94581                     .attr('class', 'restriction-control restriction-distance');
94582
94583                 distControlEnter
94584                     .append('span')
94585                     .attr('class', 'restriction-control-label restriction-distance-label')
94586                     .text(t('restriction.controls.distance') + ':');
94587
94588                 distControlEnter
94589                     .append('input')
94590                     .attr('class', 'restriction-distance-input')
94591                     .attr('type', 'range')
94592                     .attr('min', '20')
94593                     .attr('max', '50')
94594                     .attr('step', '5');
94595
94596                 distControlEnter
94597                     .append('span')
94598                     .attr('class', 'restriction-distance-text');
94599
94600                 // update
94601                 selection.selectAll('.restriction-distance-input')
94602                     .property('value', _maxDistance)
94603                     .on('input', function() {
94604                         var val = d3_select(this).property('value');
94605                         _maxDistance = +val;
94606                         _intersection = null;
94607                         _container.selectAll('.layer-osm .layer-turns *').remove();
94608                         context.storage('turn-restriction-distance', _maxDistance);
94609                         _parent.call(restrictions);
94610                     });
94611
94612                 selection.selectAll('.restriction-distance-text')
94613                     .text(displayMaxDistance(_maxDistance));
94614
94615
94616                 var viaControl = selection.selectAll('.restriction-via-way')
94617                     .data([0]);
94618
94619                 viaControl.exit()
94620                     .remove();
94621
94622                 var viaControlEnter = viaControl.enter()
94623                     .append('div')
94624                     .attr('class', 'restriction-control restriction-via-way');
94625
94626                 viaControlEnter
94627                     .append('span')
94628                     .attr('class', 'restriction-control-label restriction-via-way-label')
94629                     .text(t('restriction.controls.via') + ':');
94630
94631                 viaControlEnter
94632                     .append('input')
94633                     .attr('class', 'restriction-via-way-input')
94634                     .attr('type', 'range')
94635                     .attr('min', '0')
94636                     .attr('max', '2')
94637                     .attr('step', '1');
94638
94639                 viaControlEnter
94640                     .append('span')
94641                     .attr('class', 'restriction-via-way-text');
94642
94643                 // update
94644                 selection.selectAll('.restriction-via-way-input')
94645                     .property('value', _maxViaWay)
94646                     .on('input', function() {
94647                         var val = d3_select(this).property('value');
94648                         _maxViaWay = +val;
94649                         _container.selectAll('.layer-osm .layer-turns *').remove();
94650                         context.storage('turn-restriction-via-way', _maxViaWay);
94651                         _parent.call(restrictions);
94652                     });
94653
94654                 selection.selectAll('.restriction-via-way-text')
94655                     .text(displayMaxVia(_maxViaWay));
94656             }
94657
94658
94659             function renderViewer(selection) {
94660                 if (!_intersection) return;
94661
94662                 var vgraph = _intersection.graph;
94663                 var filter = utilFunctor(true);
94664                 var projection = geoRawMercator();
94665
94666                 // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
94667                 // Instead of asking the restriction-container for its dimensions,
94668                 //  we can ask the #sidebar, which can have its dimensions cached.
94669                 // width: calc as sidebar - padding
94670                 // height: hardcoded (from `80_app.css`)
94671                 // var d = utilGetDimensions(selection);
94672                 var sdims = utilGetDimensions(d3_select('#sidebar'));
94673                 var d = [ sdims[0] - 50, 370 ];
94674                 var c = geoVecScale(d, 0.5);
94675                 var z = 22;
94676
94677                 projection.scale(geoZoomToScale(z));
94678
94679                 // Calculate extent of all key vertices
94680                 var extent = geoExtent();
94681                 for (var i = 0; i < _intersection.vertices.length; i++) {
94682                     extent._extend(_intersection.vertices[i].extent());
94683                 }
94684
94685                 // If this is a large intersection, adjust zoom to fit extent
94686                 if (_intersection.vertices.length > 1) {
94687                     var padding = 180;   // in z22 pixels
94688                     var tl = projection([extent[0][0], extent[1][1]]);
94689                     var br = projection([extent[1][0], extent[0][1]]);
94690                     var hFactor = (br[0] - tl[0]) / (d[0] - padding);
94691                     var vFactor = (br[1] - tl[1]) / (d[1] - padding);
94692                     var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
94693                     var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
94694                     z = z - Math.max(hZoomDiff, vZoomDiff);
94695                     projection.scale(geoZoomToScale(z));
94696                 }
94697
94698                 var padTop = 35;   // reserve top space for hint text
94699                 var extentCenter = projection(extent.center());
94700                 extentCenter[1] = extentCenter[1] - padTop;
94701
94702                 projection
94703                     .translate(geoVecSubtract(c, extentCenter))
94704                     .clipExtent([[0, 0], d]);
94705
94706                 var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
94707                 var drawVertices = svgVertices(projection, context);
94708                 var drawLines = svgLines(projection, context);
94709                 var drawTurns = svgTurns(projection, context);
94710
94711                 var firstTime = selection.selectAll('.surface').empty();
94712
94713                 selection
94714                     .call(drawLayers);
94715
94716                 var surface = selection.selectAll('.surface')
94717                     .classed('tr', true);
94718
94719                 if (firstTime) {
94720                     _initialized = true;
94721
94722                     surface
94723                         .call(breathe);
94724                 }
94725
94726                 // This can happen if we've lowered the detail while a FROM way
94727                 // is selected, and that way is no longer part of the intersection.
94728                 if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
94729                     _fromWayID = null;
94730                     _oldTurns = null;
94731                 }
94732
94733                 surface
94734                     .call(utilSetDimensions, d)
94735                     .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
94736                     .call(drawLines, vgraph, _intersection.ways, filter)
94737                     .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
94738
94739                 surface
94740                     .on('click.restrictions', click)
94741                     .on('mouseover.restrictions', mouseover);
94742
94743                 surface
94744                     .selectAll('.selected')
94745                     .classed('selected', false);
94746
94747                 surface
94748                     .selectAll('.related')
94749                     .classed('related', false);
94750
94751                 if (_fromWayID) {
94752                     var way = vgraph.entity(_fromWayID);
94753                     surface
94754                         .selectAll('.' + _fromWayID)
94755                         .classed('selected', true)
94756                         .classed('related', true);
94757                 }
94758
94759                 document.addEventListener('resizeWindow', function () {
94760                     utilSetDimensions(_container, null);
94761                     redraw(1);
94762                 }, false);
94763
94764                 updateHints(null);
94765
94766
94767                 function click() {
94768                     surface
94769                         .call(breathe.off)
94770                         .call(breathe);
94771
94772                     var datum = event.target.__data__;
94773                     var entity = datum && datum.properties && datum.properties.entity;
94774                     if (entity) {
94775                         datum = entity;
94776                     }
94777
94778                     if (datum instanceof osmWay && (datum.__from || datum.__via)) {
94779                         _fromWayID = datum.id;
94780                         _oldTurns = null;
94781                         redraw();
94782
94783                     } else if (datum instanceof osmTurn) {
94784                         var actions, extraActions, turns, i;
94785                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94786
94787                         if (datum.restrictionID && !datum.direct) {
94788                             return;
94789
94790                         } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
94791                             var seen = {};
94792                             var datumOnly = JSON.parse(JSON.stringify(datum));   // deep clone the datum
94793                             datumOnly.only = true;                               // but change this property
94794                             restrictionType = restrictionType.replace(/^no/, 'only');
94795
94796                             // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
94797                             // We will remember them in _oldTurns, and restore them if the user clicks again.
94798                             turns = _intersection.turns(_fromWayID, 2);
94799                             extraActions = [];
94800                             _oldTurns = [];
94801                             for (i = 0; i < turns.length; i++) {
94802                                 var turn = turns[i];
94803                                 if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
94804
94805                                 if (turn.direct && turn.path[1] === datum.path[1]) {
94806                                     seen[turns[i].restrictionID] = true;
94807                                     turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
94808                                     _oldTurns.push(turn);
94809                                     extraActions.push(actionUnrestrictTurn(turn));
94810                                 }
94811                             }
94812
94813                             actions = _intersection.actions.concat(extraActions, [
94814                                 actionRestrictTurn(datumOnly, restrictionType),
94815                                 t('operations.restriction.annotation.create')
94816                             ]);
94817
94818                         } else if (datum.restrictionID) {   // ONLY -> Allowed
94819                             // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
94820                             // This relies on the assumption that the intersection was already split up when we
94821                             // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
94822                             turns = _oldTurns || [];
94823                             extraActions = [];
94824                             for (i = 0; i < turns.length; i++) {
94825                                 if (turns[i].key !== datum.key) {
94826                                     extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
94827                                 }
94828                             }
94829                             _oldTurns = null;
94830
94831                             actions = _intersection.actions.concat(extraActions, [
94832                                 actionUnrestrictTurn(datum),
94833                                 t('operations.restriction.annotation.delete')
94834                             ]);
94835
94836                         } else {    // Allowed -> NO
94837                             actions = _intersection.actions.concat([
94838                                 actionRestrictTurn(datum, restrictionType),
94839                                 t('operations.restriction.annotation.create')
94840                             ]);
94841                         }
94842
94843                         context.perform.apply(context, actions);
94844
94845                         // At this point the datum will be changed, but will have same key..
94846                         // Refresh it and update the help..
94847                         var s = surface.selectAll('.' + datum.key);
94848                         datum = s.empty() ? null : s.datum();
94849                         updateHints(datum);
94850
94851                     } else {
94852                         _fromWayID = null;
94853                         _oldTurns = null;
94854                         redraw();
94855                     }
94856                 }
94857
94858
94859                 function mouseover() {
94860                     var datum = event.target.__data__;
94861                     updateHints(datum);
94862                 }
94863
94864                 _lastXPos = _lastXPos || sdims[0];
94865
94866                 function redraw(minChange) {
94867                     var xPos = -1;
94868
94869                     if (minChange) {
94870                         xPos = utilGetDimensions(d3_select('#sidebar'))[0];
94871                     }
94872
94873                     if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
94874                         if (context.hasEntity(_vertexID)) {
94875                             _lastXPos = xPos;
94876                             _container.call(renderViewer);
94877                         }
94878                     }
94879                 }
94880
94881
94882                 function highlightPathsFrom(wayID) {
94883                     surface.selectAll('.related')
94884                         .classed('related', false)
94885                         .classed('allow', false)
94886                         .classed('restrict', false)
94887                         .classed('only', false);
94888
94889                     surface.selectAll('.' + wayID)
94890                         .classed('related', true);
94891
94892                     if (wayID) {
94893                         var turns = _intersection.turns(wayID, _maxViaWay);
94894                         for (var i = 0; i < turns.length; i++) {
94895                             var turn = turns[i];
94896                             var ids = [turn.to.way];
94897                             var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
94898
94899                             if (turn.only || turns.length === 1) {
94900                                 if (turn.via.ways) {
94901                                     ids = ids.concat(turn.via.ways);
94902                                 }
94903                             } else if (turn.to.way === wayID) {
94904                                 continue;
94905                             }
94906
94907                             surface.selectAll(utilEntitySelector(ids))
94908                                 .classed('related', true)
94909                                 .classed('allow', (klass === 'allow'))
94910                                 .classed('restrict', (klass === 'restrict'))
94911                                 .classed('only', (klass === 'only'));
94912                         }
94913                     }
94914                 }
94915
94916
94917                 function updateHints(datum) {
94918                     var help = _container.selectAll('.restriction-help').html('');
94919
94920                     var placeholders = {};
94921                     ['from', 'via', 'to'].forEach(function(k) {
94922                         placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
94923                     });
94924
94925                     var entity = datum && datum.properties && datum.properties.entity;
94926                     if (entity) {
94927                         datum = entity;
94928                     }
94929
94930                     if (_fromWayID) {
94931                         way = vgraph.entity(_fromWayID);
94932                         surface
94933                             .selectAll('.' + _fromWayID)
94934                             .classed('selected', true)
94935                             .classed('related', true);
94936                     }
94937
94938                     // Hovering a way
94939                     if (datum instanceof osmWay && datum.__from) {
94940                         way = datum;
94941
94942                         highlightPathsFrom(_fromWayID ? null : way.id);
94943                         surface.selectAll('.' + way.id)
94944                             .classed('related', true);
94945
94946                         var clickSelect = (!_fromWayID || _fromWayID !== way.id);
94947                         help
94948                             .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
94949                             .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
94950                                 from: placeholders.from,
94951                                 fromName: displayName(way.id, vgraph)
94952                             }));
94953
94954
94955                     // Hovering a turn arrow
94956                     } else if (datum instanceof osmTurn) {
94957                         var restrictionType = osmInferRestriction(vgraph, datum, projection);
94958                         var turnType = restrictionType.replace(/^(only|no)\_/, '');
94959                         var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
94960                         var klass, turnText, nextText;
94961
94962                         if (datum.no) {
94963                             klass = 'restrict';
94964                             turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
94965                             nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
94966                         } else if (datum.only) {
94967                             klass = 'only';
94968                             turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
94969                             nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
94970                         } else {
94971                             klass = 'allow';
94972                             turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
94973                             nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
94974                         }
94975
94976                         help
94977                             .append('div')      // "NO Right Turn (indirect)"
94978                             .attr('class', 'qualifier ' + klass)
94979                             .text(turnText);
94980
94981                         help
94982                             .append('div')      // "FROM {fromName} TO {toName}"
94983                             .html(t('restriction.help.from_name_to_name', {
94984                                 from: placeholders.from,
94985                                 fromName: displayName(datum.from.way, vgraph),
94986                                 to: placeholders.to,
94987                                 toName: displayName(datum.to.way, vgraph)
94988                             }));
94989
94990                         if (datum.via.ways && datum.via.ways.length) {
94991                             var names = [];
94992                             for (var i = 0; i < datum.via.ways.length; i++) {
94993                                 var prev = names[names.length - 1];
94994                                 var curr = displayName(datum.via.ways[i], vgraph);
94995                                 if (!prev || curr !== prev)   // collapse identical names
94996                                     names.push(curr);
94997                             }
94998
94999                             help
95000                                 .append('div')      // "VIA {viaNames}"
95001                                 .html(t('restriction.help.via_names', {
95002                                     via: placeholders.via,
95003                                     viaNames: names.join(', ')
95004                                 }));
95005                         }
95006
95007                         if (!indirect) {
95008                             help
95009                                 .append('div')      // Click for "No Right Turn"
95010                                 .text(t('restriction.help.toggle', { turn: nextText.trim() }));
95011                         }
95012
95013                         highlightPathsFrom(null);
95014                         var alongIDs = datum.path.slice();
95015                         surface.selectAll(utilEntitySelector(alongIDs))
95016                             .classed('related', true)
95017                             .classed('allow', (klass === 'allow'))
95018                             .classed('restrict', (klass === 'restrict'))
95019                             .classed('only', (klass === 'only'));
95020
95021
95022                     // Hovering empty surface
95023                     } else {
95024                         highlightPathsFrom(null);
95025                         if (_fromWayID) {
95026                             help
95027                                 .append('div')      // "FROM {fromName}"
95028                                 .html(t('restriction.help.from_name', {
95029                                     from: placeholders.from,
95030                                     fromName: displayName(_fromWayID, vgraph)
95031                                 }));
95032
95033                         } else {
95034                             help
95035                                 .append('div')      // "Click to select a FROM segment."
95036                                 .html(t('restriction.help.select_from', {
95037                                     from: placeholders.from
95038                                 }));
95039                         }
95040                     }
95041                 }
95042             }
95043
95044
95045             function displayMaxDistance(maxDist) {
95046                 var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
95047                 var opts;
95048
95049                 if (isImperial) {
95050                     var distToFeet = {   // imprecise conversion for prettier display
95051                         20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
95052                     }[maxDist];
95053                     opts = { distance: t('units.feet', { quantity: distToFeet }) };
95054                 } else {
95055                     opts = { distance: t('units.meters', { quantity: maxDist }) };
95056                 }
95057
95058                 return t('restriction.controls.distance_up_to', opts);
95059             }
95060
95061
95062             function displayMaxVia(maxVia) {
95063                 return maxVia === 0 ? t('restriction.controls.via_node_only')
95064                     : maxVia === 1 ? t('restriction.controls.via_up_to_one')
95065                     : t('restriction.controls.via_up_to_two');
95066             }
95067
95068
95069             function displayName(entityID, graph) {
95070                 var entity = graph.entity(entityID);
95071                 var name = utilDisplayName(entity) || '';
95072                 var matched = context.presets().match(entity, graph);
95073                 var type = (matched && matched.name()) || utilDisplayType(entity.id);
95074                 return name || type;
95075             }
95076
95077
95078             restrictions.entity = function(val) {
95079                 _intersection = null;
95080                 _fromWayID = null;
95081                 _oldTurns = null;
95082                 _vertexID = val.id;
95083             };
95084
95085
95086             restrictions.tags = function() {};
95087             restrictions.focus = function() {};
95088
95089
95090             restrictions.off = function(selection) {
95091                 if (!_initialized) return;
95092
95093                 selection.selectAll('.surface')
95094                     .call(breathe.off)
95095                     .on('click.restrictions', null)
95096                     .on('mouseover.restrictions', null);
95097
95098                 d3_select(window)
95099                     .on('resize.restrictions', null);
95100             };
95101
95102
95103             return utilRebind(restrictions, dispatch$1, 'on');
95104         }
95105
95106         function uiFieldTextarea(field) {
95107             var dispatch$1 = dispatch('change');
95108             var input = d3_select(null);
95109
95110
95111             function textarea(selection) {
95112                 var wrap = selection.selectAll('.form-field-input-wrap')
95113                     .data([0]);
95114
95115                 wrap = wrap.enter()
95116                     .append('div')
95117                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95118                     .merge(wrap);
95119
95120                 input = wrap.selectAll('textarea')
95121                     .data([0]);
95122
95123                 input = input.enter()
95124                     .append('textarea')
95125                     .attr('id', 'preset-input-' + field.safeid)
95126                     .attr('placeholder', field.placeholder() || t('inspector.unknown'))
95127                     .attr('maxlength', 255)
95128                     .call(utilNoAuto)
95129                     .on('input', change(true))
95130                     .on('blur', change())
95131                     .on('change', change())
95132                     .merge(input);
95133             }
95134
95135
95136             function change(onInput) {
95137                 return function() {
95138                     var t = {};
95139                     t[field.key] = utilGetSetValue(input) || undefined;
95140                     dispatch$1.call('change', this, t, onInput);
95141                 };
95142             }
95143
95144
95145             textarea.tags = function(tags) {
95146                 utilGetSetValue(input, tags[field.key] || '');
95147             };
95148
95149
95150             textarea.focus = function() {
95151                 input.node().focus();
95152             };
95153
95154
95155             return utilRebind(textarea, dispatch$1, 'on');
95156         }
95157
95158         function uiFieldWikidata(field, context) {
95159             var wikidata = services$1.wikidata;
95160             var dispatch$1 = dispatch('change');
95161             var searchInput = d3_select(null);
95162             var _qid = null;
95163             var _wikidataEntity = null;
95164             var _wikiURL = '';
95165             var _entity;
95166
95167             var combobox = uiCombobox(context, 'combo-' + field.safeid)
95168                 .caseSensitive(true)
95169                 .minItems(1);
95170
95171             function wiki(selection) {
95172
95173                 var wrap = selection.selectAll('.form-field-input-wrap')
95174                     .data([0]);
95175
95176                 wrap = wrap.enter()
95177                     .append('div')
95178                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95179                     .merge(wrap);
95180
95181
95182                 var list = wrap.selectAll('ul')
95183                     .data([0]);
95184
95185                 list = list.enter()
95186                     .append('ul')
95187                     .attr('class', 'rows')
95188                     .merge(list);
95189
95190                 var searchRow = list.selectAll('li.wikidata-search')
95191                     .data([0]);
95192
95193                 var searchRowEnter = searchRow.enter()
95194                     .append('li')
95195                     .attr('class', 'wikidata-search');
95196
95197                 searchInput = searchRowEnter
95198                     .append('input')
95199                     .attr('type', 'text')
95200                     .style('flex', '1')
95201                     .call(utilNoAuto);
95202
95203                 searchInput
95204                     .on('focus', function() {
95205                         var node = d3_select(this).node();
95206                         node.setSelectionRange(0, node.value.length);
95207                     })
95208                     .on('blur', function() {
95209                         setLabelForEntity();
95210                     })
95211                     .call(combobox.fetcher(fetchWikidataItems));
95212
95213                 combobox.on('accept', function(d) {
95214                     _qid = d.id;
95215                     change();
95216                 }).on('cancel', function() {
95217                     setLabelForEntity();
95218                 });
95219
95220                 searchRowEnter
95221                     .append('button')
95222                     .attr('class', 'form-field-button wiki-link')
95223                     .attr('title', t('icons.open_wikidata'))
95224                     .attr('tabindex', -1)
95225                     .call(svgIcon('#iD-icon-out-link'))
95226                     .on('click', function() {
95227                         event.preventDefault();
95228                         if (_wikiURL) window.open(_wikiURL, '_blank');
95229                     });
95230
95231                 var wikidataProperties = ['description', 'identifier'];
95232
95233                 var items = list.selectAll('li.labeled-input')
95234                     .data(wikidataProperties);
95235
95236                 // Enter
95237                 var enter = items.enter()
95238                     .append('li')
95239                     .attr('class', function(d) { return 'labeled-input preset-wikidata-' + d; });
95240
95241                 enter
95242                     .append('span')
95243                     .attr('class', 'label')
95244                     .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
95245                     .text(function(d) { return t('wikidata.' + d); });
95246
95247                 enter
95248                     .append('input')
95249                     .attr('type', 'text')
95250                     .attr('id', function(d) { return 'preset-input-wikidata-' + d; })
95251                     .call(utilNoAuto)
95252                     .classed('disabled', 'true')
95253                     .attr('readonly', 'true');
95254
95255                 enter
95256                     .append('button')
95257                     .attr('class', 'form-field-button')
95258                     .attr('title', t('icons.copy'))
95259                     .attr('tabindex', -1)
95260                     .call(svgIcon('#iD-operation-copy'))
95261                     .on('click', function() {
95262                         event.preventDefault();
95263                         d3_select(this.parentNode)
95264                             .select('input')
95265                             .node()
95266                             .select();
95267                         document.execCommand('copy');
95268                     });
95269
95270             }
95271
95272             function fetchWikidataItems(q, callback) {
95273
95274                 if (!q && _entity) {
95275                     q = context.entity(_entity.id).tags.name || '';
95276                 }
95277
95278                 wikidata.itemsForSearchQuery(q, function(err, data) {
95279                     if (err) return;
95280
95281                     for (var i in data) {
95282                         data[i].value = data[i].label + ' (' +  data[i].id + ')';
95283                         data[i].title = data[i].description;
95284                     }
95285
95286                     if (callback) callback(data);
95287                 });
95288             }
95289
95290
95291             function change() {
95292                 var syncTags = {};
95293                 syncTags[field.key] = _qid;
95294                 dispatch$1.call('change', this, syncTags);
95295
95296                 // attempt asynchronous update of wikidata tag..
95297                 var initGraph = context.graph();
95298                 var initEntityID = _entity.id;
95299
95300                 wikidata.entityByQID(_qid, function(err, entity) {
95301                     if (err) return;
95302
95303                     // If graph has changed, we can't apply this update.
95304                     if (context.graph() !== initGraph) return;
95305
95306                     if (!entity.sitelinks) return;
95307
95308                     var langs = wikidata.languagesToQuery();
95309                     // use the label and description languages as fallbacks
95310                     ['labels', 'descriptions'].forEach(function(key) {
95311                         if (!entity[key]) return;
95312
95313                         var valueLangs = Object.keys(entity[key]);
95314                         if (valueLangs.length === 0) return;
95315                         var valueLang = valueLangs[0];
95316
95317                         if (langs.indexOf(valueLang) === -1) {
95318                             langs.push(valueLang);
95319                         }
95320                     });
95321
95322                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95323
95324                     var foundPreferred;
95325                     for (var i in langs) {
95326                         var lang = langs[i];
95327                         var siteID = lang.replace('-', '_') + 'wiki';
95328                         if (entity.sitelinks[siteID]) {
95329                             foundPreferred = true;
95330                             currTags.wikipedia = lang + ':' + entity.sitelinks[siteID].title;
95331                             // use the first match
95332                             break;
95333                         }
95334                     }
95335
95336                     if (!foundPreferred) {
95337                         // No wikipedia sites available in the user's language or the fallback languages,
95338                         // default to any wikipedia sitelink
95339
95340                         var wikiSiteKeys = Object.keys(entity.sitelinks).filter(function(site) {
95341                             return site.endsWith('wiki');
95342                         });
95343
95344                         if (wikiSiteKeys.length === 0) {
95345                             // if no wikipedia pages are linked to this wikidata entity, delete that tag
95346                             if (currTags.wikipedia) {
95347                                 delete currTags.wikipedia;
95348                             }
95349                         } else {
95350                             var wikiLang = wikiSiteKeys[0].slice(0, -4).replace('_', '-');
95351                             var wikiTitle = entity.sitelinks[wikiSiteKeys[0]].title;
95352                             currTags.wikipedia = wikiLang + ':' + wikiTitle;
95353                         }
95354                     }
95355
95356                     // Coalesce the update of wikidata tag into the previous tag change
95357                     context.overwrite(
95358                         actionChangeTags(initEntityID, currTags),
95359                         context.history().undoAnnotation()
95360                     );
95361
95362                     // do not dispatch.call('change') here, because entity_editor
95363                     // changeTags() is not intended to be called asynchronously
95364
95365                 });
95366             }
95367
95368             function setLabelForEntity() {
95369                 var label = '';
95370                 if (_wikidataEntity) {
95371                     label = entityPropertyForDisplay(_wikidataEntity, 'labels');
95372                     if (label.length === 0) {
95373                         label = _wikidataEntity.id.toString();
95374                     }
95375                 }
95376                 utilGetSetValue(d3_select('li.wikidata-search input'), label);
95377             }
95378
95379
95380             wiki.tags = function(tags) {
95381                 _qid = tags[field.key] || '';
95382
95383                 if (!/^Q[0-9]*$/.test(_qid)) {   // not a proper QID
95384                     unrecognized();
95385                     return;
95386                 }
95387
95388                 // QID value in correct format
95389                 _wikiURL = 'https://wikidata.org/wiki/' + _qid;
95390                 wikidata.entityByQID(_qid, function(err, entity) {
95391                     if (err) {
95392                         unrecognized();
95393                         return;
95394                     }
95395                     _wikidataEntity = entity;
95396
95397                     setLabelForEntity();
95398
95399                     var description = entityPropertyForDisplay(entity, 'descriptions');
95400
95401                     d3_select('.form-field-wikidata button.wiki-link')
95402                         .classed('disabled', false);
95403
95404                     d3_select('.preset-wikidata-description')
95405                         .style('display', function(){
95406                             return description.length > 0 ? 'flex' : 'none';
95407                         })
95408                         .select('input')
95409                         .attr('value', description);
95410
95411                     d3_select('.preset-wikidata-identifier')
95412                         .style('display', function(){
95413                             return entity.id ? 'flex' : 'none';
95414                         })
95415                         .select('input')
95416                         .attr('value', entity.id);
95417                 });
95418
95419
95420                 // not a proper QID
95421                 function unrecognized() {
95422                     _wikidataEntity = null;
95423                     setLabelForEntity();
95424
95425                     d3_select('.preset-wikidata-description')
95426                         .style('display', 'none');
95427                     d3_select('.preset-wikidata-identifier')
95428                         .style('display', 'none');
95429
95430                     d3_select('.form-field-wikidata button.wiki-link')
95431                         .classed('disabled', true);
95432
95433                     if (_qid && _qid !== '') {
95434                         _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + _qid;
95435                     } else {
95436                         _wikiURL = '';
95437                     }
95438                 }
95439             };
95440
95441             function entityPropertyForDisplay(wikidataEntity, propKey) {
95442                 if (!wikidataEntity[propKey]) return '';
95443                 var propObj = wikidataEntity[propKey];
95444                 var langKeys = Object.keys(propObj);
95445                 if (langKeys.length === 0) return '';
95446                 // sorted by priority, since we want to show the user's language first if possible
95447                 var langs = wikidata.languagesToQuery();
95448                 for (var i in langs) {
95449                     var lang = langs[i];
95450                     var valueObj = propObj[lang];
95451                     if (valueObj && valueObj.value && valueObj.value.length > 0) return valueObj.value;
95452                 }
95453                 // default to any available value
95454                 return propObj[langKeys[0]].value;
95455             }
95456
95457
95458             wiki.entity = function(val) {
95459                 if (!arguments.length) return _entity;
95460                 _entity = val;
95461                 return wiki;
95462             };
95463
95464
95465             wiki.focus = function() {
95466                 searchInput.node().focus();
95467             };
95468
95469
95470             return utilRebind(wiki, dispatch$1, 'on');
95471         }
95472
95473         function uiFieldWikipedia(field, context) {
95474             var dispatch$1 = dispatch('change');
95475             var wikipedia = services$1.wikipedia;
95476             var wikidata = services$1.wikidata;
95477             var lang = d3_select(null);
95478             var title = d3_select(null);
95479             var _wikiURL = '';
95480             var _entity;
95481
95482             var langCombo = uiCombobox(context, 'wikipedia-lang')
95483                 .fetcher(function(value, cb) {
95484                     var v = value.toLowerCase();
95485
95486                     cb(wikipedia$2.filter(function(d) {
95487                         return d[0].toLowerCase().indexOf(v) >= 0 ||
95488                             d[1].toLowerCase().indexOf(v) >= 0 ||
95489                             d[2].toLowerCase().indexOf(v) >= 0;
95490                     }).map(function(d) {
95491                         return { value: d[1] };
95492                     }));
95493                 });
95494
95495             var titleCombo = uiCombobox(context, 'wikipedia-title')
95496                 .fetcher(function(value, cb) {
95497                     if (!value && _entity) {
95498                         value = context.entity(_entity.id).tags.name || '';
95499                     }
95500
95501                     var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
95502                     searchfn(language()[2], value, function(query, data) {
95503                         cb(data.map(function(d) {
95504                             return { value: d };
95505                         }));
95506                     });
95507                 });
95508
95509
95510             function wiki(selection) {
95511                 var wrap = selection.selectAll('.form-field-input-wrap')
95512                     .data([0]);
95513
95514                 wrap = wrap.enter()
95515                     .append('div')
95516                     .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
95517                     .merge(wrap);
95518
95519
95520                 var langRow = wrap.selectAll('.wiki-lang-container')
95521                     .data([0]);
95522
95523                 langRow = langRow.enter()
95524                     .append('div')
95525                     .attr('class', 'wiki-lang-container')
95526                     .merge(langRow);
95527
95528
95529                 lang = langRow.selectAll('input.wiki-lang')
95530                     .data([0]);
95531
95532                 lang = lang.enter()
95533                     .append('input')
95534                     .attr('type', 'text')
95535                     .attr('class', 'wiki-lang')
95536                     .attr('placeholder', t('translate.localized_translation_language'))
95537                     .call(utilNoAuto)
95538                     .call(langCombo)
95539                     .merge(lang);
95540
95541                 utilGetSetValue(lang, language()[1]);
95542
95543                 lang
95544                     .on('blur', changeLang)
95545                     .on('change', changeLang);
95546
95547
95548                 var titleRow = wrap.selectAll('.wiki-title-container')
95549                     .data([0]);
95550
95551                 titleRow = titleRow.enter()
95552                     .append('div')
95553                     .attr('class', 'wiki-title-container')
95554                     .merge(titleRow);
95555
95556                 title = titleRow.selectAll('input.wiki-title')
95557                     .data([0]);
95558
95559                 title = title.enter()
95560                     .append('input')
95561                     .attr('type', 'text')
95562                     .attr('class', 'wiki-title')
95563                     .attr('id', 'preset-input-' + field.safeid)
95564                     .call(utilNoAuto)
95565                     .call(titleCombo)
95566                     .merge(title);
95567
95568                 title
95569                     .on('blur', blur)
95570                     .on('change', change);
95571
95572
95573                 var link = titleRow.selectAll('.wiki-link')
95574                     .data([0]);
95575
95576                 link = link.enter()
95577                     .append('button')
95578                     .attr('class', 'form-field-button wiki-link')
95579                     .attr('tabindex', -1)
95580                     .call(svgIcon('#iD-icon-out-link'))
95581                     .merge(link);
95582
95583                 link
95584                     .on('click', function() {
95585                         event.preventDefault();
95586                         if (_wikiURL) window.open(_wikiURL, '_blank');
95587                     });
95588             }
95589
95590
95591             function language() {
95592                 var value = utilGetSetValue(lang).toLowerCase();
95593                 var locale = utilDetect().locale.toLowerCase();
95594                 var localeLanguage;
95595                 return wikipedia$2.find(function(d) {
95596                     if (d[2] === locale) localeLanguage = d;
95597                     return d[0].toLowerCase() === value ||
95598                         d[1].toLowerCase() === value ||
95599                         d[2] === value;
95600                 }) || localeLanguage || ['English', 'English', 'en'];
95601             }
95602
95603
95604             function changeLang() {
95605                 utilGetSetValue(lang, language()[1]);
95606                 change(true);
95607             }
95608
95609
95610             function blur() {
95611                 change(true);
95612             }
95613
95614
95615             function change(skipWikidata) {
95616                 var value = utilGetSetValue(title);
95617                 var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
95618                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95619                 var syncTags = {};
95620
95621                 if (l) {
95622                     // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
95623                     value = decodeURIComponent(m[2]).replace(/_/g, ' ');
95624                     if (m[3]) {
95625                         var anchor;
95626                         // try {
95627                         // leave this out for now - #6232
95628                             // Best-effort `anchordecode:` implementation
95629                             // anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
95630                         // } catch (e) {
95631                             anchor = decodeURIComponent(m[3]);
95632                         // }
95633                         value += '#' + anchor.replace(/_/g, ' ');
95634                     }
95635                     value = value.slice(0, 1).toUpperCase() + value.slice(1);
95636                     utilGetSetValue(lang, l[1]);
95637                     utilGetSetValue(title, value);
95638                 }
95639
95640                 if (value) {
95641                     syncTags.wikipedia = language()[2] + ':' + value;
95642                 } else {
95643                     syncTags.wikipedia = undefined;
95644                 }
95645
95646                 dispatch$1.call('change', this, syncTags);
95647
95648
95649                 if (skipWikidata || !value || !language()[2]) return;
95650
95651                 // attempt asynchronous update of wikidata tag..
95652                 var initGraph = context.graph();
95653                 var initEntityID = _entity.id;
95654
95655                 wikidata.itemsByTitle(language()[2], value, function(err, data) {
95656                     if (err) return;
95657
95658                     // If graph has changed, we can't apply this update.
95659                     if (context.graph() !== initGraph) return;
95660
95661                     if (!data || !Object.keys(data).length) return;
95662
95663                     var qids = Object.keys(data);
95664                     var value = qids && qids.find(function(id) { return id.match(/^Q\d+$/); });
95665                     var currTags = Object.assign({}, context.entity(initEntityID).tags);  // shallow copy
95666
95667                     currTags.wikidata = value;
95668
95669                     // Coalesce the update of wikidata tag into the previous tag change
95670                     context.overwrite(
95671                         actionChangeTags(initEntityID, currTags),
95672                         context.history().undoAnnotation()
95673                     );
95674
95675                     // do not dispatch.call('change') here, because entity_editor
95676                     // changeTags() is not intended to be called asynchronously
95677                 });
95678             }
95679
95680
95681             wiki.tags = function(tags) {
95682                 var value = tags[field.key] || '';
95683                 var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
95684                 var l = m && wikipedia$2.find(function(d) { return m[1] === d[2]; });
95685                 var anchor = m && m[3];
95686
95687                 // value in correct format
95688                 if (l) {
95689                     utilGetSetValue(lang, l[1]);
95690                     utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
95691                     if (anchor) {
95692                         try {
95693                             // Best-effort `anchorencode:` implementation
95694                             anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
95695                         } catch (e) {
95696                             anchor = anchor.replace(/ /g, '_');
95697                         }
95698                     }
95699                     _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
95700                         m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
95701
95702                 // unrecognized value format
95703                 } else {
95704                     utilGetSetValue(title, value);
95705                     if (value && value !== '') {
95706                         utilGetSetValue(lang, '');
95707                         _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
95708                     } else {
95709                         _wikiURL = '';
95710                     }
95711                 }
95712             };
95713
95714
95715             wiki.entity = function(val) {
95716                 if (!arguments.length) return _entity;
95717                 _entity = val;
95718                 return wiki;
95719             };
95720
95721
95722             wiki.focus = function() {
95723                 title.node().focus();
95724             };
95725
95726
95727             return utilRebind(wiki, dispatch$1, 'on');
95728         }
95729
95730         var uiFields = {
95731             access: uiFieldAccess,
95732             address: uiFieldAddress,
95733             check: uiFieldCheck,
95734             combo: uiFieldCombo,
95735             cycleway: uiFieldCycleway,
95736             defaultCheck: uiFieldCheck,
95737             email: uiFieldText,
95738             lanes: uiFieldLanes,
95739             localized: uiFieldLocalized,
95740             maxspeed: uiFieldMaxspeed,
95741             multiCombo: uiFieldCombo,
95742             networkCombo: uiFieldCombo,
95743             number: uiFieldText,
95744             onewayCheck: uiFieldCheck,
95745             radio: uiFieldRadio,
95746             restrictions: uiFieldRestrictions,
95747             semiCombo: uiFieldCombo,
95748             structureRadio: uiFieldRadio,
95749             tel: uiFieldText,
95750             text: uiFieldText,
95751             textarea: uiFieldTextarea,
95752             typeCombo: uiFieldCombo,
95753             url: uiFieldText,
95754             wikidata: uiFieldWikidata,
95755             wikipedia: uiFieldWikipedia
95756         };
95757
95758         function uiField(context, presetField, entity, options) {
95759             options = Object.assign({
95760                 show: true,
95761                 wrap: true,
95762                 remove: true,
95763                 revert: true,
95764                 info: true
95765             }, options);
95766
95767             var dispatch$1 = dispatch('change');
95768             var field = Object.assign({}, presetField);   // shallow copy
95769             var _show = options.show;
95770             var _state = '';
95771             var _tags = {};
95772
95773             var _locked = false;
95774             var _lockedTip = tooltip()
95775                 .title(t('inspector.lock.suggestion', { label: field.label }))
95776                 .placement('bottom');
95777
95778
95779             field.keys = field.keys || [field.key];
95780
95781             // only create the fields that are actually being shown
95782             if (_show && !field.impl) {
95783                 createField();
95784             }
95785
95786             // Creates the field.. This is done lazily,
95787             // once we know that the field will be shown.
95788             function createField() {
95789                 field.impl = uiFields[field.type](field, context)
95790                     .on('change', function(t, onInput) {
95791                         dispatch$1.call('change', field, t, onInput);
95792                     });
95793
95794                 if (entity) {
95795                     field.entityID = entity.id;
95796                     // if this field cares about the entity, pass it along
95797                     if (field.impl.entity) {
95798                         field.impl.entity(entity);
95799                     }
95800                 }
95801             }
95802
95803
95804             function isModified() {
95805                 if (!entity) return false;
95806                 var original = context.graph().base().entities[entity.id];
95807                 return field.keys.some(function(key) {
95808                     return original ? _tags[key] !== original.tags[key] : _tags[key];
95809                 });
95810             }
95811
95812
95813             function isPresent() {
95814                 return field.keys.some(function(key) {
95815                     if (field.type === 'multiCombo') {
95816                         for (var tagKey in _tags) {
95817                             if (tagKey.indexOf(key) === 0) {
95818                                 return true;
95819                             }
95820                         }
95821                         return false;
95822                     }
95823                     return _tags[key] !== undefined;
95824                 });
95825             }
95826
95827
95828             function revert(d) {
95829                 event.stopPropagation();
95830                 event.preventDefault();
95831                 if (!entity || _locked) return;
95832
95833                 var original = context.graph().base().entities[entity.id];
95834                 var t = {};
95835                 d.keys.forEach(function(key) {
95836                     t[key] = original ? original.tags[key] : undefined;
95837                 });
95838
95839                 dispatch$1.call('change', d, t);
95840             }
95841
95842
95843             function remove(d) {
95844                 event.stopPropagation();
95845                 event.preventDefault();
95846                 if (_locked) return;
95847
95848                 var t = {};
95849                 d.keys.forEach(function(key) {
95850                     t[key] = undefined;
95851                 });
95852
95853                 dispatch$1.call('change', d, t);
95854             }
95855
95856
95857             field.render = function(selection) {
95858                 var container = selection.selectAll('.form-field')
95859                     .data([field]);
95860
95861                 // Enter
95862                 var enter = container.enter()
95863                     .append('div')
95864                     .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
95865                     .classed('nowrap', !options.wrap);
95866
95867                 if (options.wrap) {
95868                     var labelEnter = enter
95869                         .append('label')
95870                         .attr('class', 'field-label')
95871                         .attr('for', function(d) { return 'preset-input-' + d.safeid; });
95872
95873                     var textEnter = labelEnter
95874                         .append('span')
95875                         .attr('class', 'label-text');
95876
95877                     textEnter
95878                         .append('span')
95879                         .attr('class', 'label-textvalue')
95880                         .text(function(d) { return d.label(); });
95881
95882                     textEnter
95883                         .append('span')
95884                         .attr('class', 'label-textannotation');
95885
95886                     if (options.remove) {
95887                         labelEnter
95888                             .append('button')
95889                             .attr('class', 'remove-icon')
95890                             .attr('title', t('icons.remove'))
95891                             .attr('tabindex', -1)
95892                             .call(svgIcon('#iD-operation-delete'));
95893                     }
95894
95895                     if (options.revert) {
95896                         labelEnter
95897                             .append('button')
95898                             .attr('class', 'modified-icon')
95899                             .attr('title', t('icons.undo'))
95900                             .attr('tabindex', -1)
95901                             .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
95902                     }
95903                 }
95904
95905
95906                 // Update
95907                 container = container
95908                     .merge(enter);
95909
95910                 container.select('.field-label > .remove-icon')  // propagate bound data
95911                     .on('click', remove);
95912
95913                 container.select('.field-label > .modified-icon')  // propagate bound data
95914                     .on('click', revert);
95915
95916                 container
95917                     .each(function(d) {
95918                         var selection = d3_select(this);
95919
95920                         if (!d.impl) {
95921                             createField();
95922                         }
95923
95924                         var reference, help;
95925
95926                         // instantiate field help
95927                         if (options.wrap && field.type === 'restrictions') {
95928                             help = uiFieldHelp(context, 'restrictions');
95929                         }
95930
95931                         // instantiate tag reference
95932                         if (options.wrap && options.info) {
95933                             var referenceKey = d.key;
95934                             if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
95935                                 referenceKey = referenceKey.replace(/:$/, '');
95936                             }
95937
95938                             reference = uiTagReference(d.reference || { key: referenceKey }, context);
95939                             if (_state === 'hover') {
95940                                 reference.showing(false);
95941                             }
95942                         }
95943
95944                         selection
95945                             .call(d.impl);
95946
95947                         // add field help components
95948                         if (help) {
95949                             selection
95950                                 .call(help.body)
95951                                 .select('.field-label')
95952                                 .call(help.button);
95953                         }
95954
95955                         // add tag reference components
95956                         if (reference) {
95957                             selection
95958                                 .call(reference.body)
95959                                 .select('.field-label')
95960                                 .call(reference.button);
95961                         }
95962
95963                         d.impl.tags(_tags);
95964                     });
95965
95966
95967                     container
95968                         .classed('locked', _locked)
95969                         .classed('modified', isModified())
95970                         .classed('present', isPresent());
95971
95972
95973                     // show a tip and lock icon if the field is locked
95974                     var annotation = container.selectAll('.field-label .label-textannotation');
95975                     var icon = annotation.selectAll('.icon')
95976                         .data(_locked ? [0]: []);
95977
95978                     icon.exit()
95979                         .remove();
95980
95981                     icon.enter()
95982                         .append('svg')
95983                         .attr('class', 'icon')
95984                         .append('use')
95985                         .attr('xlink:href', '#fas-lock');
95986
95987                     container.call(_locked ? _lockedTip : _lockedTip.destroy);
95988             };
95989
95990
95991             field.state = function(val) {
95992                 if (!arguments.length) return _state;
95993                 _state = val;
95994                 return field;
95995             };
95996
95997
95998             field.tags = function(val) {
95999                 if (!arguments.length) return _tags;
96000                 _tags = val;
96001                 return field;
96002             };
96003
96004
96005             field.locked = function(val) {
96006                 if (!arguments.length) return _locked;
96007                 _locked = val;
96008                 return field;
96009             };
96010
96011
96012             field.show = function() {
96013                 _show = true;
96014                 if (!field.impl) {
96015                     createField();
96016                 }
96017                 if (field.default && field.key && _tags[field.key] !== field.default) {
96018                     var t = {};
96019                     t[field.key] = field.default;
96020                     dispatch$1.call('change', this, t);
96021                 }
96022             };
96023
96024             // A shown field has a visible UI, a non-shown field is in the 'Add field' dropdown
96025             field.isShown = function() {
96026                 return _show || isPresent();
96027             };
96028
96029
96030             // An allowed field can appear in the UI or in the 'Add field' dropdown.
96031             // A non-allowed field is hidden from the user altogether
96032             field.isAllowed = function() {
96033                 if (!entity || isPresent()) return true;   // a field with a value should always display
96034
96035                 var latest = context.hasEntity(entity.id);   // check the most current copy of the entity
96036                 if (!latest) return true;
96037
96038                 var require = field.prerequisiteTag;
96039                 if (require && require.key) {
96040                     var value = latest.tags[require.key];
96041                     if (!value) return false;
96042
96043                     if (require.valueNot) {
96044                         return require.valueNot !== value;
96045                     }
96046                     if (require.value) {
96047                         return require.value === value;
96048                     }
96049                     return true;
96050                 }
96051                 return true;
96052             };
96053
96054
96055             field.focus = function() {
96056                 if (field.impl) {
96057                     field.impl.focus();
96058                 }
96059             };
96060
96061
96062             return utilRebind(field, dispatch$1, 'on');
96063         }
96064
96065         function uiFormFields(context) {
96066             var moreCombo = uiCombobox(context, 'more-fields').minItems(1);
96067             var _fieldsArr = [];
96068             var _lastPlaceholder = '';
96069             var _state = '';
96070             var _klass = '';
96071
96072
96073             function formFields(selection) {
96074                 var allowedFields = _fieldsArr.filter(function(field) { return field.isAllowed(); });
96075                 var shown = allowedFields.filter(function(field) { return field.isShown(); });
96076                 var notShown = allowedFields.filter(function(field) { return !field.isShown(); });
96077
96078                 var container = selection.selectAll('.form-fields-container')
96079                     .data([0]);
96080
96081                 container = container.enter()
96082                     .append('div')
96083                     .attr('class', 'form-fields-container ' + (_klass || ''))
96084                     .merge(container);
96085
96086
96087                 var fields = container.selectAll('.wrap-form-field')
96088                     .data(shown, function(d) { return d.id + (d.entityID || ''); });
96089
96090                 fields.exit()
96091                     .remove();
96092
96093                 // Enter
96094                 var enter = fields.enter()
96095                     .append('div')
96096                     .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
96097
96098                 // Update
96099                 fields = fields
96100                     .merge(enter);
96101
96102                 fields
96103                     .order()
96104                     .each(function(d) {
96105                         d3_select(this)
96106                             .call(d.render);
96107                     });
96108
96109
96110                 var titles = [];
96111                 var moreFields = notShown.map(function(field) {
96112                     var label = field.label();
96113                     titles.push(label);
96114                     return {
96115                         title: label,
96116                         value: label,
96117                         field: field
96118                     };
96119                 });
96120
96121                 var placeholder = titles.slice(0,3).join(', ') + ((titles.length > 3) ? '…' : '');
96122
96123
96124                 var more = selection.selectAll('.more-fields')
96125                     .data((_state === 'hover' || moreFields.length === 0) ? [] : [0]);
96126
96127                 more.exit()
96128                     .remove();
96129
96130                 more = more.enter()
96131                     .append('div')
96132                     .attr('class', 'more-fields')
96133                     .append('label')
96134                     .text(t('inspector.add_fields'))
96135                     .merge(more);
96136
96137
96138                 var input = more.selectAll('.value')
96139                     .data([0]);
96140
96141                 input.exit()
96142                     .remove();
96143
96144                 input = input.enter()
96145                     .append('input')
96146                     .attr('class', 'value')
96147                     .attr('type', 'text')
96148                     .attr('placeholder', placeholder)
96149                     .call(utilNoAuto)
96150                     .merge(input);
96151
96152                 input
96153                     .call(utilGetSetValue, '')
96154                     .call(moreCombo
96155                         .data(moreFields)
96156                         .on('accept', function (d) {
96157                             if (!d) return;  // user entered something that was not matched
96158                             var field = d.field;
96159                             field.show();
96160                             selection.call(formFields);  // rerender
96161                             if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
96162                                 field.focus();
96163                             }
96164                         })
96165                     );
96166
96167                 // avoid updating placeholder excessively (triggers style recalc)
96168                 if (_lastPlaceholder !== placeholder) {
96169                     input.attr('placeholder', placeholder);
96170                     _lastPlaceholder = placeholder;
96171                 }
96172             }
96173
96174
96175             formFields.fieldsArr = function(val) {
96176                 if (!arguments.length) return _fieldsArr;
96177                 _fieldsArr = val || [];
96178                 return formFields;
96179             };
96180
96181             formFields.state = function(val) {
96182                 if (!arguments.length) return _state;
96183                 _state = val;
96184                 return formFields;
96185             };
96186
96187             formFields.klass = function(val) {
96188                 if (!arguments.length) return _klass;
96189                 _klass = val;
96190                 return formFields;
96191             };
96192
96193
96194             return formFields;
96195         }
96196
96197         function uiPresetEditor(context) {
96198             var dispatch$1 = dispatch('change');
96199             var formFields = uiFormFields(context);
96200             var _state;
96201             var _fieldsArr;
96202             var _preset;
96203             var _tags;
96204             var _entityID;
96205
96206
96207             function presetEditor(selection) {
96208                 selection.call(uiDisclosure(context, 'preset_fields', true)
96209                     .title(t('inspector.all_fields'))
96210                     .content(render)
96211                 );
96212             }
96213
96214
96215             function render(selection) {
96216                 if (!_fieldsArr) {
96217                     var entity = context.entity(_entityID);
96218                     var geometry = context.geometry(_entityID);
96219                     var presets = context.presets();
96220
96221                     _fieldsArr = [];
96222
96223                     _preset.fields.forEach(function(field) {
96224                         if (field.matchGeometry(geometry)) {
96225                             _fieldsArr.push(
96226                                 uiField(context, field, entity)
96227                             );
96228                         }
96229                     });
96230
96231                     if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
96232                         _fieldsArr.push(
96233                             uiField(context, presets.field('restrictions'), entity)
96234                         );
96235                     }
96236
96237                     var additionalFields = utilArrayUnion(_preset.moreFields, presets.universal());
96238                     additionalFields.sort(function(field1, field2) {
96239                         return field1.label() > field2.label();
96240                     });
96241
96242                     additionalFields.forEach(function(field) {
96243                         if (_preset.fields.indexOf(field) === -1) {
96244                             _fieldsArr.push(
96245                                 uiField(context, field, entity, { show: false })
96246                             );
96247                         }
96248                     });
96249
96250                     _fieldsArr.forEach(function(field) {
96251                         field
96252                             .on('change', function(t, onInput) {
96253                                 dispatch$1.call('change', field, t, onInput);
96254                             });
96255                     });
96256                 }
96257
96258                 _fieldsArr.forEach(function(field) {
96259                     field
96260                         .state(_state)
96261                         .tags(_tags);
96262                 });
96263
96264
96265                 selection
96266                     .call(formFields
96267                         .fieldsArr(_fieldsArr)
96268                         .state(_state)
96269                         .klass('inspector-inner fillL3')
96270                     );
96271
96272
96273                 selection.selectAll('.wrap-form-field input')
96274                     .on('keydown', function() {
96275                         // if user presses enter, and combobox is not active, accept edits..
96276                         if (event.keyCode === 13 && d3_select('.combobox').empty()) {
96277                             context.enter(modeBrowse(context));
96278                         }
96279                     });
96280             }
96281
96282
96283             presetEditor.preset = function(val) {
96284                 if (!arguments.length) return _preset;
96285                 if (_preset && _preset.id === val.id) return presetEditor;
96286                 _preset = val;
96287                 _fieldsArr = null;
96288                 return presetEditor;
96289             };
96290
96291
96292             presetEditor.state = function(val) {
96293                 if (!arguments.length) return _state;
96294                 _state = val;
96295                 return presetEditor;
96296             };
96297
96298
96299             presetEditor.tags = function(val) {
96300                 if (!arguments.length) return _tags;
96301                 _tags = val;
96302                 // Don't reset _fieldsArr here.
96303                 return presetEditor;
96304             };
96305
96306
96307             presetEditor.entityID = function(val) {
96308                 if (!arguments.length) return _entityID;
96309                 if (_entityID === val) return presetEditor;
96310                 _entityID = val;
96311                 _fieldsArr = null;
96312                 return presetEditor;
96313             };
96314
96315
96316             return utilRebind(presetEditor, dispatch$1, 'on');
96317         }
96318
96319         function uiEntityIssues(context) {
96320             var _selection = d3_select(null);
96321             var _activeIssueID;
96322             var _entityID;
96323
96324             // Refresh on validated events
96325             context.validator()
96326                 .on('validated.entity_issues', function() {
96327                      _selection.selectAll('.disclosure-wrap-entity_issues')
96328                          .call(render);
96329
96330                     update();
96331                 })
96332                 .on('focusedIssue.entity_issues', function(issue) {
96333                      makeActiveIssue(issue.id);
96334                 });
96335
96336
96337             function entityIssues(selection) {
96338                 _selection = selection;
96339
96340                 selection
96341                     .call(uiDisclosure(context, 'entity_issues', true)
96342                         .content(render)
96343                     );
96344
96345                 update();
96346             }
96347
96348             function getIssues() {
96349                 return context.validator().getEntityIssues(_entityID, { includeDisabledRules: true });
96350             }
96351
96352             function makeActiveIssue(issueID) {
96353                 _activeIssueID = issueID;
96354                 _selection.selectAll('.issue-container')
96355                     .classed('active', function(d) { return d.id === _activeIssueID; });
96356             }
96357
96358             function update() {
96359
96360                 var issues = getIssues();
96361
96362                 _selection
96363                     .classed('hide', issues.length === 0);
96364
96365                 _selection.selectAll('.hide-toggle-entity_issues span')
96366                     .text(t('issues.list_title', { count: issues.length }));
96367             }
96368
96369
96370             function render(selection) {
96371                 var issues = getIssues();
96372                 _activeIssueID = issues.length > 0 ? issues[0].id : null;
96373
96374
96375                 var containers = selection.selectAll('.issue-container')
96376                     .data(issues, function(d) { return d.id; });
96377
96378                 // Exit
96379                 containers.exit()
96380                     .remove();
96381
96382                 // Enter
96383                 var containersEnter = containers.enter()
96384                     .append('div')
96385                     .attr('class', 'issue-container');
96386
96387
96388                 var itemsEnter = containersEnter
96389                     .append('div')
96390                     .attr('class', function(d) { return 'issue severity-' + d.severity; })
96391                     .on('mouseover.highlight', function(d) {
96392                         // don't hover-highlight the selected entity
96393                         var ids = d.entityIds
96394                             .filter(function(e) { return e !== _entityID; });
96395
96396                         utilHighlightEntities(ids, true, context);
96397                     })
96398                     .on('mouseout.highlight', function(d) {
96399                         var ids = d.entityIds
96400                             .filter(function(e) { return e !== _entityID; });
96401
96402                         utilHighlightEntities(ids, false, context);
96403                     });
96404
96405                 var labelsEnter = itemsEnter
96406                     .append('div')
96407                     .attr('class', 'issue-label')
96408                     .on('click', function(d) {
96409
96410                         makeActiveIssue(d.id); // expand only the clicked item
96411
96412                         var extent = d.extent(context.graph());
96413                         if (extent) {
96414                             var setZoom = Math.max(context.map().zoom(), 19);
96415                             context.map().unobscuredCenterZoomEase(extent.center(), setZoom);
96416                         }
96417                     });
96418
96419                 var textEnter = labelsEnter
96420                     .append('span')
96421                     .attr('class', 'issue-text');
96422
96423                 textEnter
96424                     .append('span')
96425                     .attr('class', 'issue-icon')
96426                     .each(function(d) {
96427                         var iconName = '#iD-icon-' + (d.severity === 'warning' ? 'alert' : 'error');
96428                         d3_select(this)
96429                             .call(svgIcon(iconName));
96430                     });
96431
96432                 textEnter
96433                     .append('span')
96434                     .attr('class', 'issue-message');
96435
96436
96437                 var infoButton = labelsEnter
96438                     .append('button')
96439                     .attr('class', 'issue-info-button')
96440                     .attr('title', t('icons.information'))
96441                     .attr('tabindex', -1)
96442                     .call(svgIcon('#iD-icon-inspect'));
96443
96444                 infoButton
96445                     .on('click', function () {
96446                         event.stopPropagation();
96447                         event.preventDefault();
96448                         this.blur();    // avoid keeping focus on the button - #4641
96449
96450                         var container = d3_select(this.parentNode.parentNode.parentNode);
96451                         var info = container.selectAll('.issue-info');
96452                         var isExpanded = info.classed('expanded');
96453
96454                         if (isExpanded) {
96455                             info
96456                                 .transition()
96457                                 .duration(200)
96458                                 .style('max-height', '0px')
96459                                 .style('opacity', '0')
96460                                 .on('end', function () {
96461                                     info.classed('expanded', false);
96462                                 });
96463                         } else {
96464                             info
96465                                 .classed('expanded', true)
96466                                 .transition()
96467                                 .duration(200)
96468                                 .style('max-height', '200px')
96469                                 .style('opacity', '1')
96470                                 .on('end', function () {
96471                                     info.style('max-height', null);
96472                                 });
96473                         }
96474                     });
96475
96476                 itemsEnter
96477                     .append('ul')
96478                     .attr('class', 'issue-fix-list');
96479
96480                 containersEnter
96481                     .append('div')
96482                     .attr('class', 'issue-info')
96483                     .style('max-height', '0')
96484                     .style('opacity', '0')
96485                     .each(function(d) {
96486                         if (typeof d.reference === 'function') {
96487                             d3_select(this)
96488                                 .call(d.reference);
96489                         } else {
96490                             d3_select(this)
96491                                 .text(t('inspector.no_documentation_key'));
96492                         }
96493                     });
96494
96495
96496                 // Update
96497                 containers = containers
96498                     .merge(containersEnter)
96499                     .classed('active', function(d) { return d.id === _activeIssueID; });
96500
96501                 containers.selectAll('.issue-message')
96502                     .text(function(d) {
96503                         return d.message();
96504                     });
96505
96506                 // fixes
96507                 var fixLists = containers.selectAll('.issue-fix-list');
96508
96509                 var fixes = fixLists.selectAll('.issue-fix-item')
96510                     .data(function(d) { return d.fixes ? d.fixes : []; });
96511
96512                 var fixesEnter = fixes.enter()
96513                     .append('li')
96514                     .attr('class', function(d) {
96515                         return 'issue-fix-item ' + (d.onClick ? 'actionable' : '');
96516                     })
96517                     .on('click', function(d) {
96518                         // not all fixes are actionable
96519                         if (!d.onClick) return;
96520
96521                         // Don't run another fix for this issue within a second of running one
96522                         // (Necessary for "Select a feature type" fix. Most fixes should only ever run once)
96523                         if (d.issue.dateLastRanFix && new Date() - d.issue.dateLastRanFix < 1000) return;
96524                         d.issue.dateLastRanFix = new Date();
96525
96526                         // remove hover-highlighting
96527                         utilHighlightEntities(d.issue.entityIds.concat(d.entityIds), false, context);
96528
96529                         new Promise(function(resolve, reject) {
96530                             d.onClick(resolve, reject);
96531                             if (!d.onClick.length) {
96532                                 // if the fix doesn't take any completion parameters then consider it resolved
96533                                 resolve();
96534                             }
96535                         })
96536                         .then(function() {
96537                             // revalidate whenever the fix has finished running successfully
96538                             context.validator().validate();
96539                         });
96540                     })
96541                     .on('mouseover.highlight', function(d) {
96542                         utilHighlightEntities(d.entityIds, true, context);
96543                     })
96544                     .on('mouseout.highlight', function(d) {
96545                         utilHighlightEntities(d.entityIds, false, context);
96546                     });
96547
96548                 fixesEnter
96549                     .append('span')
96550                     .attr('class', 'fix-icon')
96551                     .each(function(d) {
96552                         var iconName = d.icon || 'iD-icon-wrench';
96553                         if (iconName.startsWith('maki')) {
96554                             iconName += '-15';
96555                         }
96556                         d3_select(this).call(svgIcon('#' + iconName));
96557                     });
96558
96559                 fixesEnter
96560                     .append('span')
96561                     .attr('class', 'fix-message')
96562                     .text(function(d) { return d.title; });
96563             }
96564
96565
96566             entityIssues.entityID = function(val) {
96567                 if (!arguments.length) return _entityID;
96568                 if (_entityID !== val) {
96569                     _entityID = val;
96570                     _activeIssueID = null;
96571                 }
96572                 return entityIssues;
96573             };
96574
96575
96576             return entityIssues;
96577         }
96578
96579         function uiEntityEditor(context) {
96580             var dispatch$1 = dispatch('choose');
96581             var _state = 'select';
96582             var _coalesceChanges = false;
96583             var _modified = false;
96584             var _scrolled = false;
96585             var _base;
96586             var _entityID;
96587             var _activePreset;
96588             var _tagReference;
96589             var _presetFavorite;
96590
96591             var entityIssues = uiEntityIssues(context);
96592             var quickLinks = uiQuickLinks();
96593             var presetEditor = uiPresetEditor(context).on('change', changeTags);
96594             var rawTagEditor = uiRawTagEditor(context).on('change', changeTags);
96595             var rawMemberEditor = uiRawMemberEditor(context);
96596             var rawMembershipEditor = uiRawMembershipEditor(context);
96597
96598             function entityEditor(selection) {
96599                 var entity = context.entity(_entityID);
96600                 var tags = Object.assign({}, entity.tags);  // shallow copy
96601
96602                 // Header
96603                 var header = selection.selectAll('.header')
96604                     .data([0]);
96605
96606                 // Enter
96607                 var headerEnter = header.enter()
96608                     .append('div')
96609                     .attr('class', 'header fillL cf');
96610
96611                 headerEnter
96612                     .append('button')
96613                     .attr('class', 'fl preset-reset preset-choose')
96614                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
96615
96616                 headerEnter
96617                     .append('button')
96618                     .attr('class', 'fr preset-close')
96619                     .on('click', function() { context.enter(modeBrowse(context)); })
96620                     .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96621
96622                 headerEnter
96623                     .append('h3')
96624                     .text(t('inspector.edit'));
96625
96626                 // Update
96627                 header = header
96628                     .merge(headerEnter);
96629
96630                 header.selectAll('.preset-reset')
96631                     .on('click', function() {
96632                         dispatch$1.call('choose', this, _activePreset);
96633                     });
96634
96635
96636                 // Body
96637                 var body = selection.selectAll('.inspector-body')
96638                     .data([0]);
96639
96640                 // Enter
96641                 var bodyEnter = body.enter()
96642                     .append('div')
96643                     .attr('class', 'inspector-body')
96644                     .on('scroll.entity-editor', function() { _scrolled = true; });
96645
96646                 bodyEnter
96647                     .append('div')
96648                     .attr('class', 'preset-list-item inspector-inner')
96649                     .append('div')
96650                     .attr('class', 'preset-list-button-wrap')
96651                     .append('button')
96652                     .attr('class', 'preset-list-button preset-reset')
96653                     .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
96654                     .append('div')
96655                     .attr('class', 'label')
96656                     .append('div')
96657                     .attr('class', 'label-inner');
96658
96659                 bodyEnter
96660                     .append('div')
96661                     .attr('class', 'preset-quick-links');
96662
96663                 bodyEnter
96664                     .append('div')
96665                     .attr('class', 'entity-issues');
96666
96667                 bodyEnter
96668                     .append('div')
96669                     .attr('class', 'preset-editor');
96670
96671                 bodyEnter
96672                     .append('div')
96673                     .attr('class', 'raw-tag-editor inspector-inner');
96674
96675                 bodyEnter
96676                     .append('div')
96677                     .attr('class', 'raw-member-editor inspector-inner');
96678
96679                 bodyEnter
96680                     .append('div')
96681                     .attr('class', 'raw-membership-editor inspector-inner');
96682
96683                 bodyEnter
96684                     .append('input')
96685                     .attr('type', 'text')
96686                     .attr('class', 'key-trap');
96687
96688
96689                 // Update
96690                 body = body
96691                     .merge(bodyEnter);
96692
96693                 if (_presetFavorite) {
96694                     body.selectAll('.preset-list-button-wrap')
96695                         .call(_presetFavorite.button);
96696                 }
96697
96698                 // update header
96699                 if (_tagReference) {
96700                     body.selectAll('.preset-list-button-wrap')
96701                         .call(_tagReference.button);
96702
96703                     body.selectAll('.preset-list-item')
96704                         .call(_tagReference.body);
96705                 }
96706
96707                 body.selectAll('.preset-reset')
96708                     .on('click', function() {
96709                         dispatch$1.call('choose', this, _activePreset);
96710                     });
96711
96712                 body.select('.preset-list-item button')
96713                     .call(uiPresetIcon(context)
96714                         .geometry(context.geometry(_entityID))
96715                         .preset(_activePreset)
96716                     );
96717
96718                 // NOTE: split on en-dash, not a hypen (to avoid conflict with hyphenated names)
96719                 var label = body.select('.label-inner');
96720                 var nameparts = label.selectAll('.namepart')
96721                     .data(_activePreset.name().split(' – '), function(d) { return d; });
96722
96723                 nameparts.exit()
96724                     .remove();
96725
96726                 nameparts
96727                     .enter()
96728                     .append('div')
96729                     .attr('class', 'namepart')
96730                     .text(function(d) { return d; });
96731
96732                 // update quick links
96733                 var choices = [{
96734                     id: 'zoom_to',
96735                     label: 'inspector.zoom_to.title',
96736                     tooltip: function() {
96737                         return uiTooltipHtml(t('inspector.zoom_to.tooltip_feature'), t('inspector.zoom_to.key'));
96738                     },
96739                     click: function zoomTo() {
96740                         context.mode().zoomToSelected();
96741                     }
96742                 }];
96743
96744                 body.select('.preset-quick-links')
96745                     .call(quickLinks.choices(choices));
96746
96747
96748                 // update editor sections
96749                 body.select('.entity-issues')
96750                     .call(entityIssues
96751                         .entityID(_entityID)
96752                     );
96753
96754                 body.select('.preset-editor')
96755                     .call(presetEditor
96756                         .preset(_activePreset)
96757                         .entityID(_entityID)
96758                         .tags(tags)
96759                         .state(_state)
96760                     );
96761
96762                 body.select('.raw-tag-editor')
96763                     .call(rawTagEditor
96764                         .preset(_activePreset)
96765                         .entityID(_entityID)
96766                         .tags(tags)
96767                         .state(_state)
96768                     );
96769
96770                 if (entity.type === 'relation') {
96771                     body.select('.raw-member-editor')
96772                         .style('display', 'block')
96773                         .call(rawMemberEditor
96774                             .entityID(_entityID)
96775                         );
96776                 } else {
96777                     body.select('.raw-member-editor')
96778                         .style('display', 'none');
96779                 }
96780
96781                 body.select('.raw-membership-editor')
96782                     .call(rawMembershipEditor
96783                         .entityID(_entityID)
96784                     );
96785
96786                 body.select('.key-trap')
96787                     .on('keydown.key-trap', function() {
96788                         // On tabbing, send focus back to the first field on the inspector-body
96789                         // (probably the `name` field) #4159
96790                         if (event.keyCode === 9 && !event.shiftKey) {
96791                             event.preventDefault();
96792                             body.select('input').node().focus();
96793                         }
96794                     });
96795
96796                 context.history()
96797                     .on('change.entity-editor', historyChanged);
96798
96799
96800                 function historyChanged(difference) {
96801                     if (_state === 'hide') return;
96802                     var significant = !difference ||
96803                             difference.didChange.properties ||
96804                             difference.didChange.addition ||
96805                             difference.didChange.deletion;
96806                     if (!significant) return;
96807
96808                     var entity = context.hasEntity(_entityID);
96809                     var graph = context.graph();
96810                     if (!entity) return;
96811
96812                     var match = context.presets().match(entity, graph);
96813                     var activePreset = entityEditor.preset();
96814                     var weakPreset = activePreset &&
96815                         Object.keys(activePreset.addTags || {}).length === 0;
96816
96817                     // A "weak" preset doesn't set any tags. (e.g. "Address")
96818                     // Don't replace a weak preset with a fallback preset (e.g. "Point")
96819                     if (!(weakPreset && match.isFallback())) {
96820                         entityEditor.preset(match);
96821                     }
96822                     entityEditor.modified(_base !== graph);
96823                     entityEditor(selection);
96824                 }
96825             }
96826
96827
96828             // Tag changes that fire on input can all get coalesced into a single
96829             // history operation when the user leaves the field.  #2342
96830             function changeTags(changed, onInput) {
96831                 var entity = context.entity(_entityID);
96832                 var annotation = t('operations.change_tags.annotation');
96833                 var tags = Object.assign({}, entity.tags);   // shallow copy
96834
96835                 for (var k in changed) {
96836                     if (!k) continue;
96837                     var v = changed[k];
96838                     if (v !== undefined || tags.hasOwnProperty(k)) {
96839                         tags[k] = v;
96840                     }
96841                 }
96842
96843                 if (!onInput) {
96844                     tags = utilCleanTags(tags);
96845                 }
96846
96847                 if (!fastDeepEqual(entity.tags, tags)) {
96848                     if (_coalesceChanges) {
96849                         context.overwrite(actionChangeTags(_entityID, tags), annotation);
96850                     } else {
96851                         context.perform(actionChangeTags(_entityID, tags), annotation);
96852                         _coalesceChanges = !!onInput;
96853                     }
96854                 }
96855
96856                 // if leaving field (blur event), rerun validation
96857                 if (!onInput) {
96858                     context.validator().validate();
96859                 }
96860             }
96861
96862
96863             entityEditor.modified = function(val) {
96864                 if (!arguments.length) return _modified;
96865                 _modified = val;
96866                 d3_selectAll('button.preset-close use')
96867                     .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
96868                 return entityEditor;
96869             };
96870
96871
96872             entityEditor.state = function(val) {
96873                 if (!arguments.length) return _state;
96874                 _state = val;
96875                 return entityEditor;
96876             };
96877
96878
96879             entityEditor.entityID = function(val) {
96880                 if (!arguments.length) return _entityID;
96881                 if (_entityID === val) return entityEditor;  // exit early if no change
96882
96883                 _entityID = val;
96884                 _base = context.graph();
96885                 _coalesceChanges = false;
96886
96887                 // reset the scroll to the top of the inspector (warning: triggers reflow)
96888                 if (_scrolled) {
96889                     window.requestIdleCallback(function() {
96890                         var body = d3_selectAll('.entity-editor-pane .inspector-body');
96891                         if (!body.empty()) {
96892                             _scrolled = false;
96893                             body.node().scrollTop = 0;
96894                         }
96895                     });
96896                 }
96897
96898                 var presetMatch = context.presets().match(context.entity(_entityID), _base);
96899
96900                 return entityEditor
96901                     .preset(presetMatch)
96902                     .modified(false);
96903             };
96904
96905
96906             entityEditor.preset = function(val) {
96907                 if (!arguments.length) return _activePreset;
96908                 if (val !== _activePreset) {
96909                     _activePreset = val;
96910                     _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
96911                         .showing(false);
96912                 }
96913                 _presetFavorite = uiPresetFavoriteButton(_activePreset, context.geometry(_entityID), context);
96914                 return entityEditor;
96915             };
96916
96917
96918             return utilRebind(entityEditor, dispatch$1, 'on');
96919         }
96920
96921         function uiPresetList(context) {
96922             var dispatch$1 = dispatch('choose');
96923             var _entityID;
96924             var _currentPreset;
96925             var _autofocus = false;
96926             var geocoder = services$1.geocoder;
96927
96928
96929             function presetList(selection) {
96930                 var entity = context.entity(_entityID);
96931                 var geometry = context.geometry(_entityID);
96932
96933                 // Treat entities on addr:interpolation lines as points, not vertices (#3241)
96934                 if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
96935                     geometry = 'point';
96936                 }
96937
96938                 var presets = context.presets().matchGeometry(geometry);
96939
96940                 selection.html('');
96941
96942                 var messagewrap = selection
96943                     .append('div')
96944                     .attr('class', 'header fillL');
96945
96946                 var message = messagewrap
96947                     .append('h3')
96948                     .text(t('inspector.choose'));
96949
96950                 messagewrap
96951                     .append('button')
96952                     .attr('class', 'preset-choose')
96953                     .on('click', function() { dispatch$1.call('choose', this, _currentPreset); })
96954                     .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
96955
96956                 function initialKeydown() {
96957                     // hack to let delete shortcut work when search is autofocused
96958                     if (search.property('value').length === 0 &&
96959                         (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
96960                          event.keyCode === utilKeybinding.keyCodes['⌦'])) {
96961                         event.preventDefault();
96962                         event.stopPropagation();
96963                         operationDelete([_entityID], context)();
96964
96965                     // hack to let undo work when search is autofocused
96966                     } else if (search.property('value').length === 0 &&
96967                         (event.ctrlKey || event.metaKey) &&
96968                         event.keyCode === utilKeybinding.keyCodes.z) {
96969                         event.preventDefault();
96970                         event.stopPropagation();
96971                         context.undo();
96972                     } else if (!event.ctrlKey && !event.metaKey) {
96973                         // don't check for delete/undo hack on future keydown events
96974                         d3_select(this).on('keydown', keydown);
96975                         keydown.call(this);
96976                     }
96977                 }
96978
96979                 function keydown() {
96980                     // down arrow
96981                     if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
96982                         // if insertion point is at the end of the string
96983                         search.node().selectionStart === search.property('value').length) {
96984                         event.preventDefault();
96985                         event.stopPropagation();
96986                         // move focus to the first item in the preset list
96987                         var buttons = list.selectAll('.preset-list-button');
96988                         if (!buttons.empty()) buttons.nodes()[0].focus();
96989                     }
96990                 }
96991
96992                 function keypress() {
96993                     // enter
96994                     var value = search.property('value');
96995                     if (event.keyCode === 13 && value.length) {
96996                         list.selectAll('.preset-list-item:first-child')
96997                             .each(function(d) { d.choose.call(this); });
96998                     }
96999                 }
97000
97001                 function inputevent() {
97002                     var value = search.property('value');
97003                     list.classed('filtered', value.length);
97004                     if (value.length) {
97005                         var entity = context.entity(_entityID);
97006                         if (geocoder && entity) {
97007                             var center = entity.extent(context.graph()).center();
97008                             geocoder.countryCode(center, function countryCallback(err, countryCode) {
97009                                 // get the input value again because it may have changed
97010                                 var currentValue = search.property('value');
97011
97012                                 if (!currentValue.length) return;
97013
97014                                 var results;
97015                                 if (!err && countryCode) {
97016                                     countryCode = countryCode.toLowerCase();
97017                                     results = presets.search(currentValue, geometry, countryCode);
97018                                 } else {
97019                                     results = presets.search(currentValue, geometry);
97020                                 }
97021                                 message.text(t('inspector.results', {
97022                                     n: results.collection.length,
97023                                     search: currentValue
97024                                 }));
97025                                 list.call(drawList, results);
97026                             });
97027                         }
97028                     } else {
97029                         list.call(drawList, context.presets().defaults(geometry, 36));
97030                         message.text(t('inspector.choose'));
97031                     }
97032                 }
97033
97034                 var searchWrap = selection
97035                     .append('div')
97036                     .attr('class', 'search-header');
97037
97038                 var search = searchWrap
97039                     .append('input')
97040                     .attr('class', 'preset-search-input')
97041                     .attr('placeholder', t('inspector.search'))
97042                     .attr('type', 'search')
97043                     .call(utilNoAuto)
97044                     .on('keydown', initialKeydown)
97045                     .on('keypress', keypress)
97046                     .on('input', inputevent);
97047
97048                 searchWrap
97049                     .call(svgIcon('#iD-icon-search', 'pre-text'));
97050
97051                 if (_autofocus) {
97052                     search.node().focus();
97053                 }
97054
97055                 var listWrap = selection
97056                     .append('div')
97057                     .attr('class', 'inspector-body');
97058
97059                 var list = listWrap
97060                     .append('div')
97061                     .attr('class', 'preset-list fillL cf')
97062                     .call(drawList, context.presets().defaults(geometry, 36));
97063
97064                 context.features().on('change.preset-list', updateForFeatureHiddenState);
97065             }
97066
97067
97068             function drawList(list, presets) {
97069                 var collection = presets.collection.reduce(function(collection, preset) {
97070                     if (preset.members) {
97071                         collection.push(CategoryItem(preset));
97072                     } else if (preset.visible()) {
97073                         collection.push(PresetItem(preset));
97074                     }
97075                     return collection;
97076                 }, []);
97077
97078                 var items = list.selectAll('.preset-list-item')
97079                     .data(collection, function(d) { return d.preset.id; });
97080
97081                 items.order();
97082
97083                 items.exit()
97084                     .remove();
97085
97086                 items.enter()
97087                     .append('div')
97088                     .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
97089                     .classed('current', function(item) { return item.preset === _currentPreset; })
97090                     .each(function(item) { d3_select(this).call(item); })
97091                     .style('opacity', 0)
97092                     .transition()
97093                     .style('opacity', 1);
97094
97095                 updateForFeatureHiddenState();
97096             }
97097
97098             function itemKeydown(){
97099                 // the actively focused item
97100                 var item = d3_select(this.closest('.preset-list-item'));
97101                 var parentItem = d3_select(item.node().parentNode.closest('.preset-list-item'));
97102
97103                 // arrow down, move focus to the next, lower item
97104                 if (event.keyCode === utilKeybinding.keyCodes['↓']) {
97105                     event.preventDefault();
97106                     event.stopPropagation();
97107                     // the next item in the list at the same level
97108                     var nextItem = d3_select(item.node().nextElementSibling);
97109                     // if there is no next item in this list
97110                     if (nextItem.empty()) {
97111                         // if there is a parent item
97112                         if (!parentItem.empty()) {
97113                             // the item is the last item of a sublist,
97114                             // select the next item at the parent level
97115                             nextItem = d3_select(parentItem.node().nextElementSibling);
97116                         }
97117                     // if the focused item is expanded
97118                     } else if (d3_select(this).classed('expanded')) {
97119                         // select the first subitem instead
97120                         nextItem = item.select('.subgrid .preset-list-item:first-child');
97121                     }
97122                     if (!nextItem.empty()) {
97123                         // focus on the next item
97124                         nextItem.select('.preset-list-button').node().focus();
97125                     }
97126
97127                 // arrow up, move focus to the previous, higher item
97128                 } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
97129                     event.preventDefault();
97130                     event.stopPropagation();
97131                     // the previous item in the list at the same level
97132                     var previousItem = d3_select(item.node().previousElementSibling);
97133
97134                     // if there is no previous item in this list
97135                     if (previousItem.empty()) {
97136                         // if there is a parent item
97137                         if (!parentItem.empty()) {
97138                             // the item is the first subitem of a sublist select the parent item
97139                             previousItem = parentItem;
97140                         }
97141                     // if the previous item is expanded
97142                     } else if (previousItem.select('.preset-list-button').classed('expanded')) {
97143                         // select the last subitem of the sublist of the previous item
97144                         previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
97145                     }
97146
97147                     if (!previousItem.empty()) {
97148                         // focus on the previous item
97149                         previousItem.select('.preset-list-button').node().focus();
97150                     } else {
97151                         // the focus is at the top of the list, move focus back to the search field
97152                         var search = d3_select(this.closest('.preset-list-pane')).select('.preset-search-input');
97153                         search.node().focus();
97154                     }
97155
97156                 // arrow left, move focus to the parent item if there is one
97157                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97158                     event.preventDefault();
97159                     event.stopPropagation();
97160                     // if there is a parent item, focus on the parent item
97161                     if (!parentItem.empty()) {
97162                         parentItem.select('.preset-list-button').node().focus();
97163                     }
97164
97165                 // arrow right, choose this item
97166                 } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97167                     event.preventDefault();
97168                     event.stopPropagation();
97169                     item.datum().choose.call(d3_select(this).node());
97170                 }
97171             }
97172
97173
97174             function CategoryItem(preset) {
97175                 var box, sublist, shown = false;
97176
97177                 function item(selection) {
97178                     var wrap = selection.append('div')
97179                         .attr('class', 'preset-list-button-wrap category');
97180
97181                     function click() {
97182                         var isExpanded = d3_select(this).classed('expanded');
97183                         var iconName = isExpanded ?
97184                             (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
97185                         d3_select(this)
97186                             .classed('expanded', !isExpanded);
97187                         d3_select(this).selectAll('div.label-inner svg.icon use')
97188                             .attr('href', iconName);
97189                         item.choose();
97190                     }
97191
97192                     var button = wrap
97193                         .append('button')
97194                         .attr('class', 'preset-list-button')
97195                         .classed('expanded', false)
97196                         .call(uiPresetIcon(context)
97197                             .geometry(context.geometry(_entityID))
97198                             .preset(preset))
97199                         .on('click', click)
97200                         .on('keydown', function() {
97201                             // right arrow, expand the focused item
97202                             if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
97203                                 event.preventDefault();
97204                                 event.stopPropagation();
97205                                 // if the item isn't expanded
97206                                 if (!d3_select(this).classed('expanded')) {
97207                                     // toggle expansion (expand the item)
97208                                     click.call(this);
97209                                 }
97210                             // left arrow, collapse the focused item
97211                             } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
97212                                 event.preventDefault();
97213                                 event.stopPropagation();
97214                                 // if the item is expanded
97215                                 if (d3_select(this).classed('expanded')) {
97216                                     // toggle expansion (collapse the item)
97217                                     click.call(this);
97218                                 }
97219                             } else {
97220                                 itemKeydown.call(this);
97221                             }
97222                         });
97223
97224                     var label = button
97225                         .append('div')
97226                         .attr('class', 'label')
97227                         .append('div')
97228                         .attr('class', 'label-inner');
97229
97230                     label
97231                         .append('div')
97232                         .attr('class', 'namepart')
97233                         .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
97234                         .append('span')
97235                         .html(function() { return preset.name() + '&hellip;'; });
97236
97237                     box = selection.append('div')
97238                         .attr('class', 'subgrid')
97239                         .style('max-height', '0px')
97240                         .style('opacity', 0);
97241
97242                     box.append('div')
97243                         .attr('class', 'arrow');
97244
97245                     sublist = box.append('div')
97246                         .attr('class', 'preset-list fillL3');
97247                 }
97248
97249
97250                 item.choose = function() {
97251                     if (!box || !sublist) return;
97252
97253                     if (shown) {
97254                         shown = false;
97255                         box.transition()
97256                             .duration(200)
97257                             .style('opacity', '0')
97258                             .style('max-height', '0px')
97259                             .style('padding-bottom', '0px');
97260                     } else {
97261                         shown = true;
97262                         var members = preset.members.matchGeometry(context.geometry(_entityID));
97263                         sublist.call(drawList, members);
97264                         box.transition()
97265                             .duration(200)
97266                             .style('opacity', '1')
97267                             .style('max-height', 200 + members.collection.length * 190 + 'px')
97268                             .style('padding-bottom', '10px');
97269                     }
97270                 };
97271
97272                 item.preset = preset;
97273                 return item;
97274             }
97275
97276
97277             function PresetItem(preset) {
97278                 function item(selection) {
97279                     var wrap = selection.append('div')
97280                         .attr('class', 'preset-list-button-wrap');
97281
97282                     var button = wrap.append('button')
97283                         .attr('class', 'preset-list-button')
97284                         .call(uiPresetIcon(context)
97285                             .geometry(context.geometry(_entityID))
97286                             .preset(preset))
97287                         .on('click', item.choose)
97288                         .on('keydown', itemKeydown);
97289
97290                     var label = button
97291                         .append('div')
97292                         .attr('class', 'label')
97293                         .append('div')
97294                         .attr('class', 'label-inner');
97295
97296                     // NOTE: split/join on en-dash, not a hypen (to avoid conflict with fr - nl names in Brussels etc)
97297                     label.selectAll('.namepart')
97298                         .data(preset.name().split(' – '))
97299                         .enter()
97300                         .append('div')
97301                         .attr('class', 'namepart')
97302                         .text(function(d) { return d; });
97303
97304                     wrap.call(item.reference.button);
97305                     selection.call(item.reference.body);
97306                 }
97307
97308                 item.choose = function() {
97309                     if (d3_select(this).classed('disabled')) return;
97310
97311                     context.presets().setMostRecent(preset, context.geometry(_entityID));
97312                     context.perform(
97313                         actionChangePreset(_entityID, _currentPreset, preset),
97314                         t('operations.change_tags.annotation')
97315                     );
97316
97317                     context.validator().validate();  // rerun validation
97318                     dispatch$1.call('choose', this, preset);
97319                 };
97320
97321                 item.help = function() {
97322                     event.stopPropagation();
97323                     item.reference.toggle();
97324                 };
97325
97326                 item.preset = preset;
97327                 item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
97328
97329                 return item;
97330             }
97331
97332
97333             function updateForFeatureHiddenState() {
97334                 if (!context.hasEntity(_entityID)) return;
97335
97336                 var geometry = context.geometry(_entityID);
97337                 var button = d3_selectAll('.preset-list .preset-list-button');
97338
97339                 // remove existing tooltips
97340                 button.call(tooltip().destroyAny);
97341
97342                 button.each(function(item, index) {
97343                     var hiddenPresetFeaturesId = context.features().isHiddenPreset(item.preset, geometry);
97344                     var isHiddenPreset = !!hiddenPresetFeaturesId && item.preset !== _currentPreset;
97345
97346                     d3_select(this)
97347                         .classed('disabled', isHiddenPreset);
97348
97349                     if (isHiddenPreset) {
97350                         var isAutoHidden = context.features().autoHidden(hiddenPresetFeaturesId);
97351                         var tooltipIdSuffix = isAutoHidden ? 'zoom' : 'manual';
97352                         var tooltipObj = { features: t('feature.' + hiddenPresetFeaturesId + '.description') };
97353                         d3_select(this).call(tooltip()
97354                             .title(t('inspector.hidden_preset.' + tooltipIdSuffix, tooltipObj))
97355                             .placement(index < 2 ? 'bottom' : 'top')
97356                         );
97357                     }
97358                 });
97359             }
97360
97361             presetList.autofocus = function(val) {
97362                 if (!arguments.length) return _autofocus;
97363                 _autofocus = val;
97364                 return presetList;
97365             };
97366
97367
97368             presetList.entityID = function(val) {
97369                 if (!arguments.length) return _entityID;
97370                 _entityID = val;
97371                 presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
97372                 return presetList;
97373             };
97374
97375
97376             presetList.preset = function(val) {
97377                 if (!arguments.length) return _currentPreset;
97378                 _currentPreset = val;
97379                 return presetList;
97380             };
97381
97382
97383             return utilRebind(presetList, dispatch$1, 'on');
97384         }
97385
97386         function uiInspector(context) {
97387             var presetList = uiPresetList(context);
97388             var entityEditor = uiEntityEditor(context);
97389             var wrap = d3_select(null),
97390                 presetPane = d3_select(null),
97391                 editorPane = d3_select(null);
97392             var _state = 'select';
97393             var _entityID;
97394             var _newFeature = false;
97395
97396
97397             function inspector(selection, newFeature) {
97398                 presetList
97399                     .entityID(_entityID)
97400                     .autofocus(_newFeature)
97401                     .on('choose', inspector.setPreset);
97402
97403                 entityEditor
97404                     .state(_state)
97405                     .entityID(_entityID)
97406                     .on('choose', inspector.showList);
97407
97408                 wrap = selection.selectAll('.panewrap')
97409                     .data([0]);
97410
97411                 var enter = wrap.enter()
97412                     .append('div')
97413                     .attr('class', 'panewrap');
97414
97415                 enter
97416                     .append('div')
97417                     .attr('class', 'preset-list-pane pane');
97418
97419                 enter
97420                     .append('div')
97421                     .attr('class', 'entity-editor-pane pane');
97422
97423                 wrap = wrap.merge(enter);
97424                 presetPane = wrap.selectAll('.preset-list-pane');
97425                 editorPane = wrap.selectAll('.entity-editor-pane');
97426
97427                 var entity = context.entity(_entityID);
97428
97429                 var hasNonGeometryTags = entity.hasNonGeometryTags();
97430                 var isTaglessOrIntersectionVertex = entity.geometry(context.graph()) === 'vertex' &&
97431                     (!hasNonGeometryTags && !entity.isHighwayIntersection(context.graph()));
97432                 var issues = context.validator().getEntityIssues(_entityID);
97433                 // start with the preset list if the feature is new and untagged or is an uninteresting vertex
97434                 var showPresetList = (newFeature && !hasNonGeometryTags) || (isTaglessOrIntersectionVertex && !issues.length);
97435
97436                 if (showPresetList) {
97437                     wrap.style('right', '-100%');
97438                     presetPane.call(presetList);
97439                 } else {
97440                     wrap.style('right', '0%');
97441                     editorPane.call(entityEditor);
97442                 }
97443
97444                 var footer = selection.selectAll('.footer')
97445                     .data([0]);
97446
97447                 footer = footer.enter()
97448                     .append('div')
97449                     .attr('class', 'footer')
97450                     .merge(footer);
97451
97452                 footer
97453                     .call(uiViewOnOSM(context)
97454                         .what(context.hasEntity(_entityID))
97455                     );
97456             }
97457
97458             inspector.showList = function(preset) {
97459                 wrap.transition()
97460                     .styleTween('right', function() { return d3_interpolate('0%', '-100%'); });
97461
97462                 presetPane
97463                     .call(presetList.preset(preset).autofocus(true));
97464             };
97465
97466             inspector.setPreset = function(preset) {
97467
97468                 // upon setting multipolygon, go to the area preset list instead of the editor
97469                 if (preset.id === 'type/multipolygon') {
97470                     presetPane
97471                         .call(presetList.preset(preset).autofocus(true));
97472
97473                 } else {
97474                     wrap.transition()
97475                         .styleTween('right', function() { return d3_interpolate('-100%', '0%'); });
97476
97477                     editorPane
97478                         .call(entityEditor.preset(preset));
97479                 }
97480
97481             };
97482
97483             inspector.state = function(val) {
97484                 if (!arguments.length) return _state;
97485                 _state = val;
97486                 entityEditor.state(_state);
97487
97488                 // remove any old field help overlay that might have gotten attached to the inspector
97489                 d3_selectAll('.field-help-body').remove();
97490
97491                 return inspector;
97492             };
97493
97494
97495             inspector.entityID = function(val) {
97496                 if (!arguments.length) return _entityID;
97497                 _entityID = val;
97498                 return inspector;
97499             };
97500
97501
97502             inspector.newFeature = function(val) {
97503                 if (!arguments.length) return _newFeature;
97504                 _newFeature = val;
97505                 return inspector;
97506             };
97507
97508
97509             return inspector;
97510         }
97511
97512         function uiSidebar(context) {
97513             var inspector = uiInspector(context);
97514             var dataEditor = uiDataEditor(context);
97515             var noteEditor = uiNoteEditor(context);
97516             var improveOsmEditor = uiImproveOsmEditor(context);
97517             var keepRightEditor = uiKeepRightEditor(context);
97518             var _current;
97519             var _wasData = false;
97520             var _wasNote = false;
97521             var _wasQAError = false;
97522
97523
97524             function sidebar(selection) {
97525                 var container = d3_select('#id-container');
97526                 var minWidth = 280;
97527                 var sidebarWidth;
97528                 var containerWidth;
97529                 var dragOffset;
97530
97531                 var resizer = selection
97532                     .append('div')
97533                     .attr('id', 'sidebar-resizer');
97534
97535                 // Set the initial width constraints
97536                 selection
97537                     .style('min-width', minWidth + 'px')
97538                     .style('max-width', '400px')
97539                     .style('width', '33.3333%');
97540
97541                 resizer.call(d3_drag()
97542                     .container(container.node())
97543                     .on('start', function() {
97544                         // offset from edge of sidebar-resizer
97545                         dragOffset = event.sourceEvent.offsetX - 1;
97546
97547                         sidebarWidth = selection.node().getBoundingClientRect().width;
97548                         containerWidth = container.node().getBoundingClientRect().width;
97549                         var widthPct = (sidebarWidth / containerWidth) * 100;
97550                         selection
97551                             .style('width', widthPct + '%')    // lock in current width
97552                             .style('max-width', '85%');        // but allow larger widths
97553
97554                         resizer.classed('dragging', true);
97555                     })
97556                     .on('drag', function() {
97557                         var isRTL = (textDirection === 'rtl');
97558                         var scaleX = isRTL ? 0 : 1;
97559                         var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97560
97561                         var x = event.x - dragOffset;
97562                         sidebarWidth = isRTL ? containerWidth - x : x;
97563
97564                         var isCollapsed = selection.classed('collapsed');
97565                         var shouldCollapse = sidebarWidth < minWidth;
97566
97567                         selection.classed('collapsed', shouldCollapse);
97568
97569                         if (shouldCollapse) {
97570                             if (!isCollapsed) {
97571                                 selection
97572                                     .style(xMarginProperty, '-400px')
97573                                     .style('width', '400px');
97574
97575                                 context.ui().onResize([(sidebarWidth - event.dx) * scaleX, 0]);
97576                             }
97577
97578                         } else {
97579                             var widthPct = (sidebarWidth / containerWidth) * 100;
97580                             selection
97581                                 .style(xMarginProperty, null)
97582                                 .style('width', widthPct + '%');
97583
97584                             if (isCollapsed) {
97585                                 context.ui().onResize([-sidebarWidth * scaleX, 0]);
97586                             } else {
97587                                 context.ui().onResize([-event.dx * scaleX, 0]);
97588                             }
97589                         }
97590                     })
97591                     .on('end', function() {
97592                         resizer.classed('dragging', false);
97593                     })
97594                 );
97595
97596                 var featureListWrap = selection
97597                     .append('div')
97598                     .attr('class', 'feature-list-pane')
97599                     .call(uiFeatureList(context));
97600
97601                 var inspectorWrap = selection
97602                     .append('div')
97603                     .attr('class', 'inspector-hidden inspector-wrap fr');
97604
97605
97606                 function hover(datum) {
97607                     if (datum && datum.__featurehash__) {   // hovering on data
97608                         _wasData = true;
97609                         sidebar
97610                             .show(dataEditor.datum(datum));
97611
97612                         selection.selectAll('.sidebar-component')
97613                             .classed('inspector-hover', true);
97614
97615                     } else if (datum instanceof osmNote) {
97616                         if (context.mode().id === 'drag-note') return;
97617                         _wasNote = true;
97618
97619                         var osm = services$1.osm;
97620                         if (osm) {
97621                             datum = osm.getNote(datum.id);   // marker may contain stale data - get latest
97622                         }
97623
97624                         sidebar
97625                             .show(noteEditor.note(datum));
97626
97627                         selection.selectAll('.sidebar-component')
97628                             .classed('inspector-hover', true);
97629
97630                     } else if (datum instanceof qaError) {
97631                         _wasQAError = true;
97632
97633                         var errService = services$1[datum.service];
97634                         if (errService) {
97635                             // marker may contain stale data - get latest
97636                             datum = errService.getError(datum.id);
97637                         }
97638
97639                         // Temporary solution while only two services
97640                         var errEditor = (datum.service === 'keepRight') ? keepRightEditor : improveOsmEditor;
97641
97642                         d3_selectAll('.qa_error.' + datum.service)
97643                             .classed('hover', function(d) { return d.id === datum.id; });
97644
97645                         sidebar
97646                             .show(errEditor.error(datum));
97647
97648                         selection.selectAll('.sidebar-component')
97649                             .classed('inspector-hover', true);
97650
97651                     } else if (!_current && (datum instanceof osmEntity)) {
97652                         featureListWrap
97653                             .classed('inspector-hidden', true);
97654
97655                         inspectorWrap
97656                             .classed('inspector-hidden', false)
97657                             .classed('inspector-hover', true);
97658
97659                         if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
97660                             inspector
97661                                 .state('hover')
97662                                 .entityID(datum.id);
97663
97664                             inspectorWrap
97665                                 .call(inspector);
97666                         }
97667
97668                     } else if (!_current) {
97669                         featureListWrap
97670                             .classed('inspector-hidden', false);
97671                         inspectorWrap
97672                             .classed('inspector-hidden', true);
97673                         inspector
97674                             .state('hide');
97675
97676                     } else if (_wasData || _wasNote || _wasQAError) {
97677                         _wasNote = false;
97678                         _wasData = false;
97679                         _wasQAError = false;
97680                         d3_selectAll('.note').classed('hover', false);
97681                         d3_selectAll('.qa_error').classed('hover', false);
97682                         sidebar.hide();
97683                     }
97684                 }
97685
97686                 sidebar.hover = throttle(hover, 200);
97687
97688
97689                 sidebar.intersects = function(extent) {
97690                     var rect = selection.node().getBoundingClientRect();
97691                     return extent.intersects([
97692                         context.projection.invert([0, rect.height]),
97693                         context.projection.invert([rect.width, 0])
97694                     ]);
97695                 };
97696
97697
97698                 sidebar.select = function(id, newFeature) {
97699                     sidebar.hide();
97700
97701                     if (id) {
97702                         var entity = context.entity(id);
97703                         // uncollapse the sidebar
97704                         if (selection.classed('collapsed')) {
97705                             if (newFeature) {
97706                                 var extent = entity.extent(context.graph());
97707                                 sidebar.expand(sidebar.intersects(extent));
97708                             }
97709                         }
97710
97711                         featureListWrap
97712                             .classed('inspector-hidden', true);
97713
97714                         inspectorWrap
97715                             .classed('inspector-hidden', false)
97716                             .classed('inspector-hover', false);
97717
97718                         if (inspector.entityID() !== id || inspector.state() !== 'select') {
97719                             inspector
97720                                 .state('select')
97721                                 .entityID(id)
97722                                 .newFeature(newFeature);
97723
97724                             inspectorWrap
97725                                 .call(inspector, newFeature);
97726                         }
97727
97728                         sidebar.showPresetList = function() {
97729                             inspector.showList(context.presets().match(entity, context.graph()));
97730                         };
97731
97732                     } else {
97733                         inspector
97734                             .state('hide');
97735                     }
97736                 };
97737
97738
97739                 sidebar.show = function(component, element) {
97740                     featureListWrap
97741                         .classed('inspector-hidden', true);
97742                     inspectorWrap
97743                         .classed('inspector-hidden', true);
97744
97745                     if (_current) _current.remove();
97746                     _current = selection
97747                         .append('div')
97748                         .attr('class', 'sidebar-component')
97749                         .call(component, element);
97750                 };
97751
97752
97753                 sidebar.hide = function() {
97754                     featureListWrap
97755                         .classed('inspector-hidden', false);
97756                     inspectorWrap
97757                         .classed('inspector-hidden', true);
97758
97759                     if (_current) _current.remove();
97760                     _current = null;
97761                 };
97762
97763
97764                 sidebar.expand = function(moveMap) {
97765                     if (selection.classed('collapsed')) {
97766                         sidebar.toggle(moveMap);
97767                     }
97768                 };
97769
97770
97771                 sidebar.collapse = function(moveMap) {
97772                     if (!selection.classed('collapsed')) {
97773                         sidebar.toggle(moveMap);
97774                     }
97775                 };
97776
97777
97778                 sidebar.toggle = function(moveMap) {
97779                     var e = event;
97780                     if (e && e.sourceEvent) {
97781                         e.sourceEvent.preventDefault();
97782                     } else if (e) {
97783                         e.preventDefault();
97784                     }
97785
97786                     // Don't allow sidebar to toggle when the user is in the walkthrough.
97787                     if (context.inIntro()) return;
97788
97789                     var isCollapsed = selection.classed('collapsed');
97790                     var isCollapsing = !isCollapsed;
97791                     var isRTL = (textDirection === 'rtl');
97792                     var scaleX = isRTL ? 0 : 1;
97793                     var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
97794
97795                     sidebarWidth = selection.node().getBoundingClientRect().width;
97796
97797                     // switch from % to px
97798                     selection.style('width', sidebarWidth + 'px');
97799
97800                     var startMargin, endMargin, lastMargin;
97801                     if (isCollapsing) {
97802                         startMargin = lastMargin = 0;
97803                         endMargin = -sidebarWidth;
97804                     } else {
97805                         startMargin = lastMargin = -sidebarWidth;
97806                         endMargin = 0;
97807                     }
97808
97809                     selection.transition()
97810                         .style(xMarginProperty, endMargin + 'px')
97811                         .tween('panner', function() {
97812                             var i = d3_interpolateNumber(startMargin, endMargin);
97813                             return function(t) {
97814                                 var dx = lastMargin - Math.round(i(t));
97815                                 lastMargin = lastMargin - dx;
97816                                 context.ui().onResize(moveMap ? undefined : [dx * scaleX, 0]);
97817                             };
97818                         })
97819                         .on('end', function() {
97820                             selection.classed('collapsed', isCollapsing);
97821
97822                             // switch back from px to %
97823                             if (!isCollapsing) {
97824                                 var containerWidth = container.node().getBoundingClientRect().width;
97825                                 var widthPct = (sidebarWidth / containerWidth) * 100;
97826                                 selection
97827                                     .style(xMarginProperty, null)
97828                                     .style('width', widthPct + '%');
97829                             }
97830                         });
97831                 };
97832
97833                 // toggle the sidebar collapse when double-clicking the resizer
97834                 resizer.on('dblclick', sidebar.toggle);
97835             }
97836
97837             sidebar.showPresetList = function() {};
97838             sidebar.hover = function() {};
97839             sidebar.hover.cancel = function() {};
97840             sidebar.intersects = function() {};
97841             sidebar.select = function() {};
97842             sidebar.show = function() {};
97843             sidebar.hide = function() {};
97844             sidebar.expand = function() {};
97845             sidebar.collapse = function() {};
97846             sidebar.toggle = function() {};
97847
97848             return sidebar;
97849         }
97850
97851         function uiSpinner(context) {
97852             var osm = context.connection();
97853
97854
97855             return function(selection) {
97856                 var img = selection
97857                     .append('img')
97858                     .attr('src', context.imagePath('loader-black.gif'))
97859                     .style('opacity', 0);
97860
97861                 if (osm) {
97862                     osm
97863                         .on('loading.spinner', function() {
97864                             img.transition()
97865                                 .style('opacity', 1);
97866                         })
97867                         .on('loaded.spinner', function() {
97868                             img.transition()
97869                                 .style('opacity', 0);
97870                         });
97871                 }
97872             };
97873         }
97874
97875         function uiSplash(context) {
97876
97877             return function(selection) {
97878                 if (context.storage('sawSplash'))
97879                      return;
97880
97881                 context.storage('sawSplash', true);
97882
97883                 var modalSelection = uiModal(selection);
97884
97885                 modalSelection.select('.modal')
97886                     .attr('class', 'modal-splash modal');
97887
97888                 var introModal = modalSelection.select('.content')
97889                     .append('div')
97890                     .attr('class', 'fillL');
97891
97892                 introModal
97893                     .append('div')
97894                     .attr('class','modal-section')
97895                     .append('h3').text(t('splash.welcome'));
97896
97897                 introModal
97898                     .append('div')
97899                     .attr('class','modal-section')
97900                     .append('p')
97901                     .html(t('splash.text', {
97902                         version: context.version,
97903                         website: '<a href="http://ideditor.com/">ideditor.com</a>',
97904                         github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
97905                     }));
97906
97907                 var buttonWrap = introModal
97908                     .append('div')
97909                     .attr('class', 'modal-actions');
97910
97911                 var walkthrough = buttonWrap
97912                     .append('button')
97913                     .attr('class', 'walkthrough')
97914                     .on('click', function() {
97915                         context.container().call(uiIntro(context));
97916                         modalSelection.close();
97917                     });
97918
97919                 walkthrough
97920                     .append('svg')
97921                     .attr('class', 'logo logo-walkthrough')
97922                     .append('use')
97923                     .attr('xlink:href', '#iD-logo-walkthrough');
97924
97925                 walkthrough
97926                     .append('div')
97927                     .text(t('splash.walkthrough'));
97928
97929                 var startEditing = buttonWrap
97930                     .append('button')
97931                     .attr('class', 'start-editing')
97932                     .on('click', modalSelection.close);
97933
97934                 startEditing
97935                     .append('svg')
97936                     .attr('class', 'logo logo-features')
97937                     .append('use')
97938                     .attr('xlink:href', '#iD-logo-features');
97939
97940                 startEditing
97941                     .append('div')
97942                     .text(t('splash.start'));
97943
97944
97945                 modalSelection.select('button.close')
97946                     .attr('class','hide');
97947
97948             };
97949         }
97950
97951         function uiStatus(context) {
97952             var osm = context.connection();
97953
97954
97955             return function(selection) {
97956                 if (!osm) return;
97957
97958                 function update() {
97959                     osm.status(function(err, apiStatus) {
97960                         selection.html('');
97961
97962                         if (err) {
97963                             if (apiStatus === 'connectionSwitched') {
97964                                 // if the connection was just switched, we can't rely on
97965                                 // the status (we're getting the status of the previous api)
97966                                 return;
97967
97968                             } else if (apiStatus === 'rateLimited') {
97969                                 selection
97970                                     .text(t('status.rateLimit'))
97971                                     .append('a')
97972                                     .attr('class', 'api-status-login')
97973                                     .attr('target', '_blank')
97974                                     .call(svgIcon('#iD-icon-out-link', 'inline'))
97975                                     .append('span')
97976                                     .text(t('login'))
97977                                     .on('click.login', function() {
97978                                         event.preventDefault();
97979                                         osm.authenticate();
97980                                     });
97981                             } else {
97982                                 // eslint-disable-next-line no-warning-comments
97983                                 // TODO: nice messages for different error types
97984                                 selection.text(t('status.error'));
97985                             }
97986
97987                         } else if (apiStatus === 'readonly') {
97988                             selection.text(t('status.readonly'));
97989                         } else if (apiStatus === 'offline') {
97990                             selection.text(t('status.offline'));
97991                         }
97992
97993                         selection.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
97994                     });
97995                 }
97996
97997                 osm.on('change', function() { update(selection); });
97998
97999                 window.setInterval(update, 90000);
98000                 update(selection);
98001             };
98002         }
98003
98004         function modeDrawArea(context, wayID, startGraph, baselineGraph, button) {
98005             var mode = {
98006                 button: button,
98007                 id: 'draw-area'
98008             };
98009
98010             var behavior;
98011
98012             mode.wayID = wayID;
98013
98014             mode.enter = function() {
98015                 var way = context.entity(wayID);
98016
98017                 behavior = behaviorDrawWay(context, wayID, undefined, mode, startGraph, baselineGraph)
98018                     .tail(t('modes.draw_area.tail'));
98019
98020                 var addNode = behavior.addNode;
98021
98022                 behavior.addNode = function(node, d) {
98023                     var length = way.nodes.length;
98024                     var penultimate = length > 2 ? way.nodes[length - 2] : null;
98025
98026                     if (node.id === way.first() || node.id === penultimate) {
98027                         behavior.finish();
98028                     } else {
98029                         addNode(node, d);
98030                     }
98031                 };
98032
98033                 context.install(behavior);
98034             };
98035
98036
98037             mode.exit = function() {
98038                 context.uninstall(behavior);
98039             };
98040
98041
98042             mode.selectedIDs = function() {
98043                 return [wayID];
98044             };
98045
98046
98047             mode.activeID = function() {
98048                 return (behavior && behavior.activeID()) || [];
98049             };
98050
98051
98052             return mode;
98053         }
98054
98055         function modeAddArea(context, mode) {
98056             mode.id = 'add-area';
98057
98058             var behavior = behaviorAddWay(context)
98059                 .tail(t('modes.add_area.tail'))
98060                 .on('start', start)
98061                 .on('startFromWay', startFromWay)
98062                 .on('startFromNode', startFromNode);
98063
98064             var defaultTags = { area: 'yes' };
98065             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'area');
98066
98067
98068             function actionClose(wayId) {
98069                 return function (graph) {
98070                     return graph.replace(graph.entity(wayId).close());
98071                 };
98072             }
98073
98074
98075             function start(loc) {
98076                 var startGraph = context.graph();
98077                 var node = osmNode({ loc: loc });
98078                 var way = osmWay({ tags: defaultTags });
98079
98080                 context.perform(
98081                     actionAddEntity(node),
98082                     actionAddEntity(way),
98083                     actionAddVertex(way.id, node.id),
98084                     actionClose(way.id)
98085                 );
98086
98087                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98088             }
98089
98090
98091             function startFromWay(loc, edge) {
98092                 var startGraph = context.graph();
98093                 var node = osmNode({ loc: loc });
98094                 var way = osmWay({ tags: defaultTags });
98095
98096                 context.perform(
98097                     actionAddEntity(node),
98098                     actionAddEntity(way),
98099                     actionAddVertex(way.id, node.id),
98100                     actionClose(way.id),
98101                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98102                 );
98103
98104                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98105             }
98106
98107
98108             function startFromNode(node) {
98109                 var startGraph = context.graph();
98110                 var way = osmWay({ tags: defaultTags });
98111
98112                 context.perform(
98113                     actionAddEntity(way),
98114                     actionAddVertex(way.id, node.id),
98115                     actionClose(way.id)
98116                 );
98117
98118                 context.enter(modeDrawArea(context, way.id, startGraph, context.graph(), mode.button));
98119             }
98120
98121
98122             mode.enter = function() {
98123                 context.install(behavior);
98124             };
98125
98126
98127             mode.exit = function() {
98128                 context.uninstall(behavior);
98129             };
98130
98131
98132             return mode;
98133         }
98134
98135         function modeAddLine(context, mode) {
98136             mode.id = 'add-line';
98137
98138             var behavior = behaviorAddWay(context)
98139                 .tail(t('modes.add_line.tail'))
98140                 .on('start', start)
98141                 .on('startFromWay', startFromWay)
98142                 .on('startFromNode', startFromNode);
98143
98144             var defaultTags = {};
98145             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'line');
98146
98147
98148             function start(loc) {
98149                 var startGraph = context.graph();
98150                 var node = osmNode({ loc: loc });
98151                 var way = osmWay({ tags: defaultTags });
98152
98153                 context.perform(
98154                     actionAddEntity(node),
98155                     actionAddEntity(way),
98156                     actionAddVertex(way.id, node.id)
98157                 );
98158
98159                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98160             }
98161
98162
98163             function startFromWay(loc, edge) {
98164                 var startGraph = context.graph();
98165                 var node = osmNode({ loc: loc });
98166                 var way = osmWay({ tags: defaultTags });
98167
98168                 context.perform(
98169                     actionAddEntity(node),
98170                     actionAddEntity(way),
98171                     actionAddVertex(way.id, node.id),
98172                     actionAddMidpoint({ loc: loc, edge: edge }, node)
98173                 );
98174
98175                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98176             }
98177
98178
98179             function startFromNode(node) {
98180                 var startGraph = context.graph();
98181                 var way = osmWay({ tags: defaultTags });
98182
98183                 context.perform(
98184                     actionAddEntity(way),
98185                     actionAddVertex(way.id, node.id)
98186                 );
98187
98188                 context.enter(modeDrawLine(context, way.id, startGraph, context.graph(), mode.button));
98189             }
98190
98191
98192             mode.enter = function() {
98193                 context.install(behavior);
98194             };
98195
98196
98197             mode.exit = function() {
98198                 context.uninstall(behavior);
98199             };
98200
98201             return mode;
98202         }
98203
98204         function modeAddPoint(context, mode) {
98205
98206             mode.id = 'add-point';
98207
98208             var behavior = behaviorDraw(context)
98209                 .tail(t('modes.add_point.tail'))
98210                 .on('click', add)
98211                 .on('clickWay', addWay)
98212                 .on('clickNode', addNode)
98213                 .on('cancel', cancel)
98214                 .on('finish', cancel);
98215
98216             var defaultTags = {};
98217             if (mode.preset) defaultTags = mode.preset.setTags(defaultTags, 'point');
98218
98219
98220             function add(loc) {
98221                 var node = osmNode({ loc: loc, tags: defaultTags });
98222
98223                 context.perform(
98224                     actionAddEntity(node),
98225                     t('operations.add.annotation.point')
98226                 );
98227
98228                 enterSelectMode(node);
98229             }
98230
98231
98232             function addWay(loc, edge) {
98233                 var node = osmNode({ tags: defaultTags });
98234
98235                 context.perform(
98236                     actionAddMidpoint({loc: loc, edge: edge}, node),
98237                     t('operations.add.annotation.vertex')
98238                 );
98239
98240                 enterSelectMode(node);
98241             }
98242
98243             function enterSelectMode(node) {
98244                 context.enter(
98245                     modeSelect(context, [node.id]).newFeature(true)
98246                 );
98247             }
98248
98249
98250             function addNode(node) {
98251                 if (Object.keys(defaultTags).length === 0) {
98252                     enterSelectMode(node);
98253                     return;
98254                 }
98255
98256                 var tags = Object.assign({}, node.tags);  // shallow copy
98257                 for (var key in defaultTags) {
98258                     tags[key] = defaultTags[key];
98259                 }
98260
98261                 context.perform(
98262                     actionChangeTags(node.id, tags),
98263                     t('operations.add.annotation.point')
98264                 );
98265
98266                 enterSelectMode(node);
98267             }
98268
98269
98270             function cancel() {
98271                 context.enter(modeBrowse(context));
98272             }
98273
98274
98275             mode.enter = function() {
98276                 context.install(behavior);
98277             };
98278
98279
98280             mode.exit = function() {
98281                 context.uninstall(behavior);
98282             };
98283
98284
98285             return mode;
98286         }
98287
98288         function modeAddNote(context) {
98289             var mode = {
98290                 id: 'add-note',
98291                 button: 'note',
98292                 title: t('modes.add_note.title'),
98293                 description: t('modes.add_note.description'),
98294                 key: t('modes.add_note.key')
98295             };
98296
98297             var behavior = behaviorDraw(context)
98298                 .tail(t('modes.add_note.tail'))
98299                 .on('click', add)
98300                 .on('cancel', cancel)
98301                 .on('finish', cancel);
98302
98303
98304             function add(loc) {
98305                 var osm = services$1.osm;
98306                 if (!osm) return;
98307
98308                 var note = osmNote({ loc: loc, status: 'open', comments: [] });
98309                 osm.replaceNote(note);
98310
98311                 // force a reraw (there is no history change that would otherwise do this)
98312                 context.pan([0,0]);
98313
98314                 context
98315                     .selectedNoteID(note.id)
98316                     .enter(modeSelectNote(context, note.id).newFeature(true));
98317             }
98318
98319
98320             function cancel() {
98321                 context.enter(modeBrowse(context));
98322             }
98323
98324
98325             mode.enter = function() {
98326                 context.install(behavior);
98327             };
98328
98329
98330             mode.exit = function() {
98331                 context.uninstall(behavior);
98332             };
98333
98334
98335             return mode;
98336         }
98337
98338         function uiConflicts(context) {
98339             var dispatch$1 = dispatch('cancel', 'save');
98340             var keybinding = utilKeybinding('conflicts');
98341             var _origChanges;
98342             var _conflictList;
98343
98344
98345             function keybindingOn() {
98346                 d3_select(document)
98347                     .call(keybinding.on('⎋', cancel, true));
98348             }
98349
98350             function keybindingOff() {
98351                 d3_select(document)
98352                     .call(keybinding.unbind);
98353             }
98354
98355             function tryAgain() {
98356                 keybindingOff();
98357                 dispatch$1.call('save');
98358             }
98359
98360             function cancel() {
98361                 keybindingOff();
98362                 dispatch$1.call('cancel');
98363             }
98364
98365
98366             function conflicts(selection) {
98367                 keybindingOn();
98368
98369                 var headerEnter = selection.selectAll('.header')
98370                     .data([0])
98371                     .enter()
98372                     .append('div')
98373                     .attr('class', 'header fillL');
98374
98375                 headerEnter
98376                     .append('button')
98377                     .attr('class', 'fr')
98378                     .on('click', cancel)
98379                     .call(svgIcon('#iD-icon-close'));
98380
98381                 headerEnter
98382                     .append('h3')
98383                     .text(t('save.conflict.header'));
98384
98385                 var bodyEnter = selection.selectAll('.body')
98386                     .data([0])
98387                     .enter()
98388                     .append('div')
98389                     .attr('class', 'body fillL');
98390
98391                 var conflictsHelpEnter = bodyEnter
98392                     .append('div')
98393                     .attr('class', 'conflicts-help')
98394                     .text(t('save.conflict.help'));
98395
98396
98397                 // Download changes link
98398                 var detected = utilDetect();
98399                 var changeset = new osmChangeset();
98400
98401                 delete changeset.id;  // Export without changeset_id
98402
98403                 var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
98404                 var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
98405                 var fileName = 'changes.osc';
98406
98407                 var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
98408                     .append('a')
98409                     .attr('class', 'download-changes');
98410
98411                 if (detected.download) {      // All except IE11 and Edge
98412                     linkEnter                 // download the data as a file
98413                         .attr('href', window.URL.createObjectURL(blob))
98414                         .attr('download', fileName);
98415
98416                 } else {                      // IE11 and Edge
98417                     linkEnter                 // open data uri in a new tab
98418                         .attr('target', '_blank')
98419                         .on('click.download', function() {
98420                             navigator.msSaveBlob(blob, fileName);
98421                         });
98422                 }
98423
98424                 linkEnter
98425                     .call(svgIcon('#iD-icon-load', 'inline'))
98426                     .append('span')
98427                     .text(t('save.conflict.download_changes'));
98428
98429
98430                 bodyEnter
98431                     .append('div')
98432                     .attr('class', 'conflict-container fillL3')
98433                     .call(showConflict, 0);
98434
98435                 bodyEnter
98436                     .append('div')
98437                     .attr('class', 'conflicts-done')
98438                     .attr('opacity', 0)
98439                     .style('display', 'none')
98440                     .text(t('save.conflict.done'));
98441
98442                 var buttonsEnter = bodyEnter
98443                     .append('div')
98444                     .attr('class','buttons col12 joined conflicts-buttons');
98445
98446                 buttonsEnter
98447                     .append('button')
98448                     .attr('disabled', _conflictList.length > 1)
98449                     .attr('class', 'action conflicts-button col6')
98450                     .text(t('save.title'))
98451                     .on('click.try_again', tryAgain);
98452
98453                 buttonsEnter
98454                     .append('button')
98455                     .attr('class', 'secondary-action conflicts-button col6')
98456                     .text(t('confirm.cancel'))
98457                     .on('click.cancel', cancel);
98458             }
98459
98460
98461             function showConflict(selection, index) {
98462                 index = utilWrap(index, _conflictList.length);
98463
98464                 var parent = d3_select(selection.node().parentNode);
98465
98466                 // enable save button if this is the last conflict being reviewed..
98467                 if (index === _conflictList.length - 1) {
98468                     window.setTimeout(function() {
98469                         parent.select('.conflicts-button')
98470                             .attr('disabled', null);
98471
98472                         parent.select('.conflicts-done')
98473                             .transition()
98474                             .attr('opacity', 1)
98475                             .style('display', 'block');
98476                     }, 250);
98477                 }
98478
98479                 var conflict = selection
98480                     .selectAll('.conflict')
98481                     .data([_conflictList[index]]);
98482
98483                 conflict.exit()
98484                     .remove();
98485
98486                 var conflictEnter = conflict.enter()
98487                     .append('div')
98488                     .attr('class', 'conflict');
98489
98490                 conflictEnter
98491                     .append('h4')
98492                     .attr('class', 'conflict-count')
98493                     .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
98494
98495                 conflictEnter
98496                     .append('a')
98497                     .attr('class', 'conflict-description')
98498                     .attr('href', '#')
98499                     .text(function(d) { return d.name; })
98500                     .on('click', function(d) {
98501                         event.preventDefault();
98502                         zoomToEntity(d.id);
98503                     });
98504
98505                 var details = conflictEnter
98506                     .append('div')
98507                     .attr('class', 'conflict-detail-container');
98508
98509                 details
98510                     .append('ul')
98511                     .attr('class', 'conflict-detail-list')
98512                     .selectAll('li')
98513                     .data(function(d) { return d.details || []; })
98514                     .enter()
98515                     .append('li')
98516                     .attr('class', 'conflict-detail-item')
98517                     .html(function(d) { return d; });
98518
98519                 details
98520                     .append('div')
98521                     .attr('class', 'conflict-choices')
98522                     .call(addChoices);
98523
98524                 details
98525                     .append('div')
98526                     .attr('class', 'conflict-nav-buttons joined cf')
98527                     .selectAll('button')
98528                     .data(['previous', 'next'])
98529                     .enter()
98530                     .append('button')
98531                     .text(function(d) { return t('save.conflict.' + d); })
98532                     .attr('class', 'conflict-nav-button action col6')
98533                     .attr('disabled', function(d, i) {
98534                         return (i === 0 && index === 0) ||
98535                             (i === 1 && index === _conflictList.length - 1) || null;
98536                     })
98537                     .on('click', function(d, i) {
98538                         event.preventDefault();
98539
98540                         var container = parent.selectAll('.conflict-container');
98541                         var sign = (i === 0 ? -1 : 1);
98542
98543                         container
98544                             .selectAll('.conflict')
98545                             .remove();
98546
98547                         container
98548                             .call(showConflict, index + sign);
98549                     });
98550
98551             }
98552
98553
98554             function addChoices(selection) {
98555                 var choices = selection
98556                     .append('ul')
98557                     .attr('class', 'layer-list')
98558                     .selectAll('li')
98559                     .data(function(d) { return d.choices || []; });
98560
98561                 // enter
98562                 var choicesEnter = choices.enter()
98563                     .append('li')
98564                     .attr('class', 'layer');
98565
98566                 var labelEnter = choicesEnter
98567                     .append('label');
98568
98569                 labelEnter
98570                     .append('input')
98571                     .attr('type', 'radio')
98572                     .attr('name', function(d) { return d.id; })
98573                     .on('change', function(d, i) {
98574                         var ul = this.parentNode.parentNode.parentNode;
98575                         ul.__data__.chosen = i;
98576                         choose(ul, d);
98577                     });
98578
98579                 labelEnter
98580                     .append('span')
98581                     .text(function(d) { return d.text; });
98582
98583                 // update
98584                 choicesEnter
98585                     .merge(choices)
98586                     .each(function(d, i) {
98587                         var ul = this.parentNode;
98588                         if (ul.__data__.chosen === i) {
98589                             choose(ul, d);
98590                         }
98591                     });
98592             }
98593
98594
98595             function choose(ul, datum) {
98596                 if (event) event.preventDefault();
98597
98598                 d3_select(ul)
98599                     .selectAll('li')
98600                     .classed('active', function(d) { return d === datum; })
98601                     .selectAll('input')
98602                     .property('checked', function(d) { return d === datum; });
98603
98604                 var extent = geoExtent();
98605                 var entity;
98606
98607                 entity = context.graph().hasEntity(datum.id);
98608                 if (entity) extent._extend(entity.extent(context.graph()));
98609
98610                 datum.action();
98611
98612                 entity = context.graph().hasEntity(datum.id);
98613                 if (entity) extent._extend(entity.extent(context.graph()));
98614
98615                 zoomToEntity(datum.id, extent);
98616             }
98617
98618
98619             function zoomToEntity(id, extent) {
98620                 context.surface().selectAll('.hover')
98621                     .classed('hover', false);
98622
98623                 var entity = context.graph().hasEntity(id);
98624                 if (entity) {
98625                     if (extent) {
98626                         context.map().trimmedExtent(extent);
98627                     } else {
98628                         context.map().zoomToEase(entity);
98629                     }
98630                     context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
98631                         .classed('hover', true);
98632                 }
98633             }
98634
98635
98636             // The conflict list should be an array of objects like:
98637             // {
98638             //     id: id,
98639             //     name: entityName(local),
98640             //     details: merge.conflicts(),
98641             //     chosen: 1,
98642             //     choices: [
98643             //         choice(id, keepMine, forceLocal),
98644             //         choice(id, keepTheirs, forceRemote)
98645             //     ]
98646             // }
98647             conflicts.conflictList = function(_) {
98648                 if (!arguments.length) return _conflictList;
98649                 _conflictList = _;
98650                 return conflicts;
98651             };
98652
98653
98654             conflicts.origChanges = function(_) {
98655                 if (!arguments.length) return _origChanges;
98656                 _origChanges = _;
98657                 return conflicts;
98658             };
98659
98660
98661             return utilRebind(conflicts, dispatch$1, 'on');
98662         }
98663
98664         function uiChangesetEditor(context) {
98665             var dispatch$1 = dispatch('change');
98666             var formFields = uiFormFields(context);
98667             var commentCombo = uiCombobox(context, 'comment').caseSensitive(true);
98668             var _fieldsArr;
98669             var _tags;
98670             var _changesetID;
98671
98672
98673             function changesetEditor(selection) {
98674                 render(selection);
98675             }
98676
98677
98678             function render(selection) {
98679                 var initial = false;
98680
98681                 if (!_fieldsArr) {
98682                     initial = true;
98683                     var presets = context.presets();
98684
98685                     _fieldsArr = [
98686                         uiField(context, presets.field('comment'), null, { show: true, revert: false }),
98687                         uiField(context, presets.field('source'), null, { show: false, revert: false }),
98688                         uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
98689                     ];
98690
98691                     _fieldsArr.forEach(function(field) {
98692                         field
98693                             .on('change', function(t, onInput) {
98694                                 dispatch$1.call('change', field, t, onInput);
98695                             });
98696                     });
98697                 }
98698
98699                 _fieldsArr.forEach(function(field) {
98700                     field
98701                         .tags(_tags);
98702                 });
98703
98704
98705                 selection
98706                     .call(formFields.fieldsArr(_fieldsArr));
98707
98708
98709                 if (initial) {
98710                     var commentField = selection.select('#preset-input-comment');
98711                     var commentNode = commentField.node();
98712
98713                     if (commentNode) {
98714                         commentNode.focus();
98715                         commentNode.select();
98716                     }
98717
98718                     // trigger a 'blur' event so that comment field can be cleaned
98719                     // and checked for hashtags, even if retrieved from localstorage
98720                     utilTriggerEvent(commentField, 'blur');
98721
98722                     var osm = context.connection();
98723                     if (osm) {
98724                         osm.userChangesets(function (err, changesets) {
98725                             if (err) return;
98726
98727                             var comments = changesets.map(function(changeset) {
98728                                 var comment = changeset.tags.comment;
98729                                 return comment ? { title: comment, value: comment } : null;
98730                             }).filter(Boolean);
98731
98732                             commentField
98733                                 .call(commentCombo
98734                                     .data(utilArrayUniqBy(comments, 'title'))
98735                                 );
98736                         });
98737                     }
98738                 }
98739
98740                 // Add warning if comment mentions Google
98741                 var hasGoogle = _tags.comment.match(/google/i);
98742                 var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
98743                     .data(hasGoogle ? [0] : []);
98744
98745                 commentWarning.exit()
98746                     .transition()
98747                     .duration(200)
98748                     .style('opacity', 0)
98749                     .remove();
98750
98751                 var commentEnter = commentWarning.enter()
98752                     .insert('div', '.tag-reference-body')
98753                     .attr('class', 'field-warning comment-warning')
98754                     .style('opacity', 0);
98755
98756                 commentEnter
98757                     .append('a')
98758                     .attr('target', '_blank')
98759                     .attr('tabindex', -1)
98760                     .call(svgIcon('#iD-icon-alert', 'inline'))
98761                     .attr('href', t('commit.google_warning_link'))
98762                     .append('span')
98763                     .text(t('commit.google_warning'));
98764
98765                 commentEnter
98766                     .transition()
98767                     .duration(200)
98768                     .style('opacity', 1);
98769             }
98770
98771
98772             changesetEditor.tags = function(_) {
98773                 if (!arguments.length) return _tags;
98774                 _tags = _;
98775                 // Don't reset _fieldsArr here.
98776                 return changesetEditor;
98777             };
98778
98779
98780             changesetEditor.changesetID = function(_) {
98781                 if (!arguments.length) return _changesetID;
98782                 if (_changesetID === _) return changesetEditor;
98783                 _changesetID = _;
98784                 _fieldsArr = null;
98785                 return changesetEditor;
98786             };
98787
98788
98789             return utilRebind(changesetEditor, dispatch$1, 'on');
98790         }
98791
98792         function uiCommitChanges(context) {
98793             var detected = utilDetect();
98794             var _entityID;
98795
98796
98797             function commitChanges(selection) {
98798                 var history = context.history();
98799                 var summary = history.difference().summary();
98800
98801                 var container = selection.selectAll('.modal-section.commit-section')
98802                     .data([0]);
98803
98804                 var containerEnter = container.enter()
98805                     .append('div')
98806                     .attr('class', 'commit-section modal-section fillL2');
98807
98808                 containerEnter
98809                     .append('h3')
98810                     .text(t('commit.changes', { count: summary.length }));
98811
98812                 containerEnter
98813                     .append('ul')
98814                     .attr('class', 'changeset-list');
98815
98816                 container = containerEnter
98817                     .merge(container);
98818
98819
98820                 var items = container.select('ul').selectAll('li')
98821                     .data(summary);
98822
98823                 var itemsEnter = items.enter()
98824                     .append('li')
98825                     .attr('class', 'change-item');
98826
98827                 itemsEnter
98828                     .each(function(d) {
98829                         d3_select(this)
98830                             .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
98831                     });
98832
98833                 itemsEnter
98834                     .append('span')
98835                     .attr('class', 'change-type')
98836                     .text(function(d) { return t('commit.' + d.changeType) + ' '; });
98837
98838                 itemsEnter
98839                     .append('strong')
98840                     .attr('class', 'entity-type')
98841                     .text(function(d) {
98842                         var matched = context.presets().match(d.entity, d.graph);
98843                         return (matched && matched.name()) || utilDisplayType(d.entity.id);
98844                     });
98845
98846                 itemsEnter
98847                     .append('span')
98848                     .attr('class', 'entity-name')
98849                     .text(function(d) {
98850                         var name = utilDisplayName(d.entity) || '',
98851                             string = '';
98852                         if (name !== '') {
98853                             string += ':';
98854                         }
98855                         return string += ' ' + name;
98856                     });
98857
98858                 itemsEnter
98859                     .style('opacity', 0)
98860                     .transition()
98861                     .style('opacity', 1);
98862
98863                 items = itemsEnter
98864                     .merge(items);
98865
98866                 items
98867                     .on('mouseover', mouseover)
98868                     .on('mouseout', mouseout)
98869                     .on('click', click);
98870
98871
98872                 // Download changeset link
98873                 var changeset = new osmChangeset().update({ id: undefined });
98874                 var changes = history.changes(actionDiscardTags(history.difference()));
98875
98876                 delete changeset.id;  // Export without chnageset_id
98877
98878                 var data = JXON.stringify(changeset.osmChangeJXON(changes));
98879                 var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
98880                 var fileName = 'changes.osc';
98881
98882                 var linkEnter = container.selectAll('.download-changes')
98883                     .data([0])
98884                     .enter()
98885                     .append('a')
98886                     .attr('class', 'download-changes');
98887
98888                 if (detected.download) {      // All except IE11 and Edge
98889                     linkEnter                 // download the data as a file
98890                         .attr('href', window.URL.createObjectURL(blob))
98891                         .attr('download', fileName);
98892
98893                 } else {                      // IE11 and Edge
98894                     linkEnter                 // open data uri in a new tab
98895                         .attr('target', '_blank')
98896                         .on('click.download', function() {
98897                             navigator.msSaveBlob(blob, fileName);
98898                         });
98899                 }
98900
98901                 linkEnter
98902                     .call(svgIcon('#iD-icon-load', 'inline'))
98903                     .append('span')
98904                     .text(t('commit.download_changes'));
98905
98906
98907                 function mouseover(d) {
98908                     if (d.entity) {
98909                         context.surface().selectAll(
98910                             utilEntityOrMemberSelector([d.entity.id], context.graph())
98911                         ).classed('hover', true);
98912                     }
98913                 }
98914
98915
98916                 function mouseout() {
98917                     context.surface().selectAll('.hover')
98918                         .classed('hover', false);
98919                 }
98920
98921
98922                 function click(change) {
98923                     if (change.changeType === 'deleted') {
98924                         _entityID = null;
98925                     } else {
98926                         var entity = change.entity;
98927                         _entityID = change.entity.id;
98928                         context.map().zoomToEase(entity);
98929                         context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
98930                             .classed('hover', true);
98931                     }
98932                 }
98933             }
98934
98935
98936             commitChanges.entityID = function(_) {
98937                 if (!arguments.length) return _entityID;
98938                 _entityID = _;
98939                 return commitChanges;
98940             };
98941
98942
98943             return commitChanges;
98944         }
98945
98946         function uiCommitWarnings(context) {
98947
98948             function commitWarnings(selection) {
98949                 var issuesBySeverity = context.validator()
98950                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeDisabledRules: true });
98951
98952                 for (var severity in issuesBySeverity) {
98953                     var issues = issuesBySeverity[severity];
98954                     var section = severity + '-section';
98955                     var issueItem = severity + '-item';
98956
98957                     var container = selection.selectAll('.' + section)
98958                         .data(issues.length ? [0] : []);
98959
98960                     container.exit()
98961                         .remove();
98962
98963                     var containerEnter = container.enter()
98964                         .append('div')
98965                         .attr('class', 'modal-section ' + section + ' fillL2');
98966
98967                     containerEnter
98968                         .append('h3')
98969                         .text(severity === 'warning' ? t('commit.warnings') : t('commit.errors'));
98970
98971                     containerEnter
98972                         .append('ul')
98973                         .attr('class', 'changeset-list');
98974
98975                     container = containerEnter
98976                         .merge(container);
98977
98978
98979                     var items = container.select('ul').selectAll('li')
98980                         .data(issues, function(d) { return d.id; });
98981
98982                     items.exit()
98983                         .remove();
98984
98985                     var itemsEnter = items.enter()
98986                         .append('li')
98987                         .attr('class', issueItem);
98988
98989                     itemsEnter
98990                         .call(svgIcon('#iD-icon-alert', 'pre-text'));
98991
98992                     itemsEnter
98993                         .append('strong')
98994                         .attr('class', 'issue-message');
98995
98996                     itemsEnter.filter(function(d) { return d.tooltip; })
98997                         .call(tooltip()
98998                             .title(function(d) { return d.tooltip; })
98999                             .placement('top')
99000                         );
99001
99002                     items = itemsEnter
99003                         .merge(items);
99004
99005                     items.selectAll('.issue-message')
99006                         .text(function(d) {
99007                             return d.message();
99008                         });
99009
99010                     items
99011                         .on('mouseover', function(d) {
99012                             if (d.entityIds) {
99013                                 context.surface().selectAll(
99014                                     utilEntityOrMemberSelector(
99015                                         d.entityIds,
99016                                         context.graph()
99017                                     )
99018                                 ).classed('hover', true);
99019                             }
99020                         })
99021                         .on('mouseout', function() {
99022                             context.surface().selectAll('.hover')
99023                                 .classed('hover', false);
99024                         })
99025                         .on('click', function(d) {
99026                             context.validator().focusIssue(d);
99027                         });
99028                 }
99029             }
99030
99031
99032             return commitWarnings;
99033         }
99034
99035         var _changeset$1;
99036         var readOnlyTags = [
99037             /^changesets_count$/,
99038             /^created_by$/,
99039             /^ideditor:/,
99040             /^imagery_used$/,
99041             /^host$/,
99042             /^locale$/,
99043             /^warnings:/
99044         ];
99045
99046         // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
99047         // from https://stackoverflow.com/a/25575009
99048         var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
99049
99050
99051         function uiCommit(context) {
99052             var dispatch$1 = dispatch('cancel', 'save');
99053             var _userDetails;
99054             var _selection;
99055
99056             var changesetEditor = uiChangesetEditor(context)
99057                 .on('change', changeTags);
99058             var rawTagEditor = uiRawTagEditor(context)
99059                 .on('change', changeTags);
99060             var commitChanges = uiCommitChanges(context);
99061             var commitWarnings = uiCommitWarnings(context);
99062
99063
99064             function commit(selection) {
99065                 _selection = selection;
99066
99067                 var osm = context.connection();
99068                 if (!osm) return;
99069
99070                 // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
99071                 var commentDate = +context.storage('commentDate') || 0;
99072                 var currDate = Date.now();
99073                 var cutoff = 2 * 86400 * 1000;   // 2 days
99074                 if (commentDate > currDate || currDate - commentDate > cutoff) {
99075                     context.storage('comment', null);
99076                     context.storage('hashtags', null);
99077                     context.storage('source', null);
99078                 }
99079
99080                 var tags;
99081                 // Initialize changeset if one does not exist yet.
99082                 // Also pull values from local storage.
99083                 if (!_changeset$1) {
99084                     var detected = utilDetect();
99085                     tags = {
99086                         comment: context.storage('comment') || '',
99087                         created_by: ('iD ' + context.version).substr(0, 255),
99088                         host: detected.host.substr(0, 255),
99089                         locale: detected.locale.substr(0, 255)
99090                     };
99091
99092                     // call findHashtags initially - this will remove stored
99093                     // hashtags if any hashtags are found in the comment - #4304
99094                     findHashtags(tags, true);
99095
99096                     var hashtags = context.storage('hashtags');
99097                     if (hashtags) {
99098                         tags.hashtags = hashtags;
99099                     }
99100
99101                     var source = context.storage('source');
99102                     if (source) {
99103                         tags.source = source;
99104                     }
99105                     var photoOverlaysUsed = context.history().photoOverlaysUsed();
99106                     if (photoOverlaysUsed.length) {
99107                         var sources = (tags.source || '').split(';');
99108
99109                         // include this tag for any photo layer
99110                         if (sources.indexOf('streetlevel imagery') === -1) {
99111                             sources.push('streetlevel imagery');
99112                         }
99113                         
99114                         // add the photo overlays used during editing as sources
99115                         photoOverlaysUsed.forEach(function(photoOverlay) {
99116                             if (sources.indexOf(photoOverlay) === -1) {
99117                                 sources.push(photoOverlay);
99118                             }
99119                         });
99120
99121                         tags.source = sources.join(';').substr(0, 255);
99122                     }
99123
99124                     _changeset$1 = new osmChangeset({ tags: tags });
99125                 }
99126
99127                 tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99128
99129                 // assign tags for imagery used
99130                 var imageryUsed = context.history().imageryUsed().join(';').substr(0, 255);
99131                 tags.imagery_used = imageryUsed || 'None';
99132
99133                 // assign tags for closed issues and notes
99134                 var osmClosed = osm.getClosedIDs();
99135                 if (osmClosed.length) {
99136                     tags['closed:note'] = osmClosed.join(';').substr(0, 255);
99137                 }
99138                 if (services$1.keepRight) {
99139                     var krClosed = services$1.keepRight.getClosedIDs();
99140                     if (krClosed.length) {
99141                         tags['closed:keepright'] = krClosed.join(';').substr(0, 255);
99142                     }
99143                 }
99144                 if (services$1.improveOSM) {
99145                     var iOsmClosed = services$1.improveOSM.getClosedIDs();
99146                     if (iOsmClosed.length) {
99147                         tags['closed:improveosm'] = iOsmClosed.join(';').substr(0, 255);
99148                     }
99149                 }
99150
99151                 // remove existing warning counts
99152                 for (var key in tags) {
99153                     if (key.match(/^warnings:/)) {
99154                         delete tags[key];
99155                     }
99156                 }
99157
99158                 // add counts of warnings generated by the user's edits
99159                 var warnings = context.validator()
99160                     .getIssuesBySeverity({ what: 'edited', where: 'all', includeIgnored: true, includeDisabledRules: true }).warning;
99161
99162                 var warningsByType = utilArrayGroupBy(warnings, 'type');
99163                 for (var warningType in warningsByType) {
99164                     var warningsOfType = warningsByType[warningType];
99165                     if (warningsOfType[0].subtype) {
99166                         var warningsBySubtype = utilArrayGroupBy(warningsOfType, 'subtype');
99167                         for (var warningSubtype in warningsBySubtype) {
99168                             var warningsOfSubtype = warningsBySubtype[warningSubtype];
99169                             tags['warnings:' + warningType + ':' + warningSubtype] = warningsOfSubtype.length.toString();
99170                         }
99171                     } else {
99172                         tags['warnings:' + warningType] = warningsOfType.length.toString();
99173                     }
99174                 }
99175
99176
99177                 _changeset$1 = _changeset$1.update({ tags: tags });
99178
99179                 var header = selection.selectAll('.header')
99180                     .data([0]);
99181
99182                 var headerTitle = header.enter()
99183                     .append('div')
99184                     .attr('class', 'header fillL header-container');
99185
99186                 headerTitle
99187                     .append('div')
99188                     .attr('class', 'header-block header-block-outer');
99189
99190                 headerTitle
99191                     .append('div')
99192                     .attr('class', 'header-block')
99193                     .append('h3')
99194                     .text(t('commit.title'));
99195
99196                 headerTitle
99197                     .append('div')
99198                     .attr('class', 'header-block header-block-outer header-block-close')
99199                     .append('button')
99200                     .attr('class', 'close')
99201                     .on('click', function() { context.enter(modeBrowse(context)); })
99202                     .call(svgIcon('#iD-icon-close'));
99203
99204                 var body = selection.selectAll('.body')
99205                     .data([0]);
99206
99207                 body = body.enter()
99208                     .append('div')
99209                     .attr('class', 'body')
99210                     .merge(body);
99211
99212
99213                 // Changeset Section
99214                 var changesetSection = body.selectAll('.changeset-editor')
99215                     .data([0]);
99216
99217                 changesetSection = changesetSection.enter()
99218                     .append('div')
99219                     .attr('class', 'modal-section changeset-editor')
99220                     .merge(changesetSection);
99221
99222                 changesetSection
99223                     .call(changesetEditor
99224                         .changesetID(_changeset$1.id)
99225                         .tags(tags)
99226                     );
99227
99228
99229                 // Warnings
99230                 body.call(commitWarnings);
99231
99232
99233                 // Upload Explanation
99234                 var saveSection = body.selectAll('.save-section')
99235                     .data([0]);
99236
99237                 saveSection = saveSection.enter()
99238                     .append('div')
99239                     .attr('class','modal-section save-section fillL cf')
99240                     .merge(saveSection);
99241
99242                 var prose = saveSection.selectAll('.commit-info')
99243                     .data([0]);
99244
99245                 if (prose.enter().size()) {   // first time, make sure to update user details in prose
99246                     _userDetails = null;
99247                 }
99248
99249                 prose = prose.enter()
99250                     .append('p')
99251                     .attr('class', 'commit-info')
99252                     .text(t('commit.upload_explanation'))
99253                     .merge(prose);
99254
99255                 // always check if this has changed, but only update prose.html()
99256                 // if needed, because it can trigger a style recalculation
99257                 osm.userDetails(function(err, user) {
99258                     if (err) return;
99259
99260                     if (_userDetails === user) return;  // no change
99261                     _userDetails = user;
99262
99263                     var userLink = d3_select(document.createElement('div'));
99264
99265                     if (user.image_url) {
99266                         userLink
99267                             .append('img')
99268                             .attr('src', user.image_url)
99269                             .attr('class', 'icon pre-text user-icon');
99270                     }
99271
99272                     userLink
99273                         .append('a')
99274                         .attr('class', 'user-info')
99275                         .text(user.display_name)
99276                         .attr('href', osm.userURL(user.display_name))
99277                         .attr('tabindex', -1)
99278                         .attr('target', '_blank');
99279
99280                     prose
99281                         .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
99282                 });
99283
99284
99285                 // Request Review
99286                 var requestReview = saveSection.selectAll('.request-review')
99287                     .data([0]);
99288
99289                 // Enter
99290                 var requestReviewEnter = requestReview.enter()
99291                     .append('div')
99292                     .attr('class', 'request-review');
99293
99294                 var labelEnter = requestReviewEnter
99295                     .append('label')
99296                     .attr('for', 'commit-input-request-review');
99297
99298                 labelEnter
99299                     .append('input')
99300                     .attr('type', 'checkbox')
99301                     .attr('id', 'commit-input-request-review');
99302
99303                 labelEnter
99304                     .append('span')
99305                     .text(t('commit.request_review'));
99306
99307                 // Update
99308                 requestReview = requestReview
99309                     .merge(requestReviewEnter);
99310
99311                 var requestReviewInput = requestReview.selectAll('input')
99312                     .property('checked', isReviewRequested(_changeset$1.tags))
99313                     .on('change', toggleRequestReview);
99314
99315
99316                 // Buttons
99317                 var buttonSection = saveSection.selectAll('.buttons')
99318                     .data([0]);
99319
99320                 // enter
99321                 var buttonEnter = buttonSection.enter()
99322                     .append('div')
99323                     .attr('class', 'buttons fillL cf');
99324
99325                 buttonEnter
99326                     .append('button')
99327                     .attr('class', 'secondary-action button cancel-button')
99328                     .append('span')
99329                     .attr('class', 'label')
99330                     .text(t('commit.cancel'));
99331
99332                 var uploadButton = buttonEnter
99333                     .append('button')
99334                     .attr('class', 'action button save-button');
99335
99336                 uploadButton.append('span')
99337                     .attr('class', 'label')
99338                     .text(t('commit.save'));
99339
99340                 var uploadBlockerTooltipText = getUploadBlockerMessage();
99341
99342                 // update
99343                 buttonSection = buttonSection
99344                     .merge(buttonEnter);
99345
99346                 buttonSection.selectAll('.cancel-button')
99347                     .on('click.cancel', function() {
99348                         var selectedID = commitChanges.entityID();
99349                         dispatch$1.call('cancel', this, selectedID);
99350                     });
99351
99352                 buttonSection.selectAll('.save-button')
99353                     .classed('disabled', uploadBlockerTooltipText !== null)
99354                     .on('click.save', function() {
99355                         if (!d3_select(this).classed('disabled')) {
99356                             this.blur();    // avoid keeping focus on the button - #4641
99357                             dispatch$1.call('save', this, _changeset$1);
99358                         }
99359                     });
99360
99361                 // remove any existing tooltip
99362                 tooltip().destroyAny(buttonSection.selectAll('.save-button'));
99363
99364                 if (uploadBlockerTooltipText) {
99365                     buttonSection.selectAll('.save-button')
99366                         .call(tooltip().title(uploadBlockerTooltipText).placement('top'));
99367                 }
99368
99369                 // Raw Tag Editor
99370                 var tagSection = body.selectAll('.tag-section.raw-tag-editor')
99371                     .data([0]);
99372
99373                 tagSection = tagSection.enter()
99374                     .append('div')
99375                     .attr('class', 'modal-section tag-section raw-tag-editor')
99376                     .merge(tagSection);
99377
99378                 var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99379                 tagSection
99380                     .call(rawTagEditor
99381                         .expanded(expanded)
99382                         .readOnlyTags(readOnlyTags)
99383                         .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99384                     );
99385
99386
99387                 // Change summary
99388                 body.call(commitChanges);
99389
99390
99391                 function toggleRequestReview() {
99392                     var rr = requestReviewInput.property('checked');
99393                     updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
99394
99395                     var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
99396                     tagSection
99397                         .call(rawTagEditor
99398                             .expanded(expanded)
99399                             .readOnlyTags(readOnlyTags)
99400                             .tags(Object.assign({}, _changeset$1.tags))   // shallow copy
99401                         );
99402                 }
99403             }
99404
99405
99406             function getUploadBlockerMessage() {
99407                 var errors = context.validator()
99408                     .getIssuesBySeverity({ what: 'edited', where: 'all' }).error;
99409
99410                 if (errors.length) {
99411                     return t('commit.outstanding_errors_message', { count: errors.length });
99412
99413                 } else {
99414                     var n = d3_select('#preset-input-comment').node();
99415                     var hasChangesetComment = n && n.value.length > 0;
99416                     if (!hasChangesetComment) {
99417                         return t('commit.comment_needed_message');
99418                     }
99419                 }
99420                 return null;
99421             }
99422
99423
99424             function changeTags(changed, onInput) {
99425                 if (changed.hasOwnProperty('comment')) {
99426                     if (changed.comment === undefined) {
99427                         changed.comment = '';
99428                     }
99429                     if (!onInput) {
99430                         context.storage('comment', changed.comment);
99431                         context.storage('commentDate', Date.now());
99432                     }
99433                 }
99434                 if (changed.hasOwnProperty('source')) {
99435                     if (changed.source === undefined) {
99436                         context.storage('source', null);
99437                     } else if (!onInput) {
99438                         context.storage('source', changed.source);
99439                         context.storage('commentDate', Date.now());
99440                     }
99441                 }
99442
99443                 updateChangeset(changed, onInput);
99444
99445                 if (_selection) {
99446                     _selection.call(commit);
99447                 }
99448             }
99449
99450
99451             function findHashtags(tags, commentOnly) {
99452                 var inComment = commentTags();
99453                 var inHashTags = hashTags();
99454
99455                 if (inComment !== null) {                    // when hashtags are detected in comment...
99456                     context.storage('hashtags', null);       // always remove stored hashtags - #4304
99457                     if (commentOnly) { inHashTags = []; }    // optionally override hashtags field
99458                 }
99459
99460                 // keep only one copy of the tags
99461                 var all = new Set();
99462                 var keepTags = [];
99463                 inComment.forEach(checkTag);
99464                 inHashTags.forEach(checkTag);
99465                 return keepTags;
99466
99467                 // Compare tags as lowercase strings, but keep original case tags
99468                 function checkTag(s) {
99469                     var compare = s.toLowerCase();
99470                     if (!all.has(compare)) {
99471                         all.add(compare);
99472                         keepTags.push(s);
99473                     }
99474                 }
99475
99476                 // Extract hashtags from `comment`
99477                 function commentTags() {
99478                     var matches = (tags.comment || '')
99479                         .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
99480                         .match(hashtagRegex);
99481
99482                     return (matches || []);
99483                 }
99484
99485                 // Extract and clean hashtags from `hashtags`
99486                 function hashTags() {
99487                     var matches = (tags.hashtags || '')
99488                         .split(/[,;\s]+/)
99489                         .map(function (s) {
99490                             if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
99491                             var matched = s.match(hashtagRegex);
99492                             return matched && matched[0];
99493                         }).filter(Boolean);                       // exclude falsy
99494
99495                     return (matches || []);
99496                 }
99497             }
99498
99499
99500             function isReviewRequested(tags) {
99501                 var rr = tags.review_requested;
99502                 if (rr === undefined) return false;
99503                 rr = rr.trim().toLowerCase();
99504                 return !(rr === '' || rr === 'no');
99505             }
99506
99507
99508             function updateChangeset(changed, onInput) {
99509                 var tags = Object.assign({}, _changeset$1.tags);   // shallow copy
99510
99511                 Object.keys(changed).forEach(function(k) {
99512                     var v = changed[k];
99513                     k = k.trim().substr(0, 255);
99514                     if (readOnlyTags.indexOf(k) !== -1) return;
99515
99516                     if (k !== '' && v !== undefined) {
99517                         if (onInput) {
99518                             tags[k] = v;
99519                         } else {
99520                             tags[k] = v.trim().substr(0, 255);
99521                         }
99522                     } else {
99523                         delete tags[k];
99524                     }
99525                 });
99526
99527                 if (!onInput) {
99528                     // when changing the comment, override hashtags with any found in comment.
99529                     var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
99530                     var arr = findHashtags(tags, commentOnly);
99531                     if (arr.length) {
99532                         tags.hashtags = arr.join(';').substr(0, 255);
99533                         context.storage('hashtags', tags.hashtags);
99534                     } else {
99535                         delete tags.hashtags;
99536                         context.storage('hashtags', null);
99537                     }
99538                 }
99539
99540                 // always update userdetails, just in case user reauthenticates as someone else
99541                 if (_userDetails && _userDetails.changesets_count !== undefined) {
99542                     var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
99543                     tags.changesets_count = String(changesetsCount);
99544
99545                     // first 100 edits - new user
99546                     if (changesetsCount <= 100) {
99547                         var s;
99548                         s = context.storage('walkthrough_completed');
99549                         if (s) {
99550                             tags['ideditor:walkthrough_completed'] = s;
99551                         }
99552
99553                         s = context.storage('walkthrough_progress');
99554                         if (s) {
99555                             tags['ideditor:walkthrough_progress'] = s;
99556                         }
99557
99558                         s = context.storage('walkthrough_started');
99559                         if (s) {
99560                             tags['ideditor:walkthrough_started'] = s;
99561                         }
99562                     }
99563                 } else {
99564                     delete tags.changesets_count;
99565                 }
99566
99567                 if (!fastDeepEqual(_changeset$1.tags, tags)) {
99568                     _changeset$1 = _changeset$1.update({ tags: tags });
99569                 }
99570             }
99571
99572
99573             commit.reset = function() {
99574                 _changeset$1 = null;
99575             };
99576
99577
99578             return utilRebind(commit, dispatch$1, 'on');
99579         }
99580
99581         function uiSuccess(context) {
99582             var MAXEVENTS = 2;
99583
99584             // All else being equal, rank more "social" communities higher
99585             // (anything not in this list receives no adjustment)
99586             var COMMUNITYRANK = {
99587                 'meetup': +5,
99588                 'slack': +4,
99589                 'facebook': +3,
99590                 'reddit': +2,
99591                 'forum': -2,
99592                 'mailinglist': -3,
99593                 'irc': -4
99594             };
99595
99596             var detected = utilDetect();
99597             var dispatch$1 = dispatch('cancel');
99598             var _changeset;
99599             var _location;
99600
99601
99602             // string-to-date parsing in JavaScript is weird
99603             function parseEventDate(when) {
99604                 if (!when) return;
99605
99606                 var raw = when.trim();
99607                 if (!raw) return;
99608
99609                 if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
99610                     raw += 'Z';           // this forces date to be parsed as a UTC date
99611                 }
99612
99613                 var parsed = new Date(raw);
99614                 return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
99615             }
99616
99617
99618             function success(selection) {
99619                 var header = selection
99620                     .append('div')
99621                     .attr('class', 'header fillL');
99622
99623                 header
99624                     .append('button')
99625                     .attr('class', 'fr')
99626                     .on('click', function() { dispatch$1.call('cancel'); })
99627                     .call(svgIcon('#iD-icon-close'));
99628
99629                 header
99630                     .append('h3')
99631                     .text(t('success.just_edited'));
99632
99633                 var body = selection
99634                     .append('div')
99635                     .attr('class', 'body save-success fillL');
99636
99637                 var summary = body
99638                     .append('div')
99639                     .attr('class', 'save-summary');
99640
99641                 summary
99642                     .append('h3')
99643                     .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
99644
99645                 summary
99646                     .append('p')
99647                     .text(t('success.help_html'))
99648                     .append('a')
99649                     .attr('class', 'link-out')
99650                     .attr('target', '_blank')
99651                     .attr('tabindex', -1)
99652                     .attr('href', t('success.help_link_url'))
99653                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99654                     .append('span')
99655                     .text(t('success.help_link_text'));
99656
99657                 var osm = context.connection();
99658                 if (!osm) return;
99659
99660                 var changesetURL = osm.changesetURL(_changeset.id);
99661
99662                 var table = summary
99663                     .append('table')
99664                     .attr('class', 'summary-table');
99665
99666                 var row = table
99667                     .append('tr')
99668                     .attr('class', 'summary-row');
99669
99670                 row
99671                     .append('td')
99672                     .attr('class', 'cell-icon summary-icon')
99673                     .append('a')
99674                     .attr('target', '_blank')
99675                     .attr('href', changesetURL)
99676                     .append('svg')
99677                     .attr('class', 'logo-small')
99678                     .append('use')
99679                     .attr('xlink:href', '#iD-logo-osm');
99680
99681                 var summaryDetail = row
99682                     .append('td')
99683                     .attr('class', 'cell-detail summary-detail');
99684
99685                 summaryDetail
99686                     .append('a')
99687                     .attr('class', 'cell-detail summary-view-on-osm')
99688                     .attr('target', '_blank')
99689                     .attr('href', changesetURL)
99690                     .text(t('success.view_on_osm'));
99691
99692                 summaryDetail
99693                     .append('div')
99694                     .text(t('success.changeset_id', { changeset_id: _changeset.id }));
99695
99696
99697                 // Gather community polygon IDs intersecting the map..
99698                 var matchFeatures = data.community.query(context.map().center(), true) || [];
99699                 var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
99700
99701                 // Gather community resources that are either global or match a polygon.
99702                 var matchResources = Object.values(data.community.resources)
99703                     .filter(function(v) { return !v.featureId || matchIDs.indexOf(v.featureId) !== -1; });
99704
99705                 if (matchResources.length) {
99706                     // sort by size ascending, then by community rank
99707                     matchResources.sort(function(a, b) {
99708                         var aSize = Infinity;
99709                         var bSize = Infinity;
99710                         var aRank = COMMUNITYRANK[a.type] || 0;
99711                         var bRank = COMMUNITYRANK[b.type] || 0;
99712
99713                         if (a.featureId) {
99714                             aSize = data.community.features[a.featureId].properties.area;
99715                         }
99716                         if (b.featureId) {
99717                             bSize = data.community.features[b.featureId].properties.area;
99718                         }
99719
99720                         return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
99721                     });
99722
99723                     body
99724                         .call(showCommunityLinks, matchResources);
99725                 }
99726             }
99727
99728
99729             function showCommunityLinks(selection, matchResources) {
99730                 var communityLinks = selection
99731                     .append('div')
99732                     .attr('class', 'save-communityLinks');
99733
99734                 communityLinks
99735                     .append('h3')
99736                     .text(t('success.like_osm'));
99737
99738                 var table = communityLinks
99739                     .append('table')
99740                     .attr('class', 'community-table');
99741
99742                 var row = table.selectAll('.community-row')
99743                     .data(matchResources);
99744
99745                 var rowEnter = row.enter()
99746                     .append('tr')
99747                     .attr('class', 'community-row');
99748
99749                 rowEnter
99750                     .append('td')
99751                     .attr('class', 'cell-icon community-icon')
99752                     .append('a')
99753                     .attr('target', '_blank')
99754                     .attr('href', function(d) { return d.url; })
99755                     .append('svg')
99756                     .attr('class', 'logo-small')
99757                     .append('use')
99758                     .attr('xlink:href', function(d) { return '#community-' + d.type; });
99759
99760                 var communityDetail = rowEnter
99761                     .append('td')
99762                     .attr('class', 'cell-detail community-detail');
99763
99764                 communityDetail
99765                     .each(showCommunityDetails);
99766
99767                 communityLinks
99768                     .append('div')
99769                     .attr('class', 'community-missing')
99770                     .text(t('success.missing'))
99771                     .append('a')
99772                     .attr('class', 'link-out')
99773                     .attr('target', '_blank')
99774                     .attr('tabindex', -1)
99775                     .call(svgIcon('#iD-icon-out-link', 'inline'))
99776                     .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
99777                     .append('span')
99778                     .text(t('success.tell_us'));
99779             }
99780
99781
99782             function showCommunityDetails(d) {
99783                 var selection = d3_select(this);
99784                 var communityID = d.id;
99785                 var replacements = {
99786                     url: linkify(d.url),
99787                     signupUrl: linkify(d.signupUrl || d.url)
99788                 };
99789
99790                 selection
99791                     .append('div')
99792                     .attr('class', 'community-name')
99793                     .append('a')
99794                     .attr('target', '_blank')
99795                     .attr('href', d.url)
99796                     .text(t('community.' + d.id + '.name'));
99797
99798                 var descriptionHTML = t('community.' + d.id + '.description', replacements);
99799
99800                 if (d.type === 'reddit') {   // linkify subreddits  #4997
99801                     descriptionHTML = descriptionHTML
99802                         .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
99803                 }
99804
99805                 selection
99806                     .append('div')
99807                     .attr('class', 'community-description')
99808                     .html(descriptionHTML);
99809
99810                 if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
99811                     selection
99812                         .append('div')
99813                         .call(uiDisclosure(context, 'community-more-' + d.id, false)
99814                             .expanded(false)
99815                             .updatePreference(false)
99816                             .title(t('success.more'))
99817                             .content(showMore)
99818                         );
99819                 }
99820
99821                 var nextEvents = (d.events || [])
99822                     .map(function(event) {
99823                         event.date = parseEventDate(event.when);
99824                         return event;
99825                     })
99826                     .filter(function(event) {               // date is valid and future (or today)
99827                         var t = event.date.getTime();
99828                         var now = (new Date()).setHours(0,0,0,0);
99829                         return !isNaN(t) && t >= now;
99830                     })
99831                     .sort(function(a, b) {                  // sort by date ascending
99832                         return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
99833                     })
99834                     .slice(0, MAXEVENTS);                   // limit number of events shown
99835
99836                 if (nextEvents.length) {
99837                     selection
99838                         .append('div')
99839                         .call(uiDisclosure(context, 'community-events-' + d.id, false)
99840                             .expanded(false)
99841                             .updatePreference(false)
99842                             .title(t('success.events'))
99843                             .content(showNextEvents)
99844                         )
99845                         .select('.hide-toggle')
99846                         .append('span')
99847                         .attr('class', 'badge-text')
99848                         .text(nextEvents.length);
99849                 }
99850
99851
99852                 function showMore(selection) {
99853                     var more = selection.selectAll('.community-more')
99854                         .data([0]);
99855
99856                     var moreEnter = more.enter()
99857                         .append('div')
99858                         .attr('class', 'community-more');
99859
99860                     if (d.extendedDescription) {
99861                         moreEnter
99862                             .append('div')
99863                             .attr('class', 'community-extended-description')
99864                             .html(t('community.' + d.id + '.extendedDescription', replacements));
99865                     }
99866
99867                     if (d.languageCodes && d.languageCodes.length) {
99868                         moreEnter
99869                             .append('div')
99870                             .attr('class', 'community-languages')
99871                             .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
99872                     }
99873                 }
99874
99875
99876                 function showNextEvents(selection) {
99877                     var events = selection
99878                         .append('div')
99879                         .attr('class', 'community-events');
99880
99881                     var item = events.selectAll('.community-event')
99882                         .data(nextEvents);
99883
99884                     var itemEnter = item.enter()
99885                         .append('div')
99886                         .attr('class', 'community-event');
99887
99888                     itemEnter
99889                         .append('div')
99890                         .attr('class', 'community-event-name')
99891                         .append('a')
99892                         .attr('target', '_blank')
99893                         .attr('href', function(d) { return d.url; })
99894                         .text(function(d) {
99895                             var name = d.name;
99896                             if (d.i18n && d.id) {
99897                                 name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
99898                             }
99899                             return name;
99900                         });
99901
99902                     itemEnter
99903                         .append('div')
99904                         .attr('class', 'community-event-when')
99905                         .text(function(d) {
99906                             var options = {
99907                                 weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
99908                             };
99909                             if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
99910                                 options.hour = 'numeric';
99911                                 options.minute = 'numeric';
99912                             }
99913                             return d.date.toLocaleString(detected.locale, options);
99914                         });
99915
99916                     itemEnter
99917                         .append('div')
99918                         .attr('class', 'community-event-where')
99919                         .text(function(d) {
99920                             var where = d.where;
99921                             if (d.i18n && d.id) {
99922                                 where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
99923                             }
99924                             return where;
99925                         });
99926
99927                     itemEnter
99928                         .append('div')
99929                         .attr('class', 'community-event-description')
99930                         .text(function(d) {
99931                             var description = d.description;
99932                             if (d.i18n && d.id) {
99933                                 description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
99934                             }
99935                             return description;
99936                         });
99937                 }
99938
99939
99940                 function linkify(url, text) {
99941                     text = text || url;
99942                     return '<a target="_blank" href="' + url + '">' + text + '</a>';
99943                 }
99944             }
99945
99946
99947             success.changeset = function(_) {
99948                 if (!arguments.length) return _changeset;
99949                 _changeset = _;
99950                 return success;
99951             };
99952
99953
99954             success.location = function(_) {
99955                 if (!arguments.length) return _location;
99956                 _location = _;
99957                 return success;
99958             };
99959
99960
99961             return utilRebind(success, dispatch$1, 'on');
99962         }
99963
99964         var _isSaving = false;
99965
99966
99967         function modeSave(context) {
99968             var mode = { id: 'save' };
99969             var keybinding = utilKeybinding('modeSave');
99970
99971             var loading = uiLoading(context)
99972                 .message(t('save.uploading'))
99973                 .blocking(true);
99974
99975             var commit = uiCommit(context)
99976                 .on('cancel', cancel)
99977                 .on('save', save);
99978
99979             var _toCheck = [];
99980             var _toLoad = [];
99981             var _loaded = {};
99982             var _toLoadCount = 0;
99983             var _toLoadTotal = 0;
99984
99985             var _conflicts = [];
99986             var _errors = [];
99987             var _origChanges;
99988             var _location;
99989
99990
99991             function cancel(selectedID) {
99992                 if (selectedID) {
99993                     context.enter(modeSelect(context, [selectedID]));
99994                 } else {
99995                     context.enter(modeBrowse(context));
99996                 }
99997             }
99998
99999
100000             function save(changeset, tryAgain, checkConflicts) {
100001                 // Guard against accidentally entering save code twice - #4641
100002                 if (_isSaving && !tryAgain) {
100003                     return;
100004                 }
100005
100006                 var osm = context.connection();
100007                 if (!osm) {
100008                     cancel();
100009                     return;
100010                 }
100011
100012                 // If user somehow got logged out mid-save, try to reauthenticate..
100013                 // This can happen if they were logged in from before, but the tokens are no longer valid.
100014                 if (!osm.authenticated()) {
100015                     osm.authenticate(function(err) {
100016                         if (err) {
100017                             cancel();   // quit save mode..
100018                         } else {
100019                             save(changeset, tryAgain, checkConflicts);  // continue where we left off..
100020                         }
100021                     });
100022                     return;
100023                 }
100024
100025                 if (!_isSaving) {
100026                     keybindingOff();
100027                     context.container().call(loading);  // block input
100028                     _isSaving = true;
100029                 }
100030
100031                 var history = context.history();
100032                 var localGraph = context.graph();
100033                 var remoteGraph = coreGraph(history.base(), true);
100034
100035                 _conflicts = [];
100036                 _errors = [];
100037
100038                 // Store original changes, in case user wants to download them as an .osc file
100039                 _origChanges = history.changes(actionDiscardTags(history.difference()));
100040
100041                 // First time, `history.perform` a no-op action.
100042                 // Any conflict resolutions will be done as `history.replace`
100043                 if (!tryAgain) {
100044                     history.perform(actionNoop());
100045                 }
100046
100047                 // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
100048                 if (!checkConflicts) {
100049                     upload(changeset);
100050
100051                 // Do the full (slow) conflict check..
100052                 } else {
100053                     var summary = history.difference().summary();
100054                     _toCheck = [];
100055                     for (var i = 0; i < summary.length; i++) {
100056                         var item = summary[i];
100057                         if (item.changeType === 'modified') {
100058                             _toCheck.push(item.entity.id);
100059                         }
100060                     }
100061
100062                     _toLoad = withChildNodes(_toCheck, localGraph);
100063                     _loaded = {};
100064                     _toLoadCount = 0;
100065                     _toLoadTotal = _toLoad.length;
100066
100067                     if (_toCheck.length) {
100068                         showProgress(_toLoadCount, _toLoadTotal);
100069                         _toLoad.forEach(function(id) { _loaded[id] = false; });
100070                         osm.loadMultiple(_toLoad, loaded);
100071                     } else {
100072                         upload(changeset);
100073                     }
100074                 }
100075
100076                 return;
100077
100078
100079                 function withChildNodes(ids, graph) {
100080                     var s = new Set(ids);
100081                     ids.forEach(function(id) {
100082                         var entity = graph.entity(id);
100083                         if (entity.type !== 'way') return;
100084
100085                         graph.childNodes(entity).forEach(function(child) {
100086                             if (child.version !== undefined) {
100087                                 s.add(child.id);
100088                             }
100089                         });
100090                     });
100091
100092                     return Array.from(s);
100093                 }
100094
100095
100096                 // Reload modified entities into an alternate graph and check for conflicts..
100097                 function loaded(err, result) {
100098                     if (_errors.length) return;
100099
100100                     if (err) {
100101                         _errors.push({
100102                             msg: err.message || err.responseText,
100103                             details: [ t('save.status_code', { code: err.status }) ]
100104                         });
100105                         showErrors();
100106
100107                     } else {
100108                         var loadMore = [];
100109
100110                         result.data.forEach(function(entity) {
100111                             remoteGraph.replace(entity);
100112                             _loaded[entity.id] = true;
100113                             _toLoad = _toLoad.filter(function(val) { return val !== entity.id; });
100114
100115                             if (!entity.visible) return;
100116
100117                             // Because loadMultiple doesn't download /full like loadEntity,
100118                             // need to also load children that aren't already being checked..
100119                             var i, id;
100120                             if (entity.type === 'way') {
100121                                 for (i = 0; i < entity.nodes.length; i++) {
100122                                     id = entity.nodes[i];
100123                                     if (_loaded[id] === undefined) {
100124                                         _loaded[id] = false;
100125                                         loadMore.push(id);
100126                                     }
100127                                 }
100128                             } else if (entity.type === 'relation' && entity.isMultipolygon()) {
100129                                 for (i = 0; i < entity.members.length; i++) {
100130                                     id = entity.members[i].id;
100131                                     if (_loaded[id] === undefined) {
100132                                         _loaded[id] = false;
100133                                         loadMore.push(id);
100134                                     }
100135                                 }
100136                             }
100137                         });
100138
100139                         _toLoadCount += result.data.length;
100140                         _toLoadTotal += loadMore.length;
100141                         showProgress(_toLoadCount, _toLoadTotal);
100142
100143                         if (loadMore.length) {
100144                             _toLoad.push.apply(_toLoad, loadMore);
100145                             osm.loadMultiple(loadMore, loaded);
100146                         }
100147
100148                         if (!_toLoad.length) {
100149                             detectConflicts();
100150                         }
100151                     }
100152                 }
100153
100154
100155                 function detectConflicts() {
100156                     function choice(id, text, action) {
100157                         return { id: id, text: text, action: function() { history.replace(action); } };
100158                     }
100159                     function formatUser(d) {
100160                         return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
100161                     }
100162                     function entityName(entity) {
100163                         return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
100164                     }
100165
100166                     function sameVersions(local, remote) {
100167                         if (local.version !== remote.version) return false;
100168
100169                         if (local.type === 'way') {
100170                             var children = utilArrayUnion(local.nodes, remote.nodes);
100171                             for (var i = 0; i < children.length; i++) {
100172                                 var a = localGraph.hasEntity(children[i]);
100173                                 var b = remoteGraph.hasEntity(children[i]);
100174                                 if (a && b && a.version !== b.version) return false;
100175                             }
100176                         }
100177
100178                         return true;
100179                     }
100180
100181                     _toCheck.forEach(function(id) {
100182                         var local = localGraph.entity(id);
100183                         var remote = remoteGraph.entity(id);
100184
100185                         if (sameVersions(local, remote)) return;
100186
100187                         var action = actionMergeRemoteChanges;
100188                         var merge = action(id, localGraph, remoteGraph, formatUser);
100189
100190                         history.replace(merge);
100191
100192                         var mergeConflicts = merge.conflicts();
100193                         if (!mergeConflicts.length) return;  // merged safely
100194
100195                         var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
100196                         var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
100197                         var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
100198                         var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
100199
100200                         _conflicts.push({
100201                             id: id,
100202                             name: entityName(local),
100203                             details: mergeConflicts,
100204                             chosen: 1,
100205                             choices: [
100206                                 choice(id, keepMine, forceLocal),
100207                                 choice(id, keepTheirs, forceRemote)
100208                             ]
100209                         });
100210                     });
100211
100212                     upload(changeset);
100213                 }
100214             }
100215
100216
100217             function upload(changeset) {
100218                 var osm = context.connection();
100219                 if (!osm) {
100220                     _errors.push({ msg: 'No OSM Service' });
100221                 }
100222
100223                 if (_conflicts.length) {
100224                     _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
100225                     showConflicts(changeset);
100226
100227                 } else if (_errors.length) {
100228                     showErrors();
100229
100230                 } else {
100231                     var history = context.history();
100232                     var changes = history.changes(actionDiscardTags(history.difference()));
100233                     if (changes.modified.length || changes.created.length || changes.deleted.length) {
100234                         loadLocation();  // so it is ready when we display the save screen
100235                         osm.putChangeset(changeset, changes, uploadCallback);
100236                     } else {        // changes were insignificant or reverted by user
100237                         d3_select('.inspector-wrap *').remove();
100238                         loading.close();
100239                         _isSaving = false;
100240                         context.flush();
100241                         cancel();
100242                     }
100243                 }
100244             }
100245
100246
100247             function uploadCallback(err, changeset) {
100248                 if (err) {
100249                     if (err.status === 409) {          // 409 Conflict
100250                         save(changeset, true, true);   // tryAgain = true, checkConflicts = true
100251                     } else {
100252                         _errors.push({
100253                             msg: err.message || err.responseText,
100254                             details: [ t('save.status_code', { code: err.status }) ]
100255                         });
100256                         showErrors();
100257                     }
100258
100259                 } else {
100260                     context.history().clearSaved();
100261                     success(changeset);
100262                     // Add delay to allow for postgres replication #1646 #2678
100263                     window.setTimeout(function() {
100264                         d3_select('.inspector-wrap *').remove();
100265                         loading.close();
100266                         _isSaving = false;
100267                         context.flush();
100268                     }, 2500);
100269                 }
100270             }
100271
100272
100273             function showProgress(num, total) {
100274                 var modal = context.container().select('.loading-modal .modal-section');
100275                 var progress = modal.selectAll('.progress')
100276                     .data([0]);
100277
100278                 // enter/update
100279                 progress.enter()
100280                     .append('div')
100281                     .attr('class', 'progress')
100282                     .merge(progress)
100283                     .text(t('save.conflict_progress', { num: num, total: total }));
100284             }
100285
100286
100287             function showConflicts(changeset) {
100288                 var history = context.history();
100289                 var selection = context.container()
100290                     .select('#sidebar')
100291                     .append('div')
100292                     .attr('class','sidebar-component');
100293
100294                 loading.close();
100295                 _isSaving = false;
100296
100297                 var ui = uiConflicts(context)
100298                     .conflictList(_conflicts)
100299                     .origChanges(_origChanges)
100300                     .on('cancel', function() {
100301                         history.pop();
100302                         selection.remove();
100303                         keybindingOn();
100304                     })
100305                     .on('save', function() {
100306                         for (var i = 0; i < _conflicts.length; i++) {
100307                             if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
100308                                 var entity = context.hasEntity(_conflicts[i].id);
100309                                 if (entity && entity.type === 'way') {
100310                                     var children = utilArrayUniq(entity.nodes);
100311                                     for (var j = 0; j < children.length; j++) {
100312                                         history.replace(actionRevert(children[j]));
100313                                     }
100314                                 }
100315                                 history.replace(actionRevert(_conflicts[i].id));
100316                             }
100317                         }
100318
100319                         selection.remove();
100320                         save(changeset, true, false);  // tryAgain = true, checkConflicts = false
100321                     });
100322
100323                 selection.call(ui);
100324             }
100325
100326
100327             function showErrors() {
100328                 keybindingOn();
100329                 context.history().pop();
100330                 loading.close();
100331                 _isSaving = false;
100332
100333                 var selection = uiConfirm(context.container());
100334                 selection
100335                     .select('.modal-section.header')
100336                     .append('h3')
100337                     .text(t('save.error'));
100338
100339                 addErrors(selection, _errors);
100340                 selection.okButton();
100341             }
100342
100343
100344             function addErrors(selection, data) {
100345                 var message = selection
100346                     .select('.modal-section.message-text');
100347
100348                 var items = message
100349                     .selectAll('.error-container')
100350                     .data(data);
100351
100352                 var enter = items.enter()
100353                     .append('div')
100354                     .attr('class', 'error-container');
100355
100356                 enter
100357                     .append('a')
100358                     .attr('class', 'error-description')
100359                     .attr('href', '#')
100360                     .classed('hide-toggle', true)
100361                     .text(function(d) { return d.msg || t('save.unknown_error_details'); })
100362                     .on('click', function() {
100363                         event.preventDefault();
100364
100365                         var error = d3_select(this);
100366                         var detail = d3_select(this.nextElementSibling);
100367                         var exp = error.classed('expanded');
100368
100369                         detail.style('display', exp ? 'none' : 'block');
100370                         error.classed('expanded', !exp);
100371                     });
100372
100373                 var details = enter
100374                     .append('div')
100375                     .attr('class', 'error-detail-container')
100376                     .style('display', 'none');
100377
100378                 details
100379                     .append('ul')
100380                     .attr('class', 'error-detail-list')
100381                     .selectAll('li')
100382                     .data(function(d) { return d.details || []; })
100383                     .enter()
100384                     .append('li')
100385                     .attr('class', 'error-detail-item')
100386                     .text(function(d) { return d; });
100387
100388                 items.exit()
100389                     .remove();
100390             }
100391
100392
100393             function success(changeset) {
100394                 commit.reset();
100395
100396                 var ui = uiSuccess(context)
100397                     .changeset(changeset)
100398                     .location(_location)
100399                     .on('cancel', function() { context.ui().sidebar.hide(); });
100400
100401                 context.enter(modeBrowse(context).sidebar(ui));
100402             }
100403
100404
100405             function keybindingOn() {
100406                 d3_select(document)
100407                     .call(keybinding.on('⎋', cancel, true));
100408             }
100409
100410
100411             function keybindingOff() {
100412                 d3_select(document)
100413                     .call(keybinding.unbind);
100414             }
100415
100416
100417             // Reverse geocode current map location so we can display a message on
100418             // the success screen like "Thank you for editing around place, region."
100419             function loadLocation() {
100420                 _location = null;
100421                 if (!services$1.geocoder) return;
100422
100423                 services$1.geocoder.reverse(context.map().center(), function(err, result) {
100424                     if (err || !result || !result.address) return;
100425
100426                     var addr = result.address;
100427                     var place = (addr && (addr.town || addr.city || addr.county)) || '';
100428                     var region = (addr && (addr.state || addr.country)) || '';
100429                     var separator = (place && region) ? t('success.thank_you_where.separator') : '';
100430
100431                     _location = t('success.thank_you_where.format',
100432                         { place: place, separator: separator, region: region }
100433                     );
100434                 });
100435             }
100436
100437
100438             mode.enter = function() {
100439                 // Show sidebar
100440                 context.ui().sidebar.expand();
100441
100442                 function done() {
100443                     context.ui().sidebar.show(commit);
100444                 }
100445
100446                 keybindingOn();
100447
100448                 context.container().selectAll('#content')
100449                     .attr('class', 'inactive');
100450
100451                 var osm = context.connection();
100452                 if (!osm) {
100453                     cancel();
100454                     return;
100455                 }
100456
100457                 if (osm.authenticated()) {
100458                     done();
100459                 } else {
100460                     osm.authenticate(function(err) {
100461                         if (err) {
100462                             cancel();
100463                         } else {
100464                             done();
100465                         }
100466                     });
100467                 }
100468             };
100469
100470
100471             mode.exit = function() {
100472                 _isSaving = false;
100473
100474                 keybindingOff();
100475
100476                 context.container().selectAll('#content')
100477                     .attr('class', 'active');
100478
100479                 context.ui().sidebar.hide();
100480             };
100481
100482             return mode;
100483         }
100484
100485         function uiToolOldDrawModes(context) {
100486
100487             var tool = {
100488                 id: 'old_modes',
100489                 label: t('toolbar.add_feature')
100490             };
100491
100492             var modes = [
100493                 modeAddPoint(context, {
100494                     title: t('modes.add_point.title'),
100495                     button: 'point',
100496                     description: t('modes.add_point.description'),
100497                     preset: context.presets().item('point'),
100498                     key: '1'
100499                 }),
100500                 modeAddLine(context, {
100501                     title: t('modes.add_line.title'),
100502                     button: 'line',
100503                     description: t('modes.add_line.description'),
100504                     preset: context.presets().item('line'),
100505                     key: '2'
100506                 }),
100507                 modeAddArea(context, {
100508                     title: t('modes.add_area.title'),
100509                     button: 'area',
100510                     description: t('modes.add_area.description'),
100511                     preset: context.presets().item('area'),
100512                     key: '3'
100513                 })
100514             ];
100515
100516
100517             function enabled() {
100518                 return osmEditable();
100519             }
100520
100521             function osmEditable() {
100522                 var mode = context.mode();
100523                 return context.editable() && mode && mode.id !== 'save';
100524             }
100525
100526             modes.forEach(function(mode) {
100527                 context.keybinding().on(mode.key, function() {
100528                     if (!enabled(mode)) return;
100529
100530                     if (mode.id === context.mode().id) {
100531                         context.enter(modeBrowse(context));
100532                     } else {
100533                         context.enter(mode);
100534                     }
100535                 });
100536             });
100537
100538             tool.render = function(selection) {
100539
100540                 var wrap = selection
100541                     .append('div')
100542                     .attr('class', 'joined')
100543                     .style('display', 'flex');
100544
100545                 context
100546                     .on('enter.editor', function(entered) {
100547                         selection.selectAll('button.add-button')
100548                             .classed('active', function(mode) { return entered.button === mode.button; });
100549                         context.container()
100550                             .classed('mode-' + entered.id, true);
100551                     });
100552
100553                 context
100554                     .on('exit.editor', function(exited) {
100555                         context.container()
100556                             .classed('mode-' + exited.id, false);
100557                     });
100558
100559
100560                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100561
100562                 context.map()
100563                     .on('move.modes', debouncedUpdate)
100564                     .on('drawn.modes', debouncedUpdate);
100565
100566                 context
100567                     .on('enter.modes', update);
100568
100569                 update();
100570
100571
100572                 function update() {
100573
100574                     var buttons = wrap.selectAll('button.add-button')
100575                         .data(modes, function(d) { return d.id; });
100576
100577                     // exit
100578                     buttons.exit()
100579                         .remove();
100580
100581                     // enter
100582                     var buttonsEnter = buttons.enter()
100583                         .append('button')
100584                         .attr('tabindex', -1)
100585                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100586                         .on('click.mode-buttons', function(d) {
100587                             if (!enabled(d)) return;
100588
100589                             // When drawing, ignore accidental clicks on mode buttons - #4042
100590                             var currMode = context.mode().id;
100591                             if (/^draw/.test(currMode)) return;
100592
100593                             if (d.id === currMode) {
100594                                 context.enter(modeBrowse(context));
100595                             } else {
100596                                 context.enter(d);
100597                             }
100598                         })
100599                         .call(tooltip()
100600                             .placement('bottom')
100601                             .html(true)
100602                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100603                         );
100604
100605                     buttonsEnter
100606                         .each(function(d) {
100607                             d3_select(this)
100608                                 .call(svgIcon('#iD-icon-' + d.button));
100609                         });
100610
100611                     buttonsEnter
100612                         .append('span')
100613                         .attr('class', 'label')
100614                         .text(function(mode) { return mode.title; });
100615
100616                     // if we are adding/removing the buttons, check if toolbar has overflowed
100617                     if (buttons.enter().size() || buttons.exit().size()) {
100618                         context.ui().checkOverflow('#bar', true);
100619                     }
100620
100621                     // update
100622                     buttons = buttons
100623                         .merge(buttonsEnter)
100624                         .classed('disabled', function(d) { return !enabled(d); });
100625                 }
100626             };
100627
100628             return tool;
100629         }
100630
100631         function uiToolNotes(context) {
100632
100633             var tool = {
100634                 id: 'notes',
100635                 label: t('modes.add_note.label')
100636             };
100637
100638             var mode = modeAddNote(context);
100639
100640             function enabled() {
100641                 return notesEnabled() && notesEditable();
100642             }
100643
100644             function notesEnabled() {
100645                 var noteLayer = context.layers().layer('notes');
100646                 return noteLayer && noteLayer.enabled();
100647             }
100648
100649             function notesEditable() {
100650                 var mode = context.mode();
100651                 return context.map().notesEditable() && mode && mode.id !== 'save';
100652             }
100653
100654             context.keybinding().on(mode.key, function() {
100655                 if (!enabled(mode)) return;
100656
100657                 if (mode.id === context.mode().id) {
100658                     context.enter(modeBrowse(context));
100659                 } else {
100660                     context.enter(mode);
100661                 }
100662             });
100663
100664             tool.render = function(selection) {
100665
100666                 context
100667                     .on('enter.editor.notes', function(entered) {
100668                         selection.selectAll('button.add-button')
100669                             .classed('active', function(mode) { return entered.button === mode.button; });
100670                         context.container()
100671                             .classed('mode-' + entered.id, true);
100672                     });
100673
100674                 context
100675                     .on('exit.editor.notes', function(exited) {
100676                         context.container()
100677                             .classed('mode-' + exited.id, false);
100678                     });
100679
100680
100681                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100682
100683                 context.map()
100684                     .on('move.notes', debouncedUpdate)
100685                     .on('drawn.notes', debouncedUpdate);
100686
100687                 context
100688                     .on('enter.notes', update);
100689
100690                 update();
100691
100692
100693                 function update() {
100694                     var showNotes = notesEnabled();
100695                     var data = showNotes ? [mode] : [];
100696
100697                     var buttons = selection.selectAll('button.add-button')
100698                         .data(data, function(d) { return d.id; });
100699
100700                     // exit
100701                     buttons.exit()
100702                         .remove();
100703
100704                     // enter
100705                     var buttonsEnter = buttons.enter()
100706                         .append('button')
100707                         .attr('tabindex', -1)
100708                         .attr('class', function(d) { return d.id + ' add-button bar-button'; })
100709                         .on('click.notes', function(d) {
100710                             if (!enabled(d)) return;
100711
100712                             // When drawing, ignore accidental clicks on mode buttons - #4042
100713                             var currMode = context.mode().id;
100714                             if (/^draw/.test(currMode)) return;
100715
100716                             if (d.id === currMode) {
100717                                 context.enter(modeBrowse(context));
100718                             } else {
100719                                 context.enter(d);
100720                             }
100721                         })
100722                         .call(tooltip()
100723                             .placement('bottom')
100724                             .html(true)
100725                             .title(function(d) { return uiTooltipHtml(d.description, d.key); })
100726                         );
100727
100728                     buttonsEnter
100729                         .each(function(d) {
100730                             d3_select(this)
100731                                 .call(svgIcon(d.icon || '#iD-icon-' + d.button));
100732                         });
100733
100734                     // if we are adding/removing the buttons, check if toolbar has overflowed
100735                     if (buttons.enter().size() || buttons.exit().size()) {
100736                         context.ui().checkOverflow('#bar', true);
100737                     }
100738
100739                     // update
100740                     buttons = buttons
100741                         .merge(buttonsEnter)
100742                         .classed('disabled', function(d) { return !enabled(d); });
100743                 }
100744             };
100745
100746             tool.uninstall = function() {
100747                 context
100748                     .on('enter.editor.notes', null)
100749                     .on('exit.editor.notes', null)
100750                     .on('enter.notes', null);
100751
100752                 context.map()
100753                     .on('move.notes', null)
100754                     .on('drawn.notes', null);
100755             };
100756
100757             return tool;
100758         }
100759
100760         function uiToolSave(context) {
100761
100762             var tool = {
100763                 id: 'save',
100764                 label: t('save.title')
100765             };
100766
100767             var button = null;
100768             var tooltipBehavior = null;
100769             var history = context.history();
100770             var key = uiCmd('⌘S');
100771             var _numChanges = 0;
100772
100773             function isSaving() {
100774                 var mode = context.mode();
100775                 return mode && mode.id === 'save';
100776             }
100777
100778             function isDisabled() {
100779                 return _numChanges === 0 || isSaving();
100780             }
100781
100782             function save() {
100783                 event.preventDefault();
100784                 if (!context.inIntro() && !isSaving() && history.hasChanges()) {
100785                     context.enter(modeSave(context));
100786                 }
100787             }
100788
100789             function bgColor() {
100790                 var step;
100791                 if (_numChanges === 0) {
100792                     return null;
100793                 } else if (_numChanges <= 50) {
100794                     step = _numChanges / 50;
100795                     return d3_interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
100796                 } else {
100797                     step = Math.min((_numChanges - 50) / 50, 1.0);
100798                     return d3_interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
100799                 }
100800             }
100801
100802
100803             function updateCount() {
100804                 var val = history.difference().summary().length;
100805                 if (val === _numChanges) return;
100806                 _numChanges = val;
100807
100808                 if (tooltipBehavior) {
100809                     tooltipBehavior
100810                         .title(uiTooltipHtml(
100811                             t(_numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
100812                         );
100813                 }
100814
100815                 if (button) {
100816                     button
100817                         .classed('disabled', isDisabled())
100818                         .style('background', bgColor(_numChanges));
100819
100820                     button.select('span.count')
100821                         .text(_numChanges);
100822                 }
100823             }
100824
100825
100826             tool.render = function(selection) {
100827                 tooltipBehavior = tooltip()
100828                     .placement('bottom')
100829                     .html(true)
100830                     .title(uiTooltipHtml(t('save.no_changes'), key));
100831
100832                 button = selection
100833                     .append('button')
100834                     .attr('class', 'save disabled bar-button')
100835                     .attr('tabindex', -1)
100836                     .on('click', save)
100837                     .call(tooltipBehavior);
100838
100839                 button
100840                     .call(svgIcon('#iD-icon-save'));
100841
100842                 button
100843                     .append('span')
100844                     .attr('class', 'count')
100845                     .text('0');
100846
100847                 updateCount();
100848
100849
100850                 context.keybinding()
100851                     .on(key, save, true);
100852
100853
100854                 context.history()
100855                     .on('change.save', updateCount);
100856
100857                 context
100858                     .on('enter.save', function() {
100859                         if (button) {
100860                             button
100861                                 .classed('disabled', isDisabled());
100862
100863                             if (isSaving()) {
100864                                 button.call(tooltipBehavior.hide);
100865                             }
100866                         }
100867                     });
100868             };
100869
100870
100871             tool.uninstall = function() {
100872                 context.keybinding()
100873                     .off(key, true);
100874
100875                 context.history()
100876                     .on('change.save', null);
100877
100878                 context
100879                     .on('enter.save', null);
100880
100881                 button = null;
100882                 tooltipBehavior = null;
100883             };
100884
100885             return tool;
100886         }
100887
100888         function uiToolSidebarToggle(context) {
100889
100890             var tool = {
100891                 id: 'sidebar_toggle',
100892                 label: t('toolbar.inspect')
100893             };
100894
100895             tool.render = function(selection) {
100896                 selection
100897                     .append('button')
100898                     .attr('class', 'bar-button')
100899                     .attr('tabindex', -1)
100900                     .on('click', function() {
100901                         context.ui().sidebar.toggle();
100902                     })
100903                     .call(tooltip()
100904                         .placement('bottom')
100905                         .html(true)
100906                         .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
100907                     )
100908                     .call(svgIcon('#iD-icon-sidebar-' + (textDirection === 'rtl' ? 'right' : 'left')));
100909             };
100910
100911             return tool;
100912         }
100913
100914         function uiToolUndoRedo(context) {
100915
100916             var tool = {
100917                 id: 'undo_redo',
100918                 label: t('toolbar.undo_redo')
100919             };
100920
100921             var commands = [{
100922                 id: 'undo',
100923                 cmd: uiCmd('⌘Z'),
100924                 action: function() { if (editable()) context.undo(); },
100925                 annotation: function() { return context.history().undoAnnotation(); }
100926             }, {
100927                 id: 'redo',
100928                 cmd: uiCmd('⌘⇧Z'),
100929                 action: function() { if (editable()) context.redo(); },
100930                 annotation: function() { return context.history().redoAnnotation(); }
100931             }];
100932
100933
100934             function editable() {
100935                 var mode = context.mode();
100936                 return context.editable() && mode && mode.id !== 'save';
100937             }
100938
100939
100940             tool.render = function(selection) {
100941                 var tooltipBehavior = tooltip()
100942                     .placement('bottom')
100943                     .html(true)
100944                     .title(function (d) {
100945                         return uiTooltipHtml(d.annotation() ?
100946                             t(d.id + '.tooltip', {action: d.annotation()}) :
100947                             t(d.id + '.nothing'), d.cmd);
100948                     });
100949
100950                 var buttons = selection.selectAll('button')
100951                     .data(commands)
100952                     .enter()
100953                     .append('button')
100954                     .attr('class', function(d) { return 'disabled ' + d.id + '-button bar-button'; })
100955                     .on('click', function(d) { return d.action(); })
100956                     .call(tooltipBehavior);
100957
100958                 buttons.each(function(d) {
100959                     var iconName = d.id;
100960                     if (textDirection === 'rtl') {
100961                         if (iconName === 'undo') {
100962                             iconName = 'redo';
100963                         } else if (iconName === 'redo') {
100964                             iconName = 'undo';
100965                         }
100966                     }
100967                     d3_select(this)
100968                         .call(svgIcon('#iD-icon-' + iconName));
100969                 });
100970
100971                 context.keybinding()
100972                     .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
100973                     .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
100974
100975
100976                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
100977
100978                 context.map()
100979                     .on('move.undo_redo', debouncedUpdate)
100980                     .on('drawn.undo_redo', debouncedUpdate);
100981
100982                 context.history()
100983                     .on('change.undo_redo', function(difference) {
100984                         if (difference) update();
100985                     });
100986
100987                 context
100988                     .on('enter.undo_redo', update);
100989
100990
100991                 function update() {
100992                     buttons
100993                         .property('disabled', !editable())
100994                         .classed('disabled', function(d) {
100995                             return !editable() || !d.annotation();
100996                         })
100997                         .each(function() {
100998                             var selection = d3_select(this);
100999                             if (selection.property('tooltipVisible')) {
101000                                 selection.call(tooltipBehavior.show);
101001                             }
101002                         });
101003                 }
101004             };
101005
101006             tool.uninstall = function() {
101007                 context.keybinding()
101008                     .off(commands[0].cmd)
101009                     .off(commands[1].cmd);
101010
101011                 context.map()
101012                     .on('move.undo_redo', null)
101013                     .on('drawn.undo_redo', null);
101014
101015                 context.history()
101016                     .on('change.undo_redo', null);
101017
101018                 context
101019                     .on('enter.undo_redo', null);
101020             };
101021
101022             return tool;
101023         }
101024
101025         function uiTopToolbar(context) {
101026
101027             var sidebarToggle = uiToolSidebarToggle(context),
101028                 modes = uiToolOldDrawModes(context),
101029                 //searchAdd = uiToolSearchAdd(context),
101030                 //addFavorite = uiToolAddFavorite(context),
101031                 //addRecent = uiToolAddRecent(context),
101032                 notes = uiToolNotes(context),
101033                 undoRedo = uiToolUndoRedo(context),
101034                 save = uiToolSave(context);
101035
101036             function notesEnabled() {
101037                 var noteLayer = context.layers().layer('notes');
101038                 return noteLayer && noteLayer.enabled();
101039             }
101040
101041             function topToolbar(bar) {
101042
101043                 var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
101044                 context.layers()
101045                     .on('change.topToolbar', debouncedUpdate);
101046
101047                 context.presets()
101048                     .on('favoritePreset.topToolbar', update)
101049                     .on('recentsChange.topToolbar', update);
101050
101051                 update();
101052
101053                 function update() {
101054
101055                     var tools = [
101056                         sidebarToggle,
101057                         'spacer',
101058                         modes
101059                     //    searchAdd
101060                     ];
101061                     /*
101062                     if (context.presets().getFavorites().length > 0) {
101063                         tools.push(addFavorite);
101064                     }
101065
101066                     if (addRecent.shouldShow()) {
101067                         tools.push(addRecent);
101068                     }*/
101069
101070                     tools.push('spacer');
101071
101072                     if (notesEnabled()) {
101073                         tools = tools.concat([notes, 'spacer']);
101074                     }
101075
101076                     tools = tools.concat([undoRedo, save]);
101077
101078                     var toolbarItems = bar.selectAll('.toolbar-item')
101079                         .data(tools, function(d) {
101080                             return d.id || d;
101081                         });
101082
101083                     toolbarItems.exit()
101084                         .each(function(d) {
101085                             if (d.uninstall) {
101086                                 d.uninstall();
101087                             }
101088                         })
101089                         .remove();
101090
101091                     var itemsEnter = toolbarItems
101092                         .enter()
101093                         .append('div')
101094                         .attr('class', function(d) {
101095                             var classes = 'toolbar-item ' + (d.id || d).replace('_', '-');
101096                             if (d.klass) classes += ' ' + d.klass;
101097                             return classes;
101098                         });
101099
101100                     var actionableItems = itemsEnter.filter(function(d) { return d !== 'spacer'; });
101101
101102                     actionableItems
101103                         .append('div')
101104                         .attr('class', 'item-content')
101105                         .each(function(d) {
101106                             d3_select(this).call(d.render, bar);
101107                         });
101108
101109                     actionableItems
101110                         .append('div')
101111                         .attr('class', 'item-label')
101112                         .text(function(d) {
101113                             return d.label;
101114                         });
101115                 }
101116
101117             }
101118
101119             return topToolbar;
101120         }
101121
101122         // these are module variables so they are preserved through a ui.restart()
101123         var sawVersion = null;
101124         var isNewVersion = false;
101125         var isNewUser = false;
101126
101127
101128         function uiVersion(context) {
101129
101130             var currVersion = context.version;
101131             var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
101132
101133             if (sawVersion === null && matchedVersion !== null) {
101134                 isNewVersion = (context.storage('sawVersion') !== currVersion);
101135                 isNewUser = !context.storage('sawSplash');
101136                 context.storage('sawVersion', currVersion);
101137                 sawVersion = currVersion;
101138             }
101139
101140             return function(selection) {
101141                 selection
101142                     .append('a')
101143                     .attr('target', '_blank')
101144                     .attr('tabindex', -1)
101145                     .attr('href', 'https://github.com/openstreetmap/iD')
101146                     .text(currVersion);
101147
101148                 // only show new version indicator to users that have used iD before
101149                 if (isNewVersion && !isNewUser) {
101150                     selection
101151                         .append('div')
101152                         .attr('class', 'badge')
101153                         .append('a')
101154                         .attr('target', '_blank')
101155                         .attr('tabindex', -1)
101156                         .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
101157                         .call(svgIcon('#maki-gift-11'))
101158                         .call(tooltip()
101159                             .title(t('version.whats_new', { version: currVersion }))
101160                             .placement('top')
101161                         );
101162                 }
101163             };
101164         }
101165
101166         function uiZoom(context) {
101167             var zooms = [{
101168                 id: 'zoom-in',
101169                 icon: 'plus',
101170                 title: t('zoom.in'),
101171                 action: context.zoomIn,
101172                 key: '+'
101173             }, {
101174                 id: 'zoom-out',
101175                 icon: 'minus',
101176                 title: t('zoom.out'),
101177                 action: context.zoomOut,
101178                 key: '-'
101179             }];
101180
101181
101182             function zoomIn() {
101183                 event.preventDefault();
101184                 context.zoomIn();
101185             }
101186
101187
101188             function zoomOut() {
101189                 event.preventDefault();
101190                 context.zoomOut();
101191             }
101192
101193
101194             function zoomInFurther() {
101195                 event.preventDefault();
101196                 context.zoomInFurther();
101197             }
101198
101199
101200             function zoomOutFurther() {
101201                 event.preventDefault();
101202                 context.zoomOutFurther();
101203             }
101204
101205
101206             return function(selection) {
101207                 var button = selection.selectAll('button')
101208                     .data(zooms)
101209                     .enter()
101210                     .append('button')
101211                     .attr('tabindex', -1)
101212                     .attr('class', function(d) { return d.id; })
101213                     .on('click.editor', function(d) { d.action(); })
101214                     .call(tooltip()
101215                         .placement((textDirection === 'rtl') ? 'right' : 'left')
101216                         .html(true)
101217                         .title(function(d) {
101218                             return uiTooltipHtml(d.title, d.key);
101219                         })
101220                     );
101221
101222                 button.each(function(d) {
101223                     d3_select(this)
101224                         .call(svgIcon('#iD-icon-' + d.icon, 'light'));
101225                 });
101226
101227                 ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
101228                     context.keybinding().on([key], zoomIn);
101229                     context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
101230                 });
101231
101232                 ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
101233                     context.keybinding().on([key], zoomOut);
101234                     context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
101235                 });
101236             };
101237         }
101238
101239         function uiInit(context) {
101240             var _initCounter = 0;
101241             var _initCallback;
101242             var _needWidth = {};
101243
101244
101245             function render(container) {
101246                 container
101247                     .attr('dir', textDirection);
101248
101249                 // setup fullscreen keybindings (no button shown at this time)
101250                 container
101251                     .call(uiFullScreen(context));
101252
101253                 var map = context.map();
101254                 map.redrawEnable(false);  // don't draw until we've set zoom/lat/long
101255
101256                 container
101257                     .append('svg')
101258                     .attr('id', 'defs')
101259                     .call(svgDefs(context));
101260
101261                 container
101262                     .append('div')
101263                     .attr('id', 'sidebar')
101264                     .call(ui.sidebar);
101265
101266                 var content = container
101267                     .append('div')
101268                     .attr('id', 'content')
101269                     .attr('class', 'active');
101270
101271                 // Top toolbar
101272                 content
101273                     .append('div')
101274                     .attr('id', 'bar')
101275                     .attr('class', 'fillD')
101276                     .call(uiTopToolbar(context));
101277
101278                 content
101279                     .append('div')
101280                     .attr('id', 'map')
101281                     .attr('dir', 'ltr')
101282                     .call(map);
101283
101284
101285                 // Map controls
101286                 var controls = content
101287                     .append('div')
101288                     .attr('class', 'map-controls');
101289
101290                 controls
101291                     .append('div')
101292                     .attr('class', 'map-control zoombuttons')
101293                     .call(uiZoom(context));
101294
101295                 controls
101296                     .append('div')
101297                     .attr('class', 'map-control geolocate-control')
101298                     .call(uiGeolocate(context));
101299
101300                 var background = uiBackground(context);
101301                 controls
101302                     .append('div')
101303                     .attr('class', 'map-control background-control')
101304                     .call(background.renderToggleButton);
101305
101306                 var mapData = uiMapData(context);
101307                 controls
101308                     .append('div')
101309                     .attr('class', 'map-control map-data-control')
101310                     .call(mapData.renderToggleButton);
101311
101312                 var issues = uiIssues(context);
101313                 controls
101314                     .append('div')
101315                     .attr('class', 'map-control map-issues-control')
101316                     .call(issues.renderToggleButton);
101317
101318                 var help = uiHelp(context);
101319                 controls
101320                     .append('div')
101321                     .attr('class', 'map-control help-control')
101322                     .call(help.renderToggleButton);
101323
101324                 content
101325                     .append('div')
101326                     .attr('class', 'spinner')
101327                     .call(uiSpinner(context));
101328
101329                 // Add attribution and footer
101330                 var about = content
101331                     .append('div')
101332                     .attr('id', 'about');
101333
101334                 about
101335                     .append('div')
101336                     .attr('id', 'attrib')
101337                     .attr('dir', 'ltr')
101338                     .call(uiAttribution(context));
101339
101340                 about
101341                     .append('div')
101342                     .attr('class', 'api-status')
101343                     .call(uiStatus(context));
101344
101345
101346                 var footer = about
101347                     .append('div')
101348                     .attr('id', 'footer')
101349                     .attr('class', 'fillD');
101350
101351                 footer
101352                     .append('div')
101353                     .attr('id', 'flash-wrap')
101354                     .attr('class', 'footer-hide');
101355
101356                 var footerWrap = footer
101357                     .append('div')
101358                     .attr('id', 'footer-wrap')
101359                     .attr('class', 'footer-show');
101360
101361                 footerWrap
101362                     .append('div')
101363                     .attr('id', 'scale-block')
101364                     .call(uiScale(context));
101365
101366                 var aboutList = footerWrap
101367                     .append('div')
101368                     .attr('id', 'info-block')
101369                     .append('ul')
101370                     .attr('id', 'about-list');
101371
101372                 if (!context.embed()) {
101373                     aboutList
101374                         .call(uiAccount(context));
101375                 }
101376
101377                 aboutList
101378                     .append('li')
101379                     .attr('class', 'version')
101380                     .call(uiVersion(context));
101381
101382                 var issueLinks = aboutList
101383                     .append('li');
101384
101385                 issueLinks
101386                     .append('a')
101387                     .attr('target', '_blank')
101388                     .attr('tabindex', -1)
101389                     .attr('href', 'https://github.com/openstreetmap/iD/issues')
101390                     .call(svgIcon('#iD-icon-bug', 'light'))
101391                     .call(tooltip().title(t('report_a_bug')).placement('top'));
101392
101393                 issueLinks
101394                     .append('a')
101395                     .attr('target', '_blank')
101396                     .attr('tabindex', -1)
101397                     .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
101398                     .call(svgIcon('#iD-icon-translate', 'light'))
101399                     .call(tooltip().title(t('help_translate')).placement('top'));
101400
101401                 aboutList
101402                     .append('li')
101403                     .attr('class', 'feature-warning')
101404                     .attr('tabindex', -1)
101405                     .call(uiFeatureInfo(context));
101406
101407                 aboutList
101408                     .append('li')
101409                     .attr('class', 'user-list')
101410                     .attr('tabindex', -1)
101411                     .call(uiContributors(context));
101412
101413
101414                 // Setup map dimensions and move map to initial center/zoom.
101415                 // This should happen after #content and toolbars exist.
101416                 ui.onResize();
101417                 map.redrawEnable(true);
101418
101419                 var hash = behaviorHash(context);
101420                 hash();
101421                 if (!hash.hadHash) {
101422                     map.centerZoom([0, 0], 2);
101423                 }
101424
101425
101426                 var overMap = content
101427                     .append('div')
101428                     .attr('class', 'over-map');
101429
101430                 // Add panes
101431                 // This should happen after map is initialized, as some require surface()
101432                 var panes = overMap
101433                     .append('div')
101434                     .attr('class', 'map-panes');
101435
101436                 panes
101437                     .call(background.renderPane)
101438                     .call(mapData.renderPane)
101439                     .call(issues.renderPane)
101440                     .call(help.renderPane);
101441
101442                 // Add absolutely-positioned elements that sit on top of the map
101443                 // This should happen after the map is ready (center/zoom)
101444                 overMap
101445                     .call(uiMapInMap(context))
101446                     .call(uiInfo(context))
101447                     .call(uiNotice(context));
101448
101449
101450                 overMap
101451                     .append('div')
101452                     .attr('id', 'photoviewer')
101453                     .classed('al', true)       // 'al'=left,  'ar'=right
101454                     .classed('hide', true)
101455                     .call(ui.photoviewer);
101456
101457
101458                 // Bind events
101459                 window.onbeforeunload = function() {
101460                     return context.save();
101461                 };
101462                 window.onunload = function() {
101463                     context.history().unlock();
101464                 };
101465
101466                 d3_select(window)
101467                     .on('gesturestart.editor', eventCancel)
101468                     .on('gesturechange.editor', eventCancel)
101469                     .on('gestureend.editor', eventCancel)
101470                     .on('resize.editor', ui.onResize);
101471
101472
101473                 var panPixels = 80;
101474                 context.keybinding()
101475                     .on('⌫', function() { event.preventDefault(); })
101476                     .on([t('sidebar.key'), '`', '²'], ui.sidebar.toggle)   // #5663 - common QWERTY, AZERTY
101477                     .on('←', pan([panPixels, 0]))
101478                     .on('↑', pan([0, panPixels]))
101479                     .on('→', pan([-panPixels, 0]))
101480                     .on('↓', pan([0, -panPixels]))
101481                     .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
101482                     .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
101483                     .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
101484                     .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
101485
101486                 context.enter(modeBrowse(context));
101487
101488                 if (!_initCounter++) {
101489                     if (!hash.startWalkthrough) {
101490                         context.container()
101491                             .call(uiSplash(context))
101492                             .call(uiRestore(context));
101493                     }
101494
101495                     context.container()
101496                         .call(uiShortcuts(context));
101497                 }
101498
101499                 var osm = context.connection();
101500                 var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
101501
101502                 if (osm && auth) {
101503                     osm
101504                         .on('authLoading.ui', function() {
101505                             context.container()
101506                                 .call(auth);
101507                         })
101508                         .on('authDone.ui', function() {
101509                             auth.close();
101510                         });
101511                 }
101512
101513                 _initCounter++;
101514
101515                 if (hash.startWalkthrough) {
101516                     hash.startWalkthrough = false;
101517                     context.container().call(uiIntro(context));
101518                 }
101519
101520
101521                 function pan(d) {
101522                     return function() {
101523                         if (d3_select('.combobox').size()) return;
101524                         event.preventDefault();
101525                         context.pan(d, 100);
101526                     };
101527                 }
101528
101529                 function eventCancel() {
101530                     event.preventDefault();
101531                 }
101532             }
101533
101534
101535             function ui(node, callback) {
101536                 _initCallback = callback;
101537                 var container = d3_select(node);
101538                 context.container(container);
101539                 context.loadLocale(function(err) {
101540                     if (!err) {
101541                         render(container);
101542                     }
101543                     if (callback) {
101544                         callback(err);
101545                     }
101546                 });
101547             }
101548
101549
101550             ui.restart = function(arg) {
101551                 context.keybinding().clear();
101552                 context.locale(arg);
101553                 context.loadLocale(function(err) {
101554                     if (!err) {
101555                         context.container().selectAll('*').remove();
101556                         render(context.container());
101557                         if (_initCallback) _initCallback();
101558                     }
101559                 });
101560             };
101561
101562
101563             ui.sidebar = uiSidebar(context);
101564
101565             ui.photoviewer = uiPhotoviewer(context);
101566
101567             ui.onResize = function(withPan) {
101568                 var map = context.map();
101569
101570                 // Recalc dimensions of map and sidebar.. (`true` = force recalc)
101571                 // This will call `getBoundingClientRect` and trigger reflow,
101572                 //  but the values will be cached for later use.
101573                 var mapDimensions = utilGetDimensions(d3_select('#content'), true);
101574                 utilGetDimensions(d3_select('#sidebar'), true);
101575
101576                 if (withPan !== undefined) {
101577                     map.redrawEnable(false);
101578                     map.pan(withPan);
101579                     map.redrawEnable(true);
101580                 }
101581                 map.dimensions(mapDimensions);
101582
101583                 ui.photoviewer.onMapResize();
101584
101585                 // check if header or footer have overflowed
101586                 ui.checkOverflow('#bar');
101587                 ui.checkOverflow('#footer');
101588
101589                 // Use outdated code so it works on Explorer
101590                 var resizeWindowEvent = document.createEvent('Event');
101591
101592                 resizeWindowEvent.initEvent('resizeWindow', true, true);
101593
101594                 document.dispatchEvent(resizeWindowEvent);
101595             };
101596
101597
101598             // Call checkOverflow when resizing or whenever the contents change.
101599             ui.checkOverflow = function(selector, reset) {
101600                 if (reset) {
101601                     delete _needWidth[selector];
101602                 }
101603
101604                 var element = d3_select(selector);
101605                 var scrollWidth = element.property('scrollWidth');
101606                 var clientWidth = element.property('clientWidth');
101607                 var needed = _needWidth[selector] || scrollWidth;
101608
101609                 if (scrollWidth > clientWidth) {    // overflow happening
101610                     element.classed('narrow', true);
101611                     if (!_needWidth[selector]) {
101612                         _needWidth[selector] = scrollWidth;
101613                     }
101614
101615                 } else if (scrollWidth >= needed) {
101616                     element.classed('narrow', false);
101617                 }
101618             };
101619
101620             ui.togglePanes = function(showPane) {
101621                 var shownPanes = d3_selectAll('.map-pane.shown');
101622
101623                 var side = textDirection === 'ltr' ? 'right' : 'left';
101624
101625                 shownPanes
101626                     .classed('shown', false);
101627
101628                 d3_selectAll('.map-control button')
101629                     .classed('active', false);
101630
101631                 if (showPane) {
101632                     shownPanes
101633                         .style('display', 'none')
101634                         .style(side, '-500px');
101635
101636                     d3_selectAll('.' + showPane.attr('pane') + '-control button')
101637                         .classed('active', true);
101638
101639                     showPane
101640                         .classed('shown', true)
101641                         .style('display', 'block');
101642                     if (shownPanes.empty()) {
101643                         showPane
101644                             .style('display', 'block')
101645                             .style(side, '-500px')
101646                             .transition()
101647                             .duration(200)
101648                             .style(side, '0px');
101649                     } else {
101650                         showPane
101651                             .style(side, '0px');
101652                     }
101653                 } else {
101654                     shownPanes
101655                         .style('display', 'block')
101656                         .style(side, '0px')
101657                         .transition()
101658                         .duration(200)
101659                         .style(side, '-500px')
101660                         .on('end', function() {
101661                             d3_select(this).style('display', 'none');
101662                         });
101663                 }
101664             };
101665
101666             return ui;
101667         }
101668
101669         function coreContext() {
101670             var dispatch$1 = dispatch('enter', 'exit', 'change');
101671             var context = utilRebind({}, dispatch$1, 'on');
101672             var _deferred = new Set();
101673
101674             context.version = '2.15.1';
101675
101676             // create a special translation that contains the keys in place of the strings
101677             var tkeys = JSON.parse(JSON.stringify(en));  // clone deep
101678             var parents = [];
101679
101680             function traverser(v, k, obj) {
101681                 parents.push(k);
101682                 if (typeof v === 'object') {
101683                     forOwn(v, traverser);
101684                 } else if (typeof v === 'string') {
101685                     obj[k] = parents.join('.');
101686                 }
101687                 parents.pop();
101688             }
101689
101690             function forOwn(obj, fn) {
101691                 Object.keys(obj).forEach(function(k) { fn(obj[k], k, obj); });
101692             }
101693
101694             forOwn(tkeys, traverser);
101695             addTranslation('_tkeys_', tkeys);
101696
101697             addTranslation('en', en);
101698             setLocale('en');
101699
101700
101701             // https://github.com/openstreetmap/iD/issues/772
101702             // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
101703             var storage;
101704             try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
101705             storage = storage || (function() {
101706                 var s = {};
101707                 return {
101708                     getItem: function(k) { return s[k]; },
101709                     setItem: function(k, v) { s[k] = v; },
101710                     removeItem: function(k) { delete s[k]; }
101711                 };
101712             })();
101713
101714             context.storage = function(k, v) {
101715                 try {
101716                     if (arguments.length === 1) return storage.getItem(k);
101717                     else if (v === null) storage.removeItem(k);
101718                     else storage.setItem(k, v);
101719                 } catch (e) {
101720                     // localstorage quota exceeded
101721                     /* eslint-disable no-console */
101722                     if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
101723                     /* eslint-enable no-console */
101724                 }
101725             };
101726
101727
101728             /* User interface and keybinding */
101729             var ui;
101730             context.ui = function() { return ui; };
101731
101732             var keybinding = utilKeybinding('context');
101733             context.keybinding = function() { return keybinding; };
101734             d3_select(document).call(keybinding);
101735
101736
101737             /* Straight accessors. Avoid using these if you can. */
101738             var connection, history, validator;
101739             context.connection = function() { return connection; };
101740             context.history = function() { return history; };
101741             context.validator = function() { return validator; };
101742
101743             /* Connection */
101744             context.preauth = function(options) {
101745                 if (connection) {
101746                     connection.switch(options);
101747                 }
101748                 return context;
101749             };
101750
101751
101752             function afterLoad(cid, callback) {
101753                 return function(err, result) {
101754                     if (err) {
101755                         // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
101756                         if (err.status === 400 || err.status === 401 || err.status === 403) {
101757                             if (connection) {
101758                                 connection.logout();
101759                             }
101760                         }
101761                         if (typeof callback === 'function') {
101762                             callback(err);
101763                         }
101764                         return;
101765
101766                     } else if (connection && connection.getConnectionId() !== cid) {
101767                         if (typeof callback === 'function') {
101768                             callback({ message: 'Connection Switched', status: -1 });
101769                         }
101770                         return;
101771
101772                     } else {
101773                         history.merge(result.data, result.extent);
101774                         if (typeof callback === 'function') {
101775                             callback(err, result);
101776                         }
101777                         return;
101778                     }
101779                 };
101780             }
101781
101782
101783             context.loadTiles = function(projection, callback) {
101784                 var handle = window.requestIdleCallback(function() {
101785                     _deferred.delete(handle);
101786                     if (connection && context.editable()) {
101787                         var cid = connection.getConnectionId();
101788                         connection.loadTiles(projection, afterLoad(cid, callback));
101789                     }
101790                 });
101791                 _deferred.add(handle);
101792             };
101793
101794             context.loadTileAtLoc = function(loc, callback) {
101795                 var handle = window.requestIdleCallback(function() {
101796                     _deferred.delete(handle);
101797                     if (connection && context.editable()) {
101798                         var cid = connection.getConnectionId();
101799                         connection.loadTileAtLoc(loc, afterLoad(cid, callback));
101800                     }
101801                 });
101802                 _deferred.add(handle);
101803             };
101804
101805             context.loadEntity = function(entityID, callback) {
101806                 if (connection) {
101807                     var cid = connection.getConnectionId();
101808                     connection.loadEntity(entityID, afterLoad(cid, callback));
101809                 }
101810             };
101811
101812             context.zoomToEntity = function(entityID, zoomTo) {
101813                 if (zoomTo !== false) {
101814                     this.loadEntity(entityID, function(err, result) {
101815                         if (err) return;
101816                         var entity = result.data.find(function(e) { return e.id === entityID; });
101817                         if (entity) {
101818                             map.zoomTo(entity);
101819                         }
101820                     });
101821                 }
101822
101823                 map.on('drawn.zoomToEntity', function() {
101824                     if (!context.hasEntity(entityID)) return;
101825                     map.on('drawn.zoomToEntity', null);
101826                     context.on('enter.zoomToEntity', null);
101827                     context.enter(modeSelect(context, [entityID]));
101828                 });
101829
101830                 context.on('enter.zoomToEntity', function() {
101831                     if (mode.id !== 'browse') {
101832                         map.on('drawn.zoomToEntity', null);
101833                         context.on('enter.zoomToEntity', null);
101834                     }
101835                 });
101836             };
101837
101838             var minEditableZoom = 16;
101839             context.minEditableZoom = function(val) {
101840                 if (!arguments.length) return minEditableZoom;
101841                 minEditableZoom = val;
101842                 if (connection) {
101843                     connection.tileZoom(val);
101844                 }
101845                 return context;
101846             };
101847
101848
101849             /* History */
101850             var inIntro = false;
101851             context.inIntro = function(val) {
101852                 if (!arguments.length) return inIntro;
101853                 inIntro = val;
101854                 return context;
101855             };
101856
101857             context.save = function() {
101858                 // no history save, no message onbeforeunload
101859                 if (inIntro || d3_select('.modal').size()) return;
101860
101861                 var canSave;
101862                 if (mode && mode.id === 'save') {
101863                     canSave = false;
101864
101865                     // Attempt to prevent user from creating duplicate changes - see #5200
101866                     if (services$1.osm && services$1.osm.isChangesetInflight()) {
101867                         history.clearSaved();
101868                         return;
101869                     }
101870
101871                 } else {
101872                     canSave = context.selectedIDs().every(function(id) {
101873                         var entity = context.hasEntity(id);
101874                         return entity && !entity.isDegenerate();
101875                     });
101876                 }
101877
101878                 if (canSave) {
101879                     history.save();
101880                 }
101881                 if (history.hasChanges()) {
101882                     return t('save.unsaved_changes');
101883                 }
101884             };
101885
101886
101887             /* Graph */
101888             context.hasEntity = function(id) {
101889                 return history.graph().hasEntity(id);
101890             };
101891             context.entity = function(id) {
101892                 return history.graph().entity(id);
101893             };
101894             context.childNodes = function(way) {
101895                 return history.graph().childNodes(way);
101896             };
101897             context.geometry = function(id) {
101898                 return context.entity(id).geometry(history.graph());
101899             };
101900
101901
101902             /* Modes */
101903             var mode;
101904             context.mode = function() {
101905                 return mode;
101906             };
101907             context.enter = function(newMode) {
101908                 if (mode) {
101909                     mode.exit();
101910                     dispatch$1.call('exit', this, mode);
101911                 }
101912
101913                 mode = newMode;
101914                 mode.enter();
101915                 dispatch$1.call('enter', this, mode);
101916             };
101917
101918             context.selectedIDs = function() {
101919                 if (mode && mode.selectedIDs) {
101920                     return mode.selectedIDs();
101921                 } else {
101922                     return [];
101923                 }
101924             };
101925
101926             context.activeID = function() {
101927                 return mode && mode.activeID && mode.activeID();
101928             };
101929
101930             var _selectedNoteID;
101931             context.selectedNoteID = function(noteID) {
101932                 if (!arguments.length) return _selectedNoteID;
101933                 _selectedNoteID = noteID;
101934                 return context;
101935             };
101936
101937             var _selectedErrorID;
101938             context.selectedErrorID = function(errorID) {
101939                 if (!arguments.length) return _selectedErrorID;
101940                 _selectedErrorID = errorID;
101941                 return context;
101942             };
101943
101944
101945             /* Behaviors */
101946             context.install = function(behavior) {
101947                 context.surface().call(behavior);
101948             };
101949             context.uninstall = function(behavior) {
101950                 context.surface().call(behavior.off);
101951             };
101952
101953
101954             /* Copy/Paste */
101955             var copyIDs = [], copyGraph;
101956             context.copyGraph = function() { return copyGraph; };
101957             context.copyIDs = function(val) {
101958                 if (!arguments.length) return copyIDs;
101959                 copyIDs = val;
101960                 copyGraph = history.graph();
101961                 return context;
101962             };
101963
101964
101965             /* Background */
101966             var background;
101967             context.background = function() { return background; };
101968
101969
101970             /* Features */
101971             var features;
101972             context.features = function() { return features; };
101973             context.hasHiddenConnections = function(id) {
101974                 var graph = history.graph();
101975                 var entity = graph.entity(id);
101976                 return features.hasHiddenConnections(entity, graph);
101977             };
101978
101979
101980             /* Photos */
101981             var photos;
101982             context.photos = function() { return photos; };
101983
101984
101985             /* Presets */
101986             var presets;
101987             context.presets = function() { return presets; };
101988
101989
101990             /* Map */
101991             var map;
101992             context.map = function() { return map; };
101993             context.layers = function() { return map.layers; };
101994             context.surface = function() { return map.surface; };
101995             context.editable = function() { return map.editable(); };
101996             context.surfaceRect = function() {
101997                 return map.surface.node().getBoundingClientRect();
101998             };
101999
102000
102001             /* Debug */
102002             var debugFlags = {
102003                 tile: false,        // tile boundaries
102004                 collision: false,   // label collision bounding boxes
102005                 imagery: false,     // imagery bounding polygons
102006                 community: false,   // community bounding polygons
102007                 imperial: false,    // imperial (not metric) bounding polygons
102008                 driveLeft: false,   // driveLeft bounding polygons
102009                 target: false,      // touch targets
102010                 downloaded: false   // downloaded data from osm
102011             };
102012             context.debugFlags = function() {
102013                 return debugFlags;
102014             };
102015             context.setDebug = function(flag, val) {
102016                 if (arguments.length === 1) val = true;
102017                 debugFlags[flag] = val;
102018                 dispatch$1.call('change');
102019                 return context;
102020             };
102021             context.getDebug = function(flag) {
102022                 return flag && debugFlags[flag];
102023             };
102024
102025
102026             /* Container */
102027             var container = d3_select(document.body);
102028             context.container = function(val) {
102029                 if (!arguments.length) return container;
102030                 container = val;
102031                 container.classed('id-container', true);
102032                 return context;
102033             };
102034             var embed;
102035             context.embed = function(val) {
102036                 if (!arguments.length) return embed;
102037                 embed = val;
102038                 return context;
102039             };
102040
102041
102042             /* Assets */
102043             var assetPath = '';
102044             context.assetPath = function(val) {
102045                 if (!arguments.length) return assetPath;
102046                 assetPath = val;
102047                 return context;
102048             };
102049
102050             var assetMap = {};
102051             context.assetMap = function(val) {
102052                 if (!arguments.length) return assetMap;
102053                 assetMap = val;
102054                 return context;
102055             };
102056
102057             context.asset = function(val) {
102058                 var filename = assetPath + val;
102059                 return assetMap[filename] || filename;
102060             };
102061
102062             context.imagePath = function(val) {
102063                 return context.asset('img/' + val);
102064             };
102065
102066
102067             /* locales */
102068             // `locale` variable contains a "requested locale".
102069             // It won't become the `currentLocale` until after loadLocale() is called.
102070             var locale, localePath;
102071
102072             context.locale = function(loc, path) {
102073                 if (!arguments.length) return currentLocale;
102074                 locale = loc;
102075                 localePath = path;
102076                 return context;
102077             };
102078
102079             context.loadLocale = function(callback) {
102080                 if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
102081                     localePath = localePath || context.asset('locales/' + locale + '.json');
102082                     d3_json(localePath)
102083                         .then(function(result) {
102084                             addTranslation(locale, result[locale]);
102085                             setLocale(locale);
102086                             utilDetect(true);
102087                             if (callback) callback();
102088                         })
102089                         .catch(function(err) {
102090                             if (callback) callback(err.message);
102091                         });
102092                 } else {
102093                     if (locale) {
102094                         setLocale(locale);
102095                         utilDetect(true);
102096                     }
102097                     if (callback) {
102098                         callback();
102099                     }
102100                 }
102101             };
102102
102103
102104             /* reset (aka flush) */
102105             context.reset = context.flush = function() {
102106                 context.debouncedSave.cancel();
102107
102108                 Array.from(_deferred).forEach(function(handle) {
102109                     window.cancelIdleCallback(handle);
102110                     _deferred.delete(handle);
102111                 });
102112
102113                 Object.values(services$1).forEach(function(service) {
102114                     if (service && typeof service.reset === 'function') {
102115                         service.reset(context);
102116                     }
102117                 });
102118
102119                 validator.reset();
102120                 features.reset();
102121                 history.reset();
102122
102123                 return context;
102124             };
102125
102126
102127             /* Init */
102128
102129             context.projection = geoRawMercator();
102130             context.curtainProjection = geoRawMercator();
102131
102132             locale = utilDetect().locale;
102133             if (locale && !dataLocales.hasOwnProperty(locale)) {
102134                 locale = locale.split('-')[0];
102135             }
102136
102137             history = coreHistory(context);
102138             validator = coreValidator(context);
102139
102140             context.graph = history.graph;
102141             context.changes = history.changes;
102142             context.intersects = history.intersects;
102143             context.pauseChangeDispatch = history.pauseChangeDispatch;
102144             context.resumeChangeDispatch = history.resumeChangeDispatch;
102145
102146             // Debounce save, since it's a synchronous localStorage write,
102147             // and history changes can happen frequently (e.g. when dragging).
102148             context.debouncedSave = debounce(context.save, 350);
102149             function withDebouncedSave(fn) {
102150                 return function() {
102151                     var result = fn.apply(history, arguments);
102152                     context.debouncedSave();
102153                     return result;
102154                 };
102155             }
102156
102157             context.perform = withDebouncedSave(history.perform);
102158             context.replace = withDebouncedSave(history.replace);
102159             context.pop = withDebouncedSave(history.pop);
102160             context.overwrite = withDebouncedSave(history.overwrite);
102161             context.undo = withDebouncedSave(history.undo);
102162             context.redo = withDebouncedSave(history.redo);
102163
102164             ui = uiInit(context);
102165
102166             connection = services$1.osm;
102167             background = rendererBackground(context);
102168             features = rendererFeatures(context);
102169             photos = rendererPhotos(context);
102170             presets = presetIndex(context);
102171
102172             if (services$1.maprules && utilStringQs(window.location.hash).maprules) {
102173                 var maprules = utilStringQs(window.location.hash).maprules;
102174                 d3_json(maprules)
102175                     .then(function(mapcss) {
102176                         services$1.maprules.init();
102177                         mapcss.forEach(function(mapcssSelector) {
102178                             return services$1.maprules.addRule(mapcssSelector);
102179                         });
102180                     })
102181                     .catch(function() {
102182                         /* ignore */
102183                     });
102184             }
102185
102186             map = rendererMap(context);
102187             context.mouse = map.mouse;
102188             context.extent = map.extent;
102189             context.pan = map.pan;
102190             context.zoomIn = map.zoomIn;
102191             context.zoomOut = map.zoomOut;
102192             context.zoomInFurther = map.zoomInFurther;
102193             context.zoomOutFurther = map.zoomOutFurther;
102194             context.redrawEnable = map.redrawEnable;
102195
102196             Object.values(services$1).forEach(function(service) {
102197                 if (service && typeof service.init === 'function') {
102198                     service.init(context);
102199                 }
102200             });
102201
102202             validator.init();
102203             background.init();
102204             features.init();
102205             photos.init();
102206
102207             if (utilStringQs(window.location.hash).presets) {
102208                 var external = utilStringQs(window.location.hash).presets;
102209                 presets.fromExternal(external, function(externalPresets) {
102210                     context.presets = function() { return externalPresets; }; // default + external presets...
102211                     osmSetAreaKeys(presets.areaKeys());
102212                     osmSetPointTags(presets.pointTags());
102213                     osmSetVertexTags(presets.vertexTags());
102214                 });
102215             } else {
102216                 presets.init();
102217                 osmSetAreaKeys(presets.areaKeys());
102218                 osmSetPointTags(presets.pointTags());
102219                 osmSetVertexTags(presets.vertexTags());
102220             }
102221
102222             return context;
102223         }
102224
102225         function uiSourceSwitch(context) {
102226             var keys;
102227
102228
102229             function click() {
102230                 event.preventDefault();
102231
102232                 var osm = context.connection();
102233                 if (!osm) return;
102234
102235                 if (context.inIntro()) return;
102236
102237                 if (context.history().hasChanges() &&
102238                     !window.confirm(t('source_switch.lose_changes'))) return;
102239
102240                 var isLive = d3_select(this)
102241                     .classed('live');
102242
102243                 isLive = !isLive;
102244                 context.enter(modeBrowse(context));
102245                 context.history().clearSaved();          // remove saved history
102246                 context.flush();                         // remove stored data
102247
102248                 d3_select(this)
102249                     .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
102250                     .classed('live', isLive);
102251
102252                 osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
102253             }
102254
102255             var sourceSwitch = function(selection) {
102256                 selection
102257                     .append('a')
102258                     .attr('href', '#')
102259                     .text(t('source_switch.live'))
102260                     .classed('live', true)
102261                     .attr('tabindex', -1)
102262                     .on('click', click);
102263             };
102264
102265
102266             sourceSwitch.keys = function(_) {
102267                 if (!arguments.length) return keys;
102268                 keys = _;
102269                 return sourceSwitch;
102270             };
102271
102272
102273             return sourceSwitch;
102274         }
102275
102276         var Connection = services$1.osm;
102277
102278         var debug = false;
102279
102280         var iD = /*#__PURE__*/Object.freeze({
102281                 Connection: Connection,
102282                 debug: debug,
102283                 d3: index$3,
102284                 Context: coreContext,
102285                 setAreaKeys: osmSetAreaKeys,
102286                 get areaKeys () { return osmAreaKeys; },
102287                 Difference: coreDifference,
102288                 Graph: coreGraph,
102289                 History: coreHistory,
102290                 Tree: coreTree,
102291                 geoCross: geoVecCross,
102292                 geoInterp: geoVecInterp,
102293                 geoRoundCoordinates: geoVecFloor,
102294                 geoEuclideanDistance: geoVecLength,
102295                 Entity: osmEntity,
102296                 Node: osmNode,
102297                 Relation: osmRelation,
102298                 Way: osmWay,
102299                 BackgroundSource: rendererBackgroundSource,
102300                 Background: rendererBackground,
102301                 Features: rendererFeatures,
102302                 Map: rendererMap,
102303                 TileLayer: rendererTileLayer,
102304                 Detect: utilDetect,
102305                 uiPreset: uiPresetEditor,
102306                 actionAddEntity: actionAddEntity,
102307                 actionAddMember: actionAddMember,
102308                 actionAddMidpoint: actionAddMidpoint,
102309                 actionAddVertex: actionAddVertex,
102310                 actionChangeMember: actionChangeMember,
102311                 actionChangePreset: actionChangePreset,
102312                 actionChangeTags: actionChangeTags,
102313                 actionCircularize: actionCircularize,
102314                 actionConnect: actionConnect,
102315                 actionCopyEntities: actionCopyEntities,
102316                 actionDeleteMember: actionDeleteMember,
102317                 actionDeleteMultiple: actionDeleteMultiple,
102318                 actionDeleteNode: actionDeleteNode,
102319                 actionDeleteRelation: actionDeleteRelation,
102320                 actionDeleteWay: actionDeleteWay,
102321                 actionDiscardTags: actionDiscardTags,
102322                 actionDisconnect: actionDisconnect,
102323                 actionExtract: actionExtract,
102324                 actionJoin: actionJoin,
102325                 actionMerge: actionMerge,
102326                 actionMergeNodes: actionMergeNodes,
102327                 actionMergePolygon: actionMergePolygon,
102328                 actionMergeRemoteChanges: actionMergeRemoteChanges,
102329                 actionMove: actionMove,
102330                 actionMoveMember: actionMoveMember,
102331                 actionMoveNode: actionMoveNode,
102332                 actionNoop: actionNoop,
102333                 actionOrthogonalize: actionOrthogonalize,
102334                 actionRestrictTurn: actionRestrictTurn,
102335                 actionReverse: actionReverse,
102336                 actionRevert: actionRevert,
102337                 actionRotate: actionRotate,
102338                 actionSplit: actionSplit,
102339                 actionStraightenNodes: actionStraightenNodes,
102340                 actionStraightenWay: actionStraightenWay,
102341                 actionUnrestrictTurn: actionUnrestrictTurn,
102342                 actionReflect: actionReflect,
102343                 actionUpgradeTags: actionUpgradeTags,
102344                 behaviorAddWay: behaviorAddWay,
102345                 behaviorBreathe: behaviorBreathe,
102346                 behaviorCopy: behaviorCopy,
102347                 behaviorDrag: behaviorDrag,
102348                 behaviorDrawWay: behaviorDrawWay,
102349                 behaviorDraw: behaviorDraw,
102350                 behaviorEdit: behaviorEdit,
102351                 behaviorHash: behaviorHash,
102352                 behaviorHover: behaviorHover,
102353                 behaviorLasso: behaviorLasso,
102354                 behaviorOperation: behaviorOperation,
102355                 behaviorPaste: behaviorPaste,
102356                 behaviorSelect: behaviorSelect,
102357                 behaviorTail: behaviorTail,
102358                 coreContext: coreContext,
102359                 coreDifference: coreDifference,
102360                 coreGraph: coreGraph,
102361                 coreHistory: coreHistory,
102362                 coreTree: coreTree,
102363                 coreValidator: coreValidator,
102364                 data: data,
102365                 dataWikipedia: wikipedia$2,
102366                 dataAddressFormats: dataAddressFormats,
102367                 dataDeprecated: dataDeprecated,
102368                 dataDiscarded: dataDiscarded,
102369                 dataLocales: dataLocales,
102370                 dataPhoneFormats: dataPhoneFormats,
102371                 dataShortcuts: dataShortcuts,
102372                 dataImperial: dataImperial,
102373                 dataDriveLeft: dataDriveLeft,
102374                 dataEn: en,
102375                 geoExtent: geoExtent,
102376                 geoLatToMeters: geoLatToMeters,
102377                 geoLonToMeters: geoLonToMeters,
102378                 geoMetersToLat: geoMetersToLat,
102379                 geoMetersToLon: geoMetersToLon,
102380                 geoMetersToOffset: geoMetersToOffset,
102381                 geoOffsetToMeters: geoOffsetToMeters,
102382                 geoScaleToZoom: geoScaleToZoom,
102383                 geoSphericalClosestNode: geoSphericalClosestNode,
102384                 geoSphericalDistance: geoSphericalDistance,
102385                 geoZoomToScale: geoZoomToScale,
102386                 geoAngle: geoAngle,
102387                 geoChooseEdge: geoChooseEdge,
102388                 geoEdgeEqual: geoEdgeEqual,
102389                 geoGetSmallestSurroundingRectangle: geoGetSmallestSurroundingRectangle,
102390                 geoHasLineIntersections: geoHasLineIntersections,
102391                 geoHasSelfIntersections: geoHasSelfIntersections,
102392                 geoRotate: geoRotate,
102393                 geoLineIntersection: geoLineIntersection,
102394                 geoPathHasIntersections: geoPathHasIntersections,
102395                 geoPathIntersections: geoPathIntersections,
102396                 geoPathLength: geoPathLength,
102397                 geoPointInPolygon: geoPointInPolygon,
102398                 geoPolygonContainsPolygon: geoPolygonContainsPolygon,
102399                 geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
102400                 geoViewportEdge: geoViewportEdge,
102401                 geoRawMercator: geoRawMercator,
102402                 geoVecAdd: geoVecAdd,
102403                 geoVecAngle: geoVecAngle,
102404                 geoVecCross: geoVecCross,
102405                 geoVecDot: geoVecDot,
102406                 geoVecEqual: geoVecEqual,
102407                 geoVecFloor: geoVecFloor,
102408                 geoVecInterp: geoVecInterp,
102409                 geoVecLength: geoVecLength,
102410                 geoVecNormalize: geoVecNormalize,
102411                 geoVecNormalizedDot: geoVecNormalizedDot,
102412                 geoVecProject: geoVecProject,
102413                 geoVecSubtract: geoVecSubtract,
102414                 geoVecScale: geoVecScale,
102415                 geoOrthoNormalizedDotProduct: geoOrthoNormalizedDotProduct,
102416                 geoOrthoCalcScore: geoOrthoCalcScore,
102417                 geoOrthoMaxOffsetAngle: geoOrthoMaxOffsetAngle,
102418                 geoOrthoCanOrthogonalize: geoOrthoCanOrthogonalize,
102419                 modeAddArea: modeAddArea,
102420                 modeAddLine: modeAddLine,
102421                 modeAddPoint: modeAddPoint,
102422                 modeAddNote: modeAddNote,
102423                 modeBrowse: modeBrowse,
102424                 modeDragNode: modeDragNode,
102425                 modeDragNote: modeDragNote,
102426                 modeDrawArea: modeDrawArea,
102427                 modeDrawLine: modeDrawLine,
102428                 modeMove: modeMove,
102429                 modeRotate: modeRotate,
102430                 modeSave: modeSave,
102431                 modeSelect: modeSelect,
102432                 modeSelectData: modeSelectData,
102433                 modeSelectError: modeSelectError,
102434                 modeSelectNote: modeSelectNote,
102435                 operationCircularize: operationCircularize,
102436                 operationContinue: operationContinue,
102437                 operationDelete: operationDelete,
102438                 operationDisconnect: operationDisconnect,
102439                 operationDowngrade: operationDowngrade,
102440                 operationExtract: operationExtract,
102441                 operationMerge: operationMerge,
102442                 operationMove: operationMove,
102443                 operationOrthogonalize: operationOrthogonalize,
102444                 operationReflectShort: operationReflectShort,
102445                 operationReflectLong: operationReflectLong,
102446                 operationReverse: operationReverse,
102447                 operationRotate: operationRotate,
102448                 operationSplit: operationSplit,
102449                 operationStraighten: operationStraighten,
102450                 osmChangeset: osmChangeset,
102451                 osmEntity: osmEntity,
102452                 osmNode: osmNode,
102453                 osmNote: osmNote,
102454                 osmRelation: osmRelation,
102455                 osmWay: osmWay,
102456                 qaError: qaError,
102457                 osmIntersection: osmIntersection,
102458                 osmTurn: osmTurn,
102459                 osmInferRestriction: osmInferRestriction,
102460                 osmLanes: osmLanes,
102461                 osmOldMultipolygonOuterMemberOfRelation: osmOldMultipolygonOuterMemberOfRelation,
102462                 osmIsOldMultipolygonOuterMember: osmIsOldMultipolygonOuterMember,
102463                 osmOldMultipolygonOuterMember: osmOldMultipolygonOuterMember,
102464                 osmJoinWays: osmJoinWays,
102465                 get osmAreaKeys () { return osmAreaKeys; },
102466                 osmSetAreaKeys: osmSetAreaKeys,
102467                 get osmPointTags () { return osmPointTags; },
102468                 osmSetPointTags: osmSetPointTags,
102469                 get osmVertexTags () { return osmVertexTags; },
102470                 osmSetVertexTags: osmSetVertexTags,
102471                 osmNodeGeometriesForTags: osmNodeGeometriesForTags,
102472                 osmOneWayTags: osmOneWayTags,
102473                 osmPavedTags: osmPavedTags,
102474                 osmIsInterestingTag: osmIsInterestingTag,
102475                 osmRoutableHighwayTagValues: osmRoutableHighwayTagValues,
102476                 osmFlowingWaterwayTagValues: osmFlowingWaterwayTagValues,
102477                 osmRailwayTrackTagValues: osmRailwayTrackTagValues,
102478                 presetCategory: presetCategory,
102479                 presetCollection: presetCollection,
102480                 presetField: presetField,
102481                 presetPreset: presetPreset,
102482                 presetIndex: presetIndex,
102483                 rendererBackgroundSource: rendererBackgroundSource,
102484                 rendererBackground: rendererBackground,
102485                 rendererFeatures: rendererFeatures,
102486                 rendererMap: rendererMap,
102487                 rendererPhotos: rendererPhotos,
102488                 rendererTileLayer: rendererTileLayer,
102489                 services: services$1,
102490                 serviceKeepRight: serviceKeepRight,
102491                 serviceImproveOSM: serviceImproveOSM,
102492                 serviceMapillary: serviceMapillary,
102493                 serviceMapRules: serviceMapRules,
102494                 serviceNominatim: serviceNominatim,
102495                 serviceOpenstreetcam: serviceOpenstreetcam,
102496                 serviceOsm: serviceOsm,
102497                 serviceOsmWikibase: serviceOsmWikibase,
102498                 serviceStreetside: serviceStreetside,
102499                 serviceTaginfo: serviceTaginfo,
102500                 serviceVectorTile: serviceVectorTile,
102501                 serviceWikidata: serviceWikidata,
102502                 serviceWikipedia: serviceWikipedia,
102503                 svgAreas: svgAreas,
102504                 svgData: svgData,
102505                 svgDebug: svgDebug,
102506                 svgDefs: svgDefs,
102507                 svgKeepRight: svgKeepRight,
102508                 svgIcon: svgIcon,
102509                 svgGeolocate: svgGeolocate,
102510                 svgLabels: svgLabels,
102511                 svgLayers: svgLayers,
102512                 svgLines: svgLines,
102513                 svgMapillaryImages: svgMapillaryImages,
102514                 svgMapillarySigns: svgMapillarySigns,
102515                 svgMidpoints: svgMidpoints,
102516                 svgNotes: svgNotes,
102517                 svgMarkerSegments: svgMarkerSegments,
102518                 svgOpenstreetcamImages: svgOpenstreetcamImages,
102519                 svgOsm: svgOsm,
102520                 svgPassiveVertex: svgPassiveVertex,
102521                 svgPath: svgPath,
102522                 svgPointTransform: svgPointTransform,
102523                 svgPoints: svgPoints,
102524                 svgRelationMemberTags: svgRelationMemberTags,
102525                 svgSegmentWay: svgSegmentWay,
102526                 svgStreetside: svgStreetside,
102527                 svgTagClasses: svgTagClasses,
102528                 svgTouch: svgTouch,
102529                 svgTurns: svgTurns,
102530                 svgVertices: svgVertices,
102531                 uiFields: uiFields,
102532                 uiFieldDefaultCheck: uiFieldCheck,
102533                 uiFieldOnewayCheck: uiFieldCheck,
102534                 uiFieldCheck: uiFieldCheck,
102535                 uiFieldMultiCombo: uiFieldCombo,
102536                 uiFieldNetworkCombo: uiFieldCombo,
102537                 uiFieldSemiCombo: uiFieldCombo,
102538                 uiFieldTypeCombo: uiFieldCombo,
102539                 uiFieldCombo: uiFieldCombo,
102540                 uiFieldUrl: uiFieldText,
102541                 uiFieldNumber: uiFieldText,
102542                 uiFieldTel: uiFieldText,
102543                 uiFieldEmail: uiFieldText,
102544                 uiFieldText: uiFieldText,
102545                 uiFieldAccess: uiFieldAccess,
102546                 uiFieldAddress: uiFieldAddress,
102547                 uiFieldCycleway: uiFieldCycleway,
102548                 uiFieldLanes: uiFieldLanes,
102549                 uiFieldLocalized: uiFieldLocalized,
102550                 uiFieldMaxspeed: uiFieldMaxspeed,
102551                 uiFieldStructureRadio: uiFieldRadio,
102552                 uiFieldRadio: uiFieldRadio,
102553                 uiFieldRestrictions: uiFieldRestrictions,
102554                 uiFieldTextarea: uiFieldTextarea,
102555                 uiFieldWikidata: uiFieldWikidata,
102556                 uiFieldWikipedia: uiFieldWikipedia,
102557                 uiIntro: uiIntro,
102558                 uiInfoPanels: uiInfoPanels,
102559                 uiPanelBackground: uiPanelBackground,
102560                 uiPanelHistory: uiPanelHistory,
102561                 uiPanelLocation: uiPanelLocation,
102562                 uiPanelMeasurement: uiPanelMeasurement,
102563                 uiSettingsCustomBackground: uiSettingsCustomBackground,
102564                 uiSettingsCustomData: uiSettingsCustomData,
102565                 uiInit: uiInit,
102566                 uiAccount: uiAccount,
102567                 uiAttribution: uiAttribution,
102568                 uiBackground: uiBackground,
102569                 uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
102570                 uiBackgroundOffset: uiBackgroundOffset,
102571                 uiChangesetEditor: uiChangesetEditor,
102572                 uiCmd: uiCmd,
102573                 uiCombobox: uiCombobox,
102574                 uiCommit: uiCommit,
102575                 uiCommitChanges: uiCommitChanges,
102576                 uiCommitWarnings: uiCommitWarnings,
102577                 uiConfirm: uiConfirm,
102578                 uiConflicts: uiConflicts,
102579                 uiContributors: uiContributors,
102580                 uiCurtain: uiCurtain,
102581                 uiDataEditor: uiDataEditor,
102582                 uiDataHeader: uiDataHeader,
102583                 uiDisclosure: uiDisclosure,
102584                 uiEditMenu: uiEditMenu,
102585                 uiEntityEditor: uiEntityEditor,
102586                 uiFeatureInfo: uiFeatureInfo,
102587                 uiFeatureList: uiFeatureList,
102588                 uiField: uiField,
102589                 uiFieldHelp: uiFieldHelp,
102590                 uiFlash: uiFlash,
102591                 uiFormFields: uiFormFields,
102592                 uiFullScreen: uiFullScreen,
102593                 uiGeolocate: uiGeolocate,
102594                 uiHelp: uiHelp,
102595                 uiImproveOsmComments: uiImproveOsmComments,
102596                 uiImproveOsmDetails: uiImproveOsmDetails,
102597                 uiImproveOsmEditor: uiImproveOsmEditor,
102598                 uiImproveOsmHeader: uiImproveOsmHeader,
102599                 uiInfo: uiInfo,
102600                 uiInspector: uiInspector,
102601                 uiKeepRightDetails: uiKeepRightDetails,
102602                 uiKeepRightEditor: uiKeepRightEditor,
102603                 uiKeepRightHeader: uiKeepRightHeader,
102604                 uiLasso: uiLasso,
102605                 uiLoading: uiLoading,
102606                 uiMapData: uiMapData,
102607                 uiMapInMap: uiMapInMap,
102608                 uiModal: uiModal,
102609                 uiNotice: uiNotice,
102610                 uiNoteComments: uiNoteComments,
102611                 uiNoteEditor: uiNoteEditor,
102612                 uiNoteHeader: uiNoteHeader,
102613                 uiNoteReport: uiNoteReport,
102614                 uiPresetEditor: uiPresetEditor,
102615                 uiPresetIcon: uiPresetIcon,
102616                 uiPresetList: uiPresetList,
102617                 uiQuickLinks: uiQuickLinks,
102618                 uiRadialMenu: uiRadialMenu,
102619                 uiRawMemberEditor: uiRawMemberEditor,
102620                 uiRawMembershipEditor: uiRawMembershipEditor,
102621                 uiRawTagEditor: uiRawTagEditor,
102622                 uiRestore: uiRestore,
102623                 uiScale: uiScale,
102624                 uiSelectionList: uiSelectionList,
102625                 uiSidebar: uiSidebar,
102626                 uiSourceSwitch: uiSourceSwitch,
102627                 uiSpinner: uiSpinner,
102628                 uiSplash: uiSplash,
102629                 uiStatus: uiStatus,
102630                 uiSuccess: uiSuccess,
102631                 uiTagReference: uiTagReference,
102632                 uiToggle: uiToggle,
102633                 uiTooltipHtml: uiTooltipHtml,
102634                 uiVersion: uiVersion,
102635                 uiViewOnOSM: uiViewOnOSM,
102636                 uiViewOnKeepRight: uiViewOnKeepRight,
102637                 uiZoom: uiZoom,
102638                 utilArrayChunk: utilArrayChunk,
102639                 utilArrayDifference: utilArrayDifference,
102640                 utilArrayFlatten: utilArrayFlatten,
102641                 utilArrayGroupBy: utilArrayGroupBy,
102642                 utilArrayIntersection: utilArrayIntersection,
102643                 utilArrayUnion: utilArrayUnion,
102644                 utilArrayUniq: utilArrayUniq,
102645                 utilArrayUniqBy: utilArrayUniqBy,
102646                 utilAsyncMap: utilAsyncMap,
102647                 utilCleanTags: utilCleanTags,
102648                 utilDetect: utilDetect,
102649                 utilDisplayName: utilDisplayName,
102650                 utilDisplayNameForPath: utilDisplayNameForPath,
102651                 utilDisplayType: utilDisplayType,
102652                 utilDisplayLabel: utilDisplayLabel,
102653                 utilEntityRoot: utilEntityRoot,
102654                 utilEditDistance: utilEditDistance,
102655                 utilEntitySelector: utilEntitySelector,
102656                 utilEntityOrMemberSelector: utilEntityOrMemberSelector,
102657                 utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
102658                 utilFastMouse: utilFastMouse,
102659                 utilFunctor: utilFunctor,
102660                 utilGetAllNodes: utilGetAllNodes,
102661                 utilGetSetValue: utilGetSetValue,
102662                 utilHashcode: utilHashcode,
102663                 utilHighlightEntities: utilHighlightEntities,
102664                 utilKeybinding: utilKeybinding,
102665                 utilNoAuto: utilNoAuto,
102666                 utilObjectOmit: utilObjectOmit,
102667                 utilPrefixCSSProperty: utilPrefixCSSProperty,
102668                 utilPrefixDOMProperty: utilPrefixDOMProperty,
102669                 utilPreset: utilPreset,
102670                 utilQsString: utilQsString,
102671                 utilRebind: utilRebind,
102672                 utilSetTransform: utilSetTransform,
102673                 utilSessionMutex: utilSessionMutex,
102674                 utilStringQs: utilStringQs,
102675                 utilTagDiff: utilTagDiff,
102676                 utilTagText: utilTagText,
102677                 utilTiler: utilTiler,
102678                 utilTriggerEvent: utilTriggerEvent,
102679                 utilWrap: utilWrap,
102680                 validationAlmostJunction: validationAlmostJunction,
102681                 validationCloseNodes: validationCloseNodes,
102682                 validationCrossingWays: validationCrossingWays,
102683                 validationDisconnectedWay: validationDisconnectedWay,
102684                 validationFixmeTag: validationFixmeTag,
102685                 validationGenericName: validationGenericName,
102686                 validationImpossibleOneway: validationImpossibleOneway,
102687                 validationIncompatibleSource: validationIncompatibleSource,
102688                 validationMaprules: validationMaprules,
102689                 validationMissingRole: validationMissingRole,
102690                 validationMissingTag: validationMissingTag,
102691                 validationOutdatedTags: validationOutdatedTags,
102692                 validationPrivateData: validationPrivateData,
102693                 validationTagSuggestsArea: validationTagSuggestsArea,
102694                 validationUnsquareWay: validationUnsquareWay
102695         });
102696
102697         // polyfill requestIdleCallback
102698         window.requestIdleCallback = window.requestIdleCallback ||
102699             function(cb) {
102700                 var start = Date.now();
102701                 return window.requestAnimationFrame(function() {
102702                     cb({
102703                         didTimeout: false,
102704                         timeRemaining: function() {
102705                             return Math.max(0, 50 - (Date.now() - start));
102706                         }
102707                     });
102708                 });
102709             };
102710
102711         window.cancelIdleCallback = window.cancelIdleCallback ||
102712             function(id) {
102713                 window.cancelAnimationFrame(id);
102714             };
102715         window.iD = iD;
102716
102717 }());
102718 //# sourceMappingURL=iD.js.map